From 339a2e89675445d3ade1c49249d271694ece89a0 Mon Sep 17 00:00:00 2001 From: Lars Francke Date: Fri, 11 Sep 2026 09:43:32 +0200 Subject: [PATCH 1/6] feat(hive): Restore the Thrift methods removed by HIVE-26537 for 4.2.0 Hive 4.0.1 removed get_table and get_table_objects_by_name from the metastore Thrift interface. Any client built against a Hive 2.3 metastore client still calls them, and that is what Spark bundles: 2.3.9 in Spark 3.5, 2.3.10 in Spark 4.0 through 4.2. Iceberg's HiveCatalog reaches the metastore through IMetaStoreClient and therefore uses whichever client Spark supplies, so an Iceberg job against a Hive 4.0.1 or newer metastore fails. This restores the methods as they were in Hive 4.0.0. --- CHANGELOG.md | 4 + hive/Dockerfile | 4 + ...-reactor-dependency-against-the-modu.patch | 130 + ...ecated-get_table-and-get_table_objec.patch | 2447 +++++++++++++++++ 4 files changed, 2585 insertions(+) create mode 100644 hive/stackable/patches/4.2.0/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch create mode 100644 hive/stackable/patches/4.2.0/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch diff --git a/CHANGELOG.md b/CHANGELOG.md index 602a64cf2..7ed40e8b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - nifi: Backport NIFI-15958 to log periodic progress while waiting for the content archive scan and provenance re-index, for `2.6.0`, `2.7.2`, and `2.9.0` ([#1611]). - hbase: Add an SBOM for the web UI (npm) dependencies, which are unpacked from webjars and therefore not covered by the CycloneDX Maven plugin ([#1620]). - trino: Add SBOMs for the web UI, both for the two npm projects behind it and for the pre-built JavaScript vendored into the source tree ([#1620]). +- hive: Restore the `get_table` and `get_table_objects_by_name` Thrift methods that HIVE-26537 removed in Hive 4.0.1, for `4.2.0` ([#1636]). - hadoop, spark: Add SBOMs for the pre-built JavaScript that is vendored into the source tree for the HDFS and Spark web UIs ([#1620]). ### Changed @@ -45,6 +46,8 @@ All notable changes to this project will be documented in this file. - hbase: Exclude the optional npm dependencies from the web UI SBOM ([#1630]). - airflow, superset: Create the Python SBOM from a separate environment, so that neither cyclonedx-bom nor its dependencies end up in the SBOM and in the image ([#1630]). - airflow, superset: Add the missing purl to the Airflow and Superset packages in the Python SBOM. They are installed from a locally built wheel, and without a purl they show up twice in the image SBOM ([#1630]). +- hive: Build against the Hive modules built alongside each other (in the same reactor) rather than the ones published on Maven Central, for `4.2.0`. + Upstream fixed one instance of this for Hive 4.3.0 in [HIVE-29827](https://issues.apache.org/jira/browse/HIVE-29827) but there are others. ([#1636]). ### Removed @@ -61,6 +64,7 @@ All notable changes to this project will be documented in this file. [#1623]: https://github.com/stackabletech/docker-images/pull/1623 [#1630]: https://github.com/stackabletech/docker-images/pull/1630 [#1635]: https://github.com/stackabletech/docker-images/pull/1635 +[#1636]: https://github.com/stackabletech/docker-images/pull/1636 ## [26.7.0] - 2026-07-21 diff --git a/hive/Dockerfile b/hive/Dockerfile index 35b85878c..ee1398ab7 100644 --- a/hive/Dockerfile +++ b/hive/Dockerfile @@ -83,9 +83,13 @@ elif [[ "${PRODUCT_VERSION}" == 4.0.* ]]; then ) else # Starting with 4.1.0 the build process changed again in https://github.com/apache/hive/pull/5936 (HIVE-29062) + # The main reactor pins its dependencies on the standalone-metastore modules through `standalone-metastore.version`. + # This is _not_ changed by `mvn versions:set` above. + # If we do not change it here it'd download those dependencies (without the -stackableXXXX suffix) from Maven central. mvn \ clean package \ -Dhadoop.version=${HADOOP_VERSION}-stackable${RELEASE_VERSION} \ + -Dstandalone-metastore.version=${NEW_VERSION} \ -DskipTests \ -Pdist # Looks like we can not filter the projects using "--projects standalone-metastore/metastore-server --also-make", diff --git a/hive/stackable/patches/4.2.0/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch b/hive/stackable/patches/4.2.0/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch new file mode 100644 index 000000000..eb508a72d --- /dev/null +++ b/hive/stackable/patches/4.2.0/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch @@ -0,0 +1,130 @@ +From a8aada47897543df0ba008655852e16aa5ede477 Mon Sep 17 00:00:00 2001 +From: Lars Francke +Date: Fri, 11 Sep 2026 14:48:51 +0200 +Subject: Resolve every in-reactor dependency against the modules built + alongside it + +standalone-metastore refers to several modules built in the same reactor through the literal +hive.version property rather than ${project.version}. +We use "mvn versions:set" to stamp our Stackable release version and we also expect Hive to +then honor that. This patch makes sure it does (plus a change in the Dockerfile) + +Upstream fixed one instance of this, the metastore-server to metastore-client reference, for +Hive 4.3.0: https://issues.apache.org/jira/browse/HIVE-29827. +--- + standalone-metastore/metastore-rest-catalog/pom.xml | 10 +++++----- + standalone-metastore/metastore-server/pom.xml | 2 +- + .../metastore-tools/metastore-benchmarks/pom.xml | 2 +- + standalone-metastore/metastore-tools/pom.xml | 2 +- + standalone-metastore/packaging/pom.xml | 6 +++--- + 5 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/standalone-metastore/metastore-rest-catalog/pom.xml b/standalone-metastore/metastore-rest-catalog/pom.xml +index ad6cecb535..8a4054422f 100644 +--- a/standalone-metastore/metastore-rest-catalog/pom.xml ++++ b/standalone-metastore/metastore-rest-catalog/pom.xml +@@ -34,31 +34,31 @@ + + org.apache.hive + hive-standalone-metastore-server +- ${hive.version} ++ ${project.version} + provided + + + org.apache.hive + hive-standalone-metastore-common +- ${hive.version} ++ ${project.version} + + + org.apache.hive + hive-iceberg-catalog +- ${hive.version} ++ ${project.version} + + + + org.apache.hive + hive-standalone-metastore-common +- ${hive.version} ++ ${project.version} + tests + test + + + org.apache.hive + hive-standalone-metastore-server +- ${hive.version} ++ ${project.version} + tests + test + +diff --git a/standalone-metastore/metastore-server/pom.xml b/standalone-metastore/metastore-server/pom.xml +index 0e24b3ebc9..5ffdb4047f 100644 +--- a/standalone-metastore/metastore-server/pom.xml ++++ b/standalone-metastore/metastore-server/pom.xml +@@ -28,7 +28,7 @@ + + org.apache.hive + hive-standalone-metastore-client +- ${hive.version} ++ ${project.version} + + + org.apache.httpcomponents +diff --git a/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml b/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml +index 44281104b1..b6a1037574 100644 +--- a/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml ++++ b/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml +@@ -46,7 +46,7 @@ + + org.apache.hive.hcatalog + hive-hcatalog-server-extensions +- ${hive.version} ++ ${project.version} + + + org.apache.zookeeper +diff --git a/standalone-metastore/metastore-tools/pom.xml b/standalone-metastore/metastore-tools/pom.xml +index 4da5ea9d44..b184241f3e 100644 +--- a/standalone-metastore/metastore-tools/pom.xml ++++ b/standalone-metastore/metastore-tools/pom.xml +@@ -39,7 +39,7 @@ + + org.apache.hive.hcatalog + hive-hcatalog-server-extensions +- ${hive.version} ++ ${project.version} + + + org.apache.zookeeper +diff --git a/standalone-metastore/packaging/pom.xml b/standalone-metastore/packaging/pom.xml +index 5a526cf722..733a203db6 100644 +--- a/standalone-metastore/packaging/pom.xml ++++ b/standalone-metastore/packaging/pom.xml +@@ -176,7 +176,7 @@ + + org.apache.hive + hive-metastore +- ${hive.version} ++ ${project.version} + + + org.apache.hive +@@ -192,13 +192,13 @@ + + org.apache.hive + hive-exec +- ${hive.version} ++ ${project.version} + core + + + org.apache.hive + hive-iceberg-handler +- ${hive.version} ++ ${project.version} + + + org.apache.hive diff --git a/hive/stackable/patches/4.2.0/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch b/hive/stackable/patches/4.2.0/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch new file mode 100644 index 000000000..5e113ab55 --- /dev/null +++ b/hive/stackable/patches/4.2.0/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch @@ -0,0 +1,2447 @@ +From d008322d70fa9285d70b3c29ea1ca17cf433e3b3 Mon Sep 17 00:00:00 2001 +From: Lars Francke +Date: Fri, 11 Sep 2026 14:53:53 +0200 +Subject: Restore the deprecated get_table and get_table_objects_by_name Thrift + methods + +HIVE-26537 removed five methods from the HMS Thrift interface in Hive 4.0.1. Two of them, +get_table and get_table_objects_by_name, are still called by any metastore client built +against Hive 2.3, which is what Spark bundles: 2.3.9 in Spark 3.5 and 2.3.10 in Spark 4.0 +through 4.2. Iceberg's HiveCatalog reaches the metastore through IMetaStoreClient and so +uses whichever client Spark supplies, which makes an Iceberg job against a Hive 4.0.1 or +newer metastore fail with + + TApplicationException: Invalid method name: 'get_table' + +The removal was a code cleanup and not any kind of fix and also no security issue. +--- + .../metastore/api/ThriftHiveMetastore.java | 2300 +++++++++++++++++ + .../src/main/thrift/hive_metastore.thrift | 13 + + .../hadoop/hive/metastore/HMSHandler.java | 18 + + 3 files changed, 2331 insertions(+) + +diff --git a/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java b/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java +index f2746b3582..4f3235f204 100644 +--- a/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java ++++ b/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java +@@ -583,6 +583,10 @@ package org.apache.hadoop.hive.metastore.api; + + public ReplayedTxnsForPolicyResult get_replayed_txns_for_policy(java.lang.String policyName) throws MetaException, org.apache.thrift.TException; + ++ public Table get_table(java.lang.String dbname, java.lang.String tbl_name) throws MetaException, NoSuchObjectException, org.apache.thrift.TException; ++ ++ public java.util.List get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException; ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public interface AsyncIface extends com.facebook.fb303.FacebookService .AsyncIface { +@@ -1155,6 +1159,10 @@ package org.apache.hadoop.hive.metastore.api; + + public void get_replayed_txns_for_policy(java.lang.String policyName, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; + ++ public void get_table(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException; ++ ++ public void get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException; ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Client extends com.facebook.fb303.FacebookService.Client implements Iface { +@@ -9202,6 +9210,60 @@ package org.apache.hadoop.hive.metastore.api; + throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_replayed_txns_for_policy failed: unknown result"); + } + ++ public Table get_table(java.lang.String dbname, java.lang.String tbl_name) throws MetaException, NoSuchObjectException, org.apache.thrift.TException ++ { ++ send_get_table(dbname, tbl_name); ++ return recv_get_table(); ++ } ++ ++ public void send_get_table(java.lang.String dbname, java.lang.String tbl_name) throws org.apache.thrift.TException ++ { ++ get_table_args args = new get_table_args(); ++ args.setDbname(dbname); ++ args.setTbl_name(tbl_name); ++ sendBase("get_table", args); ++ } ++ ++ public Table recv_get_table() throws MetaException, NoSuchObjectException, org.apache.thrift.TException ++ { ++ get_table_result result = new get_table_result(); ++ receiveBase(result, "get_table"); ++ if (result.isSetSuccess()) { ++ return result.success; ++ } ++ if (result.o1 != null) { ++ throw result.o1; ++ } ++ if (result.o2 != null) { ++ throw result.o2; ++ } ++ throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_table failed: unknown result"); ++ } ++ ++ public java.util.List
get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException ++ { ++ send_get_table_objects_by_name(dbname, tbl_names); ++ return recv_get_table_objects_by_name(); ++ } ++ ++ public void send_get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException ++ { ++ get_table_objects_by_name_args args = new get_table_objects_by_name_args(); ++ args.setDbname(dbname); ++ args.setTbl_names(tbl_names); ++ sendBase("get_table_objects_by_name", args); ++ } ++ ++ public java.util.List
recv_get_table_objects_by_name() throws org.apache.thrift.TException ++ { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ receiveBase(result, "get_table_objects_by_name"); ++ if (result.isSetSuccess()) { ++ return result.success; ++ } ++ throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_table_objects_by_name failed: unknown result"); ++ } ++ + } + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class AsyncClient extends com.facebook.fb303.FacebookService.AsyncClient implements AsyncIface { + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Factory implements org.apache.thrift.async.TAsyncClientFactory { +@@ -18809,6 +18871,76 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ public void get_table(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException { ++ checkReady(); ++ get_table_call method_call = new get_table_call(dbname, tbl_name, resultHandler, this, ___protocolFactory, ___transport); ++ this.___currentMethod = method_call; ++ ___manager.call(method_call); ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_call extends org.apache.thrift.async.TAsyncMethodCall
{ ++ private java.lang.String dbname; ++ private java.lang.String tbl_name; ++ public get_table_call(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { ++ super(client, protocolFactory, transport, resultHandler, false); ++ this.dbname = dbname; ++ this.tbl_name = tbl_name; ++ } ++ ++ public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { ++ prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("get_table", org.apache.thrift.protocol.TMessageType.CALL, 0)); ++ get_table_args args = new get_table_args(); ++ args.setDbname(dbname); ++ args.setTbl_name(tbl_name); ++ args.write(prot); ++ prot.writeMessageEnd(); ++ } ++ ++ public Table getResult() throws MetaException, NoSuchObjectException, org.apache.thrift.TException { ++ if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { ++ throw new java.lang.IllegalStateException("Method call not finished!"); ++ } ++ org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); ++ org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); ++ return (new Client(prot)).recv_get_table(); ++ } ++ } ++ ++ public void get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException { ++ checkReady(); ++ get_table_objects_by_name_call method_call = new get_table_objects_by_name_call(dbname, tbl_names, resultHandler, this, ___protocolFactory, ___transport); ++ this.___currentMethod = method_call; ++ ___manager.call(method_call); ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_call extends org.apache.thrift.async.TAsyncMethodCall> { ++ private java.lang.String dbname; ++ private java.util.List tbl_names; ++ public get_table_objects_by_name_call(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { ++ super(client, protocolFactory, transport, resultHandler, false); ++ this.dbname = dbname; ++ this.tbl_names = tbl_names; ++ } ++ ++ public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { ++ prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("get_table_objects_by_name", org.apache.thrift.protocol.TMessageType.CALL, 0)); ++ get_table_objects_by_name_args args = new get_table_objects_by_name_args(); ++ args.setDbname(dbname); ++ args.setTbl_names(tbl_names); ++ args.write(prot); ++ prot.writeMessageEnd(); ++ } ++ ++ public java.util.List
getResult() throws org.apache.thrift.TException { ++ if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { ++ throw new java.lang.IllegalStateException("Method call not finished!"); ++ } ++ org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); ++ org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); ++ return (new Client(prot)).recv_get_table_objects_by_name(); ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Processor extends com.facebook.fb303.FacebookService.Processor implements org.apache.thrift.TProcessor { +@@ -19106,6 +19238,8 @@ package org.apache.hadoop.hive.metastore.api; + processMap.put("drop_package", new drop_package()); + processMap.put("get_all_write_event_info", new get_all_write_event_info()); + processMap.put("get_replayed_txns_for_policy", new get_replayed_txns_for_policy()); ++ processMap.put("get_table", new get_table()); ++ processMap.put("get_table_objects_by_name", new get_table_objects_by_name()); + return processMap; + } + +@@ -27783,6 +27917,62 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table extends org.apache.thrift.ProcessFunction { ++ public get_table() { ++ super("get_table"); ++ } ++ ++ public get_table_args getEmptyArgsInstance() { ++ return new get_table_args(); ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ @Override ++ protected boolean rethrowUnhandledExceptions() { ++ return false; ++ } ++ ++ public get_table_result getResult(I iface, get_table_args args) throws org.apache.thrift.TException { ++ get_table_result result = new get_table_result(); ++ try { ++ result.success = iface.get_table(args.dbname, args.tbl_name); ++ } catch (MetaException o1) { ++ result.o1 = o1; ++ } catch (NoSuchObjectException o2) { ++ result.o2 = o2; ++ } ++ return result; ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name extends org.apache.thrift.ProcessFunction { ++ public get_table_objects_by_name() { ++ super("get_table_objects_by_name"); ++ } ++ ++ public get_table_objects_by_name_args getEmptyArgsInstance() { ++ return new get_table_objects_by_name_args(); ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ @Override ++ protected boolean rethrowUnhandledExceptions() { ++ return false; ++ } ++ ++ public get_table_objects_by_name_result getResult(I iface, get_table_objects_by_name_args args) throws org.apache.thrift.TException { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ result.success = iface.get_table_objects_by_name(args.dbname, args.tbl_names); ++ return result; ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class AsyncProcessor extends com.facebook.fb303.FacebookService.AsyncProcessor { +@@ -28080,6 +28270,8 @@ package org.apache.hadoop.hive.metastore.api; + processMap.put("drop_package", new drop_package()); + processMap.put("get_all_write_event_info", new get_all_write_event_info()); + processMap.put("get_replayed_txns_for_policy", new get_replayed_txns_for_policy()); ++ processMap.put("get_table", new get_table()); ++ processMap.put("get_table_objects_by_name", new get_table_objects_by_name()); + return processMap; + } + +@@ -47446,6 +47638,136 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table extends org.apache.thrift.AsyncProcessFunction { ++ public get_table() { ++ super("get_table"); ++ } ++ ++ public get_table_args getEmptyArgsInstance() { ++ return new get_table_args(); ++ } ++ ++ public org.apache.thrift.async.AsyncMethodCallback
getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { ++ final org.apache.thrift.AsyncProcessFunction fcall = this; ++ return new org.apache.thrift.async.AsyncMethodCallback
() { ++ public void onComplete(Table o) { ++ get_table_result result = new get_table_result(); ++ result.success = o; ++ try { ++ fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); ++ } catch (org.apache.thrift.transport.TTransportException e) { ++ _LOGGER.error("TTransportException writing to internal frame buffer", e); ++ fb.close(); ++ } catch (java.lang.Exception e) { ++ _LOGGER.error("Exception writing to internal frame buffer", e); ++ onError(e); ++ } ++ } ++ public void onError(java.lang.Exception e) { ++ byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; ++ org.apache.thrift.TSerializable msg; ++ get_table_result result = new get_table_result(); ++ if (e instanceof MetaException) { ++ result.o1 = (MetaException) e; ++ result.setO1IsSet(true); ++ msg = result; ++ } else if (e instanceof NoSuchObjectException) { ++ result.o2 = (NoSuchObjectException) e; ++ result.setO2IsSet(true); ++ msg = result; ++ } else if (e instanceof org.apache.thrift.transport.TTransportException) { ++ _LOGGER.error("TTransportException inside handler", e); ++ fb.close(); ++ return; ++ } else if (e instanceof org.apache.thrift.TApplicationException) { ++ _LOGGER.error("TApplicationException inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = (org.apache.thrift.TApplicationException)e; ++ } else { ++ _LOGGER.error("Exception inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); ++ } ++ try { ++ fcall.sendResponse(fb,msg,msgType,seqid); ++ } catch (java.lang.Exception ex) { ++ _LOGGER.error("Exception writing to internal frame buffer", ex); ++ fb.close(); ++ } ++ } ++ }; ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ public void start(I iface, get_table_args args, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException { ++ iface.get_table(args.dbname, args.tbl_name,resultHandler); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name extends org.apache.thrift.AsyncProcessFunction> { ++ public get_table_objects_by_name() { ++ super("get_table_objects_by_name"); ++ } ++ ++ public get_table_objects_by_name_args getEmptyArgsInstance() { ++ return new get_table_objects_by_name_args(); ++ } ++ ++ public org.apache.thrift.async.AsyncMethodCallback> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { ++ final org.apache.thrift.AsyncProcessFunction fcall = this; ++ return new org.apache.thrift.async.AsyncMethodCallback>() { ++ public void onComplete(java.util.List
o) { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ result.success = o; ++ try { ++ fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); ++ } catch (org.apache.thrift.transport.TTransportException e) { ++ _LOGGER.error("TTransportException writing to internal frame buffer", e); ++ fb.close(); ++ } catch (java.lang.Exception e) { ++ _LOGGER.error("Exception writing to internal frame buffer", e); ++ onError(e); ++ } ++ } ++ public void onError(java.lang.Exception e) { ++ byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; ++ org.apache.thrift.TSerializable msg; ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ if (e instanceof org.apache.thrift.transport.TTransportException) { ++ _LOGGER.error("TTransportException inside handler", e); ++ fb.close(); ++ return; ++ } else if (e instanceof org.apache.thrift.TApplicationException) { ++ _LOGGER.error("TApplicationException inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = (org.apache.thrift.TApplicationException)e; ++ } else { ++ _LOGGER.error("Exception inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); ++ } ++ try { ++ fcall.sendResponse(fb,msg,msgType,seqid); ++ } catch (java.lang.Exception ex) { ++ _LOGGER.error("Exception writing to internal frame buffer", ex); ++ fb.close(); ++ } ++ } ++ }; ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ public void start(I iface, get_table_objects_by_name_args args, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException { ++ iface.get_table_objects_by_name(args.dbname, args.tbl_names,resultHandler); ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class abort_Compactions_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { +@@ -322884,4 +323206,1982 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_args"); ++ ++ private static final org.apache.thrift.protocol.TField DBNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("dbname", org.apache.thrift.protocol.TType.STRING, (short)1); ++ private static final org.apache.thrift.protocol.TField TBL_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("tbl_name", org.apache.thrift.protocol.TType.STRING, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_argsStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_argsTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.lang.String dbname; // required ++ private @org.apache.thrift.annotation.Nullable java.lang.String tbl_name; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ DBNAME((short)1, "dbname"), ++ TBL_NAME((short)2, "tbl_name"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 1: // DBNAME ++ return DBNAME; ++ case 2: // TBL_NAME ++ return TBL_NAME; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.DBNAME, new org.apache.thrift.meta_data.FieldMetaData("dbname", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ tmpMap.put(_Fields.TBL_NAME, new org.apache.thrift.meta_data.FieldMetaData("tbl_name", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_args.class, metaDataMap); ++ } ++ ++ public get_table_args() { ++ } ++ ++ public get_table_args( ++ java.lang.String dbname, ++ java.lang.String tbl_name) ++ { ++ this(); ++ this.dbname = dbname; ++ this.tbl_name = tbl_name; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_args(get_table_args other) { ++ if (other.isSetDbname()) { ++ this.dbname = other.dbname; ++ } ++ if (other.isSetTbl_name()) { ++ this.tbl_name = other.tbl_name; ++ } ++ } ++ ++ public get_table_args deepCopy() { ++ return new get_table_args(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.dbname = null; ++ this.tbl_name = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getDbname() { ++ return this.dbname; ++ } ++ ++ public void setDbname(@org.apache.thrift.annotation.Nullable java.lang.String dbname) { ++ this.dbname = dbname; ++ } ++ ++ public void unsetDbname() { ++ this.dbname = null; ++ } ++ ++ /** Returns true if field dbname is set (has been assigned a value) and false otherwise */ ++ public boolean isSetDbname() { ++ return this.dbname != null; ++ } ++ ++ public void setDbnameIsSet(boolean value) { ++ if (!value) { ++ this.dbname = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getTbl_name() { ++ return this.tbl_name; ++ } ++ ++ public void setTbl_name(@org.apache.thrift.annotation.Nullable java.lang.String tbl_name) { ++ this.tbl_name = tbl_name; ++ } ++ ++ public void unsetTbl_name() { ++ this.tbl_name = null; ++ } ++ ++ /** Returns true if field tbl_name is set (has been assigned a value) and false otherwise */ ++ public boolean isSetTbl_name() { ++ return this.tbl_name != null; ++ } ++ ++ public void setTbl_nameIsSet(boolean value) { ++ if (!value) { ++ this.tbl_name = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case DBNAME: ++ if (value == null) { ++ unsetDbname(); ++ } else { ++ setDbname((java.lang.String)value); ++ } ++ break; ++ ++ case TBL_NAME: ++ if (value == null) { ++ unsetTbl_name(); ++ } else { ++ setTbl_name((java.lang.String)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case DBNAME: ++ return getDbname(); ++ ++ case TBL_NAME: ++ return getTbl_name(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case DBNAME: ++ return isSetDbname(); ++ case TBL_NAME: ++ return isSetTbl_name(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_args) ++ return this.equals((get_table_args)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_args that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_dbname = true && this.isSetDbname(); ++ boolean that_present_dbname = true && that.isSetDbname(); ++ if (this_present_dbname || that_present_dbname) { ++ if (!(this_present_dbname && that_present_dbname)) ++ return false; ++ if (!this.dbname.equals(that.dbname)) ++ return false; ++ } ++ ++ boolean this_present_tbl_name = true && this.isSetTbl_name(); ++ boolean that_present_tbl_name = true && that.isSetTbl_name(); ++ if (this_present_tbl_name || that_present_tbl_name) { ++ if (!(this_present_tbl_name && that_present_tbl_name)) ++ return false; ++ if (!this.tbl_name.equals(that.tbl_name)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetDbname()) ? 131071 : 524287); ++ if (isSetDbname()) ++ hashCode = hashCode * 8191 + dbname.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetTbl_name()) ? 131071 : 524287); ++ if (isSetTbl_name()) ++ hashCode = hashCode * 8191 + tbl_name.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_args other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetDbname(), other.isSetDbname()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetDbname()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dbname, other.dbname); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetTbl_name(), other.isSetTbl_name()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetTbl_name()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tbl_name, other.tbl_name); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_args("); ++ boolean first = true; ++ ++ sb.append("dbname:"); ++ if (this.dbname == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.dbname); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("tbl_name:"); ++ if (this.tbl_name == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.tbl_name); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_argsStandardScheme getScheme() { ++ return new get_table_argsStandardScheme(); ++ } ++ } ++ ++ private static class get_table_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 1: // DBNAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // TBL_NAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.tbl_name = iprot.readString(); ++ struct.setTbl_nameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_args struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.dbname != null) { ++ oprot.writeFieldBegin(DBNAME_FIELD_DESC); ++ oprot.writeString(struct.dbname); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.tbl_name != null) { ++ oprot.writeFieldBegin(TBL_NAME_FIELD_DESC); ++ oprot.writeString(struct.tbl_name); ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_argsTupleScheme getScheme() { ++ return new get_table_argsTupleScheme(); ++ } ++ } ++ ++ private static class get_table_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetDbname()) { ++ optionals.set(0); ++ } ++ if (struct.isSetTbl_name()) { ++ optionals.set(1); ++ } ++ oprot.writeBitSet(optionals, 2); ++ if (struct.isSetDbname()) { ++ oprot.writeString(struct.dbname); ++ } ++ if (struct.isSetTbl_name()) { ++ oprot.writeString(struct.tbl_name); ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(2); ++ if (incoming.get(0)) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } ++ if (incoming.get(1)) { ++ struct.tbl_name = iprot.readString(); ++ struct.setTbl_nameIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_result"); ++ ++ private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRUCT, (short)0); ++ private static final org.apache.thrift.protocol.TField O1_FIELD_DESC = new org.apache.thrift.protocol.TField("o1", org.apache.thrift.protocol.TType.STRUCT, (short)1); ++ private static final org.apache.thrift.protocol.TField O2_FIELD_DESC = new org.apache.thrift.protocol.TField("o2", org.apache.thrift.protocol.TType.STRUCT, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_resultStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_resultTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable Table success; // required ++ private @org.apache.thrift.annotation.Nullable MetaException o1; // required ++ private @org.apache.thrift.annotation.Nullable NoSuchObjectException o2; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ SUCCESS((short)0, "success"), ++ O1((short)1, "o1"), ++ O2((short)2, "o2"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 0: // SUCCESS ++ return SUCCESS; ++ case 1: // O1 ++ return O1; ++ case 2: // O2 ++ return O2; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, Table.class))); ++ tmpMap.put(_Fields.O1, new org.apache.thrift.meta_data.FieldMetaData("o1", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, MetaException.class))); ++ tmpMap.put(_Fields.O2, new org.apache.thrift.meta_data.FieldMetaData("o2", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, NoSuchObjectException.class))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_result.class, metaDataMap); ++ } ++ ++ public get_table_result() { ++ } ++ ++ public get_table_result( ++ Table success, ++ MetaException o1, ++ NoSuchObjectException o2) ++ { ++ this(); ++ this.success = success; ++ this.o1 = o1; ++ this.o2 = o2; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_result(get_table_result other) { ++ if (other.isSetSuccess()) { ++ this.success = new Table(other.success); ++ } ++ if (other.isSetO1()) { ++ this.o1 = new MetaException(other.o1); ++ } ++ if (other.isSetO2()) { ++ this.o2 = new NoSuchObjectException(other.o2); ++ } ++ } ++ ++ public get_table_result deepCopy() { ++ return new get_table_result(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.success = null; ++ this.o1 = null; ++ this.o2 = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public Table getSuccess() { ++ return this.success; ++ } ++ ++ public void setSuccess(@org.apache.thrift.annotation.Nullable Table success) { ++ this.success = success; ++ } ++ ++ public void unsetSuccess() { ++ this.success = null; ++ } ++ ++ /** Returns true if field success is set (has been assigned a value) and false otherwise */ ++ public boolean isSetSuccess() { ++ return this.success != null; ++ } ++ ++ public void setSuccessIsSet(boolean value) { ++ if (!value) { ++ this.success = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public MetaException getO1() { ++ return this.o1; ++ } ++ ++ public void setO1(@org.apache.thrift.annotation.Nullable MetaException o1) { ++ this.o1 = o1; ++ } ++ ++ public void unsetO1() { ++ this.o1 = null; ++ } ++ ++ /** Returns true if field o1 is set (has been assigned a value) and false otherwise */ ++ public boolean isSetO1() { ++ return this.o1 != null; ++ } ++ ++ public void setO1IsSet(boolean value) { ++ if (!value) { ++ this.o1 = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public NoSuchObjectException getO2() { ++ return this.o2; ++ } ++ ++ public void setO2(@org.apache.thrift.annotation.Nullable NoSuchObjectException o2) { ++ this.o2 = o2; ++ } ++ ++ public void unsetO2() { ++ this.o2 = null; ++ } ++ ++ /** Returns true if field o2 is set (has been assigned a value) and false otherwise */ ++ public boolean isSetO2() { ++ return this.o2 != null; ++ } ++ ++ public void setO2IsSet(boolean value) { ++ if (!value) { ++ this.o2 = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case SUCCESS: ++ if (value == null) { ++ unsetSuccess(); ++ } else { ++ setSuccess((Table)value); ++ } ++ break; ++ ++ case O1: ++ if (value == null) { ++ unsetO1(); ++ } else { ++ setO1((MetaException)value); ++ } ++ break; ++ ++ case O2: ++ if (value == null) { ++ unsetO2(); ++ } else { ++ setO2((NoSuchObjectException)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case SUCCESS: ++ return getSuccess(); ++ ++ case O1: ++ return getO1(); ++ ++ case O2: ++ return getO2(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case SUCCESS: ++ return isSetSuccess(); ++ case O1: ++ return isSetO1(); ++ case O2: ++ return isSetO2(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_result) ++ return this.equals((get_table_result)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_result that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_success = true && this.isSetSuccess(); ++ boolean that_present_success = true && that.isSetSuccess(); ++ if (this_present_success || that_present_success) { ++ if (!(this_present_success && that_present_success)) ++ return false; ++ if (!this.success.equals(that.success)) ++ return false; ++ } ++ ++ boolean this_present_o1 = true && this.isSetO1(); ++ boolean that_present_o1 = true && that.isSetO1(); ++ if (this_present_o1 || that_present_o1) { ++ if (!(this_present_o1 && that_present_o1)) ++ return false; ++ if (!this.o1.equals(that.o1)) ++ return false; ++ } ++ ++ boolean this_present_o2 = true && this.isSetO2(); ++ boolean that_present_o2 = true && that.isSetO2(); ++ if (this_present_o2 || that_present_o2) { ++ if (!(this_present_o2 && that_present_o2)) ++ return false; ++ if (!this.o2.equals(that.o2)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287); ++ if (isSetSuccess()) ++ hashCode = hashCode * 8191 + success.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetO1()) ? 131071 : 524287); ++ if (isSetO1()) ++ hashCode = hashCode * 8191 + o1.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetO2()) ? 131071 : 524287); ++ if (isSetO2()) ++ hashCode = hashCode * 8191 + o2.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_result other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetSuccess()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetO1(), other.isSetO1()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetO1()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.o1, other.o1); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetO2(), other.isSetO2()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetO2()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.o2, other.o2); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_result("); ++ boolean first = true; ++ ++ sb.append("success:"); ++ if (this.success == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.success); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("o1:"); ++ if (this.o1 == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.o1); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("o2:"); ++ if (this.o2 == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.o2); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ if (success != null) { ++ success.validate(); ++ } ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_resultStandardScheme getScheme() { ++ return new get_table_resultStandardScheme(); ++ } ++ } ++ ++ private static class get_table_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 0: // SUCCESS ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.success = new Table(); ++ struct.success.read(iprot); ++ struct.setSuccessIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 1: // O1 ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.o1 = new MetaException(); ++ struct.o1.read(iprot); ++ struct.setO1IsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // O2 ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.o2 = new NoSuchObjectException(); ++ struct.o2.read(iprot); ++ struct.setO2IsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_result struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.success != null) { ++ oprot.writeFieldBegin(SUCCESS_FIELD_DESC); ++ struct.success.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.o1 != null) { ++ oprot.writeFieldBegin(O1_FIELD_DESC); ++ struct.o1.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.o2 != null) { ++ oprot.writeFieldBegin(O2_FIELD_DESC); ++ struct.o2.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_resultTupleScheme getScheme() { ++ return new get_table_resultTupleScheme(); ++ } ++ } ++ ++ private static class get_table_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetSuccess()) { ++ optionals.set(0); ++ } ++ if (struct.isSetO1()) { ++ optionals.set(1); ++ } ++ if (struct.isSetO2()) { ++ optionals.set(2); ++ } ++ oprot.writeBitSet(optionals, 3); ++ if (struct.isSetSuccess()) { ++ struct.success.write(oprot); ++ } ++ if (struct.isSetO1()) { ++ struct.o1.write(oprot); ++ } ++ if (struct.isSetO2()) { ++ struct.o2.write(oprot); ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(3); ++ if (incoming.get(0)) { ++ struct.success = new Table(); ++ struct.success.read(iprot); ++ struct.setSuccessIsSet(true); ++ } ++ if (incoming.get(1)) { ++ struct.o1 = new MetaException(); ++ struct.o1.read(iprot); ++ struct.setO1IsSet(true); ++ } ++ if (incoming.get(2)) { ++ struct.o2 = new NoSuchObjectException(); ++ struct.o2.read(iprot); ++ struct.setO2IsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_objects_by_name_args"); ++ ++ private static final org.apache.thrift.protocol.TField DBNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("dbname", org.apache.thrift.protocol.TType.STRING, (short)1); ++ private static final org.apache.thrift.protocol.TField TBL_NAMES_FIELD_DESC = new org.apache.thrift.protocol.TField("tbl_names", org.apache.thrift.protocol.TType.LIST, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_objects_by_name_argsStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_objects_by_name_argsTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.lang.String dbname; // required ++ private @org.apache.thrift.annotation.Nullable java.util.List tbl_names; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ DBNAME((short)1, "dbname"), ++ TBL_NAMES((short)2, "tbl_names"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 1: // DBNAME ++ return DBNAME; ++ case 2: // TBL_NAMES ++ return TBL_NAMES; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.DBNAME, new org.apache.thrift.meta_data.FieldMetaData("dbname", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ tmpMap.put(_Fields.TBL_NAMES, new org.apache.thrift.meta_data.FieldMetaData("tbl_names", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_objects_by_name_args.class, metaDataMap); ++ } ++ ++ public get_table_objects_by_name_args() { ++ } ++ ++ public get_table_objects_by_name_args( ++ java.lang.String dbname, ++ java.util.List tbl_names) ++ { ++ this(); ++ this.dbname = dbname; ++ this.tbl_names = tbl_names; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_objects_by_name_args(get_table_objects_by_name_args other) { ++ if (other.isSetDbname()) { ++ this.dbname = other.dbname; ++ } ++ if (other.isSetTbl_names()) { ++ java.util.List __this__tbl_names = new java.util.ArrayList(other.tbl_names); ++ this.tbl_names = __this__tbl_names; ++ } ++ } ++ ++ public get_table_objects_by_name_args deepCopy() { ++ return new get_table_objects_by_name_args(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.dbname = null; ++ this.tbl_names = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getDbname() { ++ return this.dbname; ++ } ++ ++ public void setDbname(@org.apache.thrift.annotation.Nullable java.lang.String dbname) { ++ this.dbname = dbname; ++ } ++ ++ public void unsetDbname() { ++ this.dbname = null; ++ } ++ ++ /** Returns true if field dbname is set (has been assigned a value) and false otherwise */ ++ public boolean isSetDbname() { ++ return this.dbname != null; ++ } ++ ++ public void setDbnameIsSet(boolean value) { ++ if (!value) { ++ this.dbname = null; ++ } ++ } ++ ++ public int getTbl_namesSize() { ++ return (this.tbl_names == null) ? 0 : this.tbl_names.size(); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.Iterator getTbl_namesIterator() { ++ return (this.tbl_names == null) ? null : this.tbl_names.iterator(); ++ } ++ ++ public void addToTbl_names(java.lang.String elem) { ++ if (this.tbl_names == null) { ++ this.tbl_names = new java.util.ArrayList(); ++ } ++ this.tbl_names.add(elem); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.List getTbl_names() { ++ return this.tbl_names; ++ } ++ ++ public void setTbl_names(@org.apache.thrift.annotation.Nullable java.util.List tbl_names) { ++ this.tbl_names = tbl_names; ++ } ++ ++ public void unsetTbl_names() { ++ this.tbl_names = null; ++ } ++ ++ /** Returns true if field tbl_names is set (has been assigned a value) and false otherwise */ ++ public boolean isSetTbl_names() { ++ return this.tbl_names != null; ++ } ++ ++ public void setTbl_namesIsSet(boolean value) { ++ if (!value) { ++ this.tbl_names = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case DBNAME: ++ if (value == null) { ++ unsetDbname(); ++ } else { ++ setDbname((java.lang.String)value); ++ } ++ break; ++ ++ case TBL_NAMES: ++ if (value == null) { ++ unsetTbl_names(); ++ } else { ++ setTbl_names((java.util.List)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case DBNAME: ++ return getDbname(); ++ ++ case TBL_NAMES: ++ return getTbl_names(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case DBNAME: ++ return isSetDbname(); ++ case TBL_NAMES: ++ return isSetTbl_names(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_objects_by_name_args) ++ return this.equals((get_table_objects_by_name_args)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_objects_by_name_args that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_dbname = true && this.isSetDbname(); ++ boolean that_present_dbname = true && that.isSetDbname(); ++ if (this_present_dbname || that_present_dbname) { ++ if (!(this_present_dbname && that_present_dbname)) ++ return false; ++ if (!this.dbname.equals(that.dbname)) ++ return false; ++ } ++ ++ boolean this_present_tbl_names = true && this.isSetTbl_names(); ++ boolean that_present_tbl_names = true && that.isSetTbl_names(); ++ if (this_present_tbl_names || that_present_tbl_names) { ++ if (!(this_present_tbl_names && that_present_tbl_names)) ++ return false; ++ if (!this.tbl_names.equals(that.tbl_names)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetDbname()) ? 131071 : 524287); ++ if (isSetDbname()) ++ hashCode = hashCode * 8191 + dbname.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetTbl_names()) ? 131071 : 524287); ++ if (isSetTbl_names()) ++ hashCode = hashCode * 8191 + tbl_names.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_objects_by_name_args other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetDbname(), other.isSetDbname()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetDbname()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dbname, other.dbname); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetTbl_names(), other.isSetTbl_names()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetTbl_names()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tbl_names, other.tbl_names); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_objects_by_name_args("); ++ boolean first = true; ++ ++ sb.append("dbname:"); ++ if (this.dbname == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.dbname); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("tbl_names:"); ++ if (this.tbl_names == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.tbl_names); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_argsStandardScheme getScheme() { ++ return new get_table_objects_by_name_argsStandardScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 1: // DBNAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // TBL_NAMES ++ if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { ++ { ++ org.apache.thrift.protocol.TList _list2282 = iprot.readListBegin(); ++ struct.tbl_names = new java.util.ArrayList(_list2282.size); ++ @org.apache.thrift.annotation.Nullable java.lang.String _elem2283; ++ for (int _i2284 = 0; _i2284 < _list2282.size; ++_i2284) ++ { ++ _elem2283 = iprot.readString(); ++ struct.tbl_names.add(_elem2283); ++ } ++ iprot.readListEnd(); ++ } ++ struct.setTbl_namesIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.dbname != null) { ++ oprot.writeFieldBegin(DBNAME_FIELD_DESC); ++ oprot.writeString(struct.dbname); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.tbl_names != null) { ++ oprot.writeFieldBegin(TBL_NAMES_FIELD_DESC); ++ { ++ oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.tbl_names.size())); ++ for (java.lang.String _iter2285 : struct.tbl_names) ++ { ++ oprot.writeString(_iter2285); ++ } ++ oprot.writeListEnd(); ++ } ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_objects_by_name_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_argsTupleScheme getScheme() { ++ return new get_table_objects_by_name_argsTupleScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetDbname()) { ++ optionals.set(0); ++ } ++ if (struct.isSetTbl_names()) { ++ optionals.set(1); ++ } ++ oprot.writeBitSet(optionals, 2); ++ if (struct.isSetDbname()) { ++ oprot.writeString(struct.dbname); ++ } ++ if (struct.isSetTbl_names()) { ++ { ++ oprot.writeI32(struct.tbl_names.size()); ++ for (java.lang.String _iter2286 : struct.tbl_names) ++ { ++ oprot.writeString(_iter2286); ++ } ++ } ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(2); ++ if (incoming.get(0)) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } ++ if (incoming.get(1)) { ++ { ++ org.apache.thrift.protocol.TList _list2287 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRING); ++ struct.tbl_names = new java.util.ArrayList(_list2287.size); ++ @org.apache.thrift.annotation.Nullable java.lang.String _elem2288; ++ for (int _i2289 = 0; _i2289 < _list2287.size; ++_i2289) ++ { ++ _elem2288 = iprot.readString(); ++ struct.tbl_names.add(_elem2288); ++ } ++ } ++ struct.setTbl_namesIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_objects_by_name_result"); ++ ++ private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_objects_by_name_resultStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_objects_by_name_resultTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.util.List
success; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ SUCCESS((short)0, "success"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 0: // SUCCESS ++ return SUCCESS; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, Table.class)))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_objects_by_name_result.class, metaDataMap); ++ } ++ ++ public get_table_objects_by_name_result() { ++ } ++ ++ public get_table_objects_by_name_result( ++ java.util.List
success) ++ { ++ this(); ++ this.success = success; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_objects_by_name_result(get_table_objects_by_name_result other) { ++ if (other.isSetSuccess()) { ++ java.util.List
__this__success = new java.util.ArrayList
(other.success.size()); ++ for (Table other_element : other.success) { ++ __this__success.add(new Table(other_element)); ++ } ++ this.success = __this__success; ++ } ++ } ++ ++ public get_table_objects_by_name_result deepCopy() { ++ return new get_table_objects_by_name_result(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.success = null; ++ } ++ ++ public int getSuccessSize() { ++ return (this.success == null) ? 0 : this.success.size(); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.Iterator
getSuccessIterator() { ++ return (this.success == null) ? null : this.success.iterator(); ++ } ++ ++ public void addToSuccess(Table elem) { ++ if (this.success == null) { ++ this.success = new java.util.ArrayList
(); ++ } ++ this.success.add(elem); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.List
getSuccess() { ++ return this.success; ++ } ++ ++ public void setSuccess(@org.apache.thrift.annotation.Nullable java.util.List
success) { ++ this.success = success; ++ } ++ ++ public void unsetSuccess() { ++ this.success = null; ++ } ++ ++ /** Returns true if field success is set (has been assigned a value) and false otherwise */ ++ public boolean isSetSuccess() { ++ return this.success != null; ++ } ++ ++ public void setSuccessIsSet(boolean value) { ++ if (!value) { ++ this.success = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case SUCCESS: ++ if (value == null) { ++ unsetSuccess(); ++ } else { ++ setSuccess((java.util.List
)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case SUCCESS: ++ return getSuccess(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case SUCCESS: ++ return isSetSuccess(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_objects_by_name_result) ++ return this.equals((get_table_objects_by_name_result)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_objects_by_name_result that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_success = true && this.isSetSuccess(); ++ boolean that_present_success = true && that.isSetSuccess(); ++ if (this_present_success || that_present_success) { ++ if (!(this_present_success && that_present_success)) ++ return false; ++ if (!this.success.equals(that.success)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287); ++ if (isSetSuccess()) ++ hashCode = hashCode * 8191 + success.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_objects_by_name_result other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetSuccess()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_objects_by_name_result("); ++ boolean first = true; ++ ++ sb.append("success:"); ++ if (this.success == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.success); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_resultStandardScheme getScheme() { ++ return new get_table_objects_by_name_resultStandardScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 0: // SUCCESS ++ if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { ++ { ++ org.apache.thrift.protocol.TList _list2290 = iprot.readListBegin(); ++ struct.success = new java.util.ArrayList
(_list2290.size); ++ @org.apache.thrift.annotation.Nullable Table _elem2291; ++ for (int _i2292 = 0; _i2292 < _list2290.size; ++_i2292) ++ { ++ _elem2291 = new Table(); ++ _elem2291.read(iprot); ++ struct.success.add(_elem2291); ++ } ++ iprot.readListEnd(); ++ } ++ struct.setSuccessIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.success != null) { ++ oprot.writeFieldBegin(SUCCESS_FIELD_DESC); ++ { ++ oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); ++ for (Table _iter2293 : struct.success) ++ { ++ _iter2293.write(oprot); ++ } ++ oprot.writeListEnd(); ++ } ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_objects_by_name_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_resultTupleScheme getScheme() { ++ return new get_table_objects_by_name_resultTupleScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetSuccess()) { ++ optionals.set(0); ++ } ++ oprot.writeBitSet(optionals, 1); ++ if (struct.isSetSuccess()) { ++ { ++ oprot.writeI32(struct.success.size()); ++ for (Table _iter2294 : struct.success) ++ { ++ _iter2294.write(oprot); ++ } ++ } ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(1); ++ if (incoming.get(0)) { ++ { ++ org.apache.thrift.protocol.TList _list2295 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT); ++ struct.success = new java.util.ArrayList
(_list2295.size); ++ @org.apache.thrift.annotation.Nullable Table _elem2296; ++ for (int _i2297 = 0; _i2297 < _list2295.size; ++_i2297) ++ { ++ _elem2296 = new Table(); ++ _elem2296.read(iprot); ++ struct.success.add(_elem2296); ++ } ++ } ++ struct.setSuccessIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ + } +diff --git a/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift b/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift +index 32071a087b..57fe135d13 100644 +--- a/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift ++++ b/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift +@@ -3325,6 +3325,19 @@ PartitionsResponse get_partitions_req(1:PartitionsRequest req) + void drop_package(1: DropPackageRequest request) throws (1:MetaException o1) + list get_all_write_event_info(1: GetAllWriteEventInfoRequest request) throws (1:MetaException o1) + ReplayedTxnsForPolicyResult get_replayed_txns_for_policy(1: string policyName) throws (1: MetaException o1) ++ ++ // Restored for wire compatibility with metastore clients built against Hive 2.3, ++ // which is what Spark bundles. HIVE-26537 removed these two methods in 4.0.1 as a ++ // code cleanup; the request-based variants below are their replacements and both ++ // entry points share one implementation. ++ // ++ // Appended at the end of the service block on purpose: thrift numbers its generated ++ // local variables in declaration order, so inserting these where they used to live ++ // renumbers thousands of unrelated lines in the checked-in generated sources. ++ // Dispatch is by name, so the position has no effect on the wire. ++ Table get_table(1:string dbname, 2:string tbl_name) ++ throws (1:MetaException o1, 2:NoSuchObjectException o2) ++ list
get_table_objects_by_name(1:string dbname, 2:list tbl_names) + } + + // * Note about the DDL_TIME: When creating or altering a table or a partition, +diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java +index 7ab569383a..40bbc51571 100644 +--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java ++++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java +@@ -3632,6 +3632,16 @@ public class HMSHandler extends FacebookBase implements IHMSHandler { + return extTable; + } + ++ @Override ++ @Deprecated ++ public Table get_table(final String dbname, final String name) throws MetaException, ++ NoSuchObjectException { ++ String[] parsedDbName = parseDbName(dbname, conf); ++ GetTableRequest getTableRequest = new GetTableRequest(parsedDbName[DB_NAME],name); ++ getTableRequest.setCatName(parsedDbName[CAT_NAME]); ++ return getTableInternal(getTableRequest); ++ } ++ + @Override + public GetTableResult get_table_req(GetTableRequest req) throws MetaException, + NoSuchObjectException { +@@ -3774,6 +3784,14 @@ public class HMSHandler extends FacebookBase implements IHMSHandler { + * @throws UnknownDBException + */ + ++ @Override ++ @Deprecated ++ public List
get_table_objects_by_name(final String dbName, final List tableNames) ++ throws MetaException, InvalidOperationException, UnknownDBException { ++ String[] parsedDbName = parseDbName(dbName, conf); ++ return getTableObjectsInternal(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableNames, null, null, null); ++ } ++ + @Override + public GetTablesResult get_table_objects_by_name_req(GetTablesRequest req) throws TException { + String catName = req.isSetCatName() ? req.getCatName() : getDefaultCatalog(conf); From b9ebe29d048d7a136bbc6d28260b278342c0a2f4 Mon Sep 17 00:00:00 2001 From: Lukas Krug Date: Mon, 14 Sep 2026 12:43:40 +0000 Subject: [PATCH 2/6] fix(opa,statsd-exporter): Detect the Go dependency licenses (#1639) fix(opa,statsd-exporter): Detect the Go dependency licenses and report modules instead of packages --- CHANGELOG.md | 5 +++++ opa/Dockerfile | 18 +++++++++++++++--- opa/boil-config.toml | 3 +++ shared/statsd-exporter/Dockerfile | 8 +++++++- shared/statsd-exporter/boil-config.toml | 5 +++-- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 602a64cf2..f70b55842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - opensearch-dashboards: Bump cdxgen to 13.0.1 and pin the CycloneDX spec version to 1.6 ([#1600]). +- opa, statsd-exporter: Bump cyclonedx-gomod to 1.12.0 ([#1638]). ### Fixed @@ -45,6 +46,9 @@ All notable changes to this project will be documented in this file. - hbase: Exclude the optional npm dependencies from the web UI SBOM ([#1630]). - airflow, superset: Create the Python SBOM from a separate environment, so that neither cyclonedx-bom nor its dependencies end up in the SBOM and in the image ([#1630]). - airflow, superset: Add the missing purl to the Airflow and Superset packages in the Python SBOM. They are installed from a locally built wheel, and without a purl they show up twice in the image SBOM ([#1630]). +- opa, statsd-exporter: Detect the licenses of the Go dependencies ([#1638]). +- opa, statsd-exporter: Report the Go dependencies at module level instead of package and file + level ([#1638]). ### Removed @@ -61,6 +65,7 @@ All notable changes to this project will be documented in this file. [#1623]: https://github.com/stackabletech/docker-images/pull/1623 [#1630]: https://github.com/stackabletech/docker-images/pull/1630 [#1635]: https://github.com/stackabletech/docker-images/pull/1635 +[#1638]: https://github.com/stackabletech/docker-images/pull/1638 ## [26.7.0] - 2026-07-21 diff --git a/opa/Dockerfile b/opa/Dockerfile index 711b569df..cb1f3bc85 100644 --- a/opa/Dockerfile +++ b/opa/Dockerfile @@ -39,6 +39,7 @@ EOF FROM local-image/stackable-devel AS opa-builder +ARG CYCLONEDX_GOMOD_VERSION ARG PRODUCT_VERSION ARG RELEASE_VERSION ARG STACKABLE_USER_UID @@ -71,8 +72,7 @@ COPY --chown=${STACKABLE_USER_UID}:0 opa/stackable/patches/${PRODUCT_VERSION} /s WORKDIR /stackable RUN <= 1.23.1) -go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@v1.7.0 +go install "github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@v${CYCLONEDX_GOMOD_VERSION}" cd "$(/stackable/patchable --images-repo-root=src checkout opa ${PRODUCT_VERSION})" @@ -93,7 +93,19 @@ git commit --allow-empty --message "Fake commit, so that we can create a tag" git tag "v${NEW_VERSION}" go build -o opa -buildmode=exe # move artifact to /stackable/*/ to copy in final image -~/go/bin/cyclonedx-gomod app -json -output-version 1.5 -output /stackable/opa/"opa_${NEW_VERSION}.cdx.json" -packages -files +# -licenses detects the license of every module from the LICENSE file in the +# module cache, and -assert-licenses puts the result into `licenses` instead of +# `evidence`. syft and mergebom only read `licenses`, so without +# -assert-licenses none of it reaches the published image SBOM. +# -packages and -files are deliberately not used. They describe the module at Go +# package and file level, which multiplies the component count without adding anything +# a vulnerability scanner can use. +# -std is not used either: cyclonedx-gomod emits the standard library as +# `pkg:golang/std@` without a license, while syft already reports it +# as `pkg:golang/stdlib@` with BSD-3-Clause. The purls differ, so +# mergebom cannot deduplicate them and the image would carry a license-less +# duplicate. +~/go/bin/cyclonedx-gomod app -json -output-version 1.5 -licenses -assert-licenses -output /stackable/opa/"opa_${NEW_VERSION}.cdx.json" sed -i "s/${NEW_VERSION}/${ORIGINAL_VERSION}/g" /stackable/opa/"opa_${NEW_VERSION}.cdx.json" # move artifact to /stackable/* to copy in final image mv opa /stackable/opa/ diff --git a/opa/boil-config.toml b/opa/boil-config.toml index 937256f45..411cb044b 100644 --- a/opa/boil-config.toml +++ b/opa/boil-config.toml @@ -3,6 +3,9 @@ [build-arguments] golang-version = "1.26.0" +# Find the latest version here: https://github.com/CycloneDX/cyclonedx-gomod/releases +# renovate: datasource=github-releases packageName=CycloneDX/cyclonedx-gomod +cyclonedx-gomod-version = "1.12.0" # Version 1.12.3 [versions."1.12.3".local-images] diff --git a/shared/statsd-exporter/Dockerfile b/shared/statsd-exporter/Dockerfile index 5b0210b4b..75f83092d 100644 --- a/shared/statsd-exporter/Dockerfile +++ b/shared/statsd-exporter/Dockerfile @@ -57,7 +57,13 @@ go install "github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@v${CYCLONED git commit --allow-empty --message "Fake commit, so that we can create a tag" git tag "v${PRODUCT_VERSION}" go build -o /statsd_exporter/statsd_exporter - $GOPATH/bin/cyclonedx-gomod app -json -output-version 1.5 -output /statsd_exporter/statsd_exporter-${PRODUCT_VERSION}.cdx.json -packages -files + # -licenses detects the license of every module from the LICENSE file in the + # module cache, and -assert-licenses puts the result into `licenses` instead of + # `evidence`. syft and mergebom only read `licenses`, so without + # -assert-licenses none of it reaches the published image SBOM. + # -packages, -files and -std are deliberately not used, see the longer + # explanation in opa/Dockerfile. + $GOPATH/bin/cyclonedx-gomod app -json -output-version 1.5 -licenses -assert-licenses -output /statsd_exporter/statsd_exporter-${PRODUCT_VERSION}.cdx.json ) rm -rf "statsd_exporter-${PRODUCT_VERSION}" # set correct groups diff --git a/shared/statsd-exporter/boil-config.toml b/shared/statsd-exporter/boil-config.toml index fda4617e2..db472410d 100644 --- a/shared/statsd-exporter/boil-config.toml +++ b/shared/statsd-exporter/boil-config.toml @@ -7,8 +7,9 @@ # Mirror golang (no `v` prefix) via https://github.com/stackabletech/docker-images/actions/workflows/mirror.yaml # Note: currently mirrored to the `sdp` project, but should probably move elsewhere. golang-version = "1.25.11" -# We use version 1.7.0, since a newer version of cyclonedx-gomod is not compatible with the version of Golang (>= 1.23.1) -cyclonedx-gomod-version = "1.7.0" +# Find the latest version here: https://github.com/CycloneDX/cyclonedx-gomod/releases +# renovate: datasource=github-releases packageName=CycloneDX/cyclonedx-gomod +cyclonedx-gomod-version = "1.12.0" [versions."0.30.0".local-images] stackable-devel = "1.0.0" From b0fae198cf8f8420c3e6bf7623ad89965efd20e7 Mon Sep 17 00:00:00 2001 From: Lars Francke Date: Mon, 14 Sep 2026 15:50:38 +0000 Subject: [PATCH 3/6] fix(patchable): Fail when the mirror rejects the pushed base ref (#1640) * fix(patchable): Fail when the mirror rejects the pushed base ref libgit2 reports a reference the remote refused through the push_update_reference callback rather than by failing the push, so `init version --mirror` logged success and wrote a patchable.toml with a mirror that never received anything. --ssh selects a transport for a single invocation, but its rewritten URL was stored in patchable.toml, which forces SSH on everyone who checks that file out and makes `checkout --ssh` fail because the stored URL has no https scheme. An existing configuration is now detected before the fetch and the push, so a re-run fails immediately instead of mirroring and then refusing to overwrite. The fmt layer wrote to stderr directly instead of through the IndicatifLayer, so log lines were printed on top of a progress bar that was never cleared. * chore: Bump libssh2-sys to 0.3.3 0.3.2 is yanked, which fails the cargo-deny advisories check. It is reached through git2, so both boil and patchable depend on it. --- Cargo.lock | 4 +-- rust/patchable/src/main.rs | 74 ++++++++++++++++++++++++++++++-------- rust/patchable/src/repo.rs | 22 +++++++----- 3 files changed, 76 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 278d32207..0c4c01652 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1074,9 +1074,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libssh2-sys" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04141a07bb0c0bc461cb657808764de571702a59bc5c726c400ac9a7625e3ab" +checksum = "0f5eb74291e8691cab524a01274a1b1e7742b1a94f29d8b101d8aadc8372c1cd" dependencies = [ "cc", "libc", diff --git a/rust/patchable/src/main.rs b/rust/patchable/src/main.rs index 949407e3a..ce5e02599 100644 --- a/rust/patchable/src/main.rs +++ b/rust/patchable/src/main.rs @@ -6,9 +6,11 @@ mod utils; use core::str; use std::{ + cell::RefCell, fs::File, io::{IsTerminal, Write}, path::PathBuf, + rc::Rc, }; use git2::{Oid, Repository}; @@ -270,6 +272,8 @@ pub enum Error { source: std::io::Error, path: PathBuf, }, + #[snafu(display("configuration already exists at {path:?}, delete it to re-run init"))] + VersionConfigExists { path: PathBuf }, #[snafu(display("failed to rewrite URL for SSH"))] UrlRewrite { source: utils::UrlRewriteError }, @@ -287,6 +291,12 @@ pub enum Error { refspec: String, commit: Oid, }, + #[snafu(display("mirror {url:?} rejected the update of {reference}: {reason}"))] + MirrorRejectedPush { + url: String, + reference: String, + reason: String, + }, #[snafu(display("failed to find images repository"))] FindImagesRepo { source: repo::Error }, @@ -330,13 +340,16 @@ type Result = std::result::Result; #[snafu::report] fn main() -> Result<()> { + // The fmt layer must write through the IndicatifLayer. + // Writing to stderr directly prints log lines on top of the progress bar without clearing it first. + let indicatif_layer = IndicatifLayer::new(); tracing_subscriber::registry() .with( tracing_subscriber::fmt::layer() - .with_ansi(std::io::stdout().is_terminal()) - .with_writer(std::io::stderr), + .with_ansi(std::io::stderr().is_terminal()) + .with_writer(indicatif_layer.get_stderr_writer()), ) - .with(IndicatifLayer::new()) + .with(indicatif_layer) .with( tracing_subscriber::EnvFilter::builder() .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into()) @@ -566,6 +579,13 @@ fn main() -> Result<()> { images_repo_root, }; + // Checked before the fetch and the push, so that a re-run fails immediately instead of + // after mirroring. + let config_path = ctx.version_config_path(); + if config_path.exists() { + return VersionConfigExistsSnafu { path: config_path }.fail(); + } + let product_repo_root = ctx.product_repo(); let product_repo = tracing::info_span!( "finding product repository", @@ -589,34 +609,52 @@ fn main() -> Result<()> { tracing::info!(?base, base.commit = ?base_commit, "resolved base commit"); let mirror_url = if mirror { - let mut mirror_url = config + let mirror_url = config .default_mirror .filter(|s| !s.is_empty()) .context(InitMirrorNotConfiguredSnafu)?; - if ssh { - mirror_url = - utils::rewrite_git_https_url_to_ssh(&mirror_url).context(UrlRewriteSnafu)? + // --ssh only picks a transport for this invocation. + // patchable.toml is shared with everyone else, including CI, so it keeps the URL + // from the product configuration. + // Otherwise it'd change it to a ssh:// URL which is not what we want. + let push_url = if ssh { + utils::rewrite_git_https_url_to_ssh(&mirror_url).context(UrlRewriteSnafu)? + } else { + mirror_url.clone() }; // Add mirror remote let mut mirror_remote = product_repo - .remote_anonymous(&mirror_url) + .remote_anonymous(&push_url) .context(AddMirrorRemoteSnafu { - url: mirror_url.clone(), + url: push_url.clone(), })?; // Push the base commit to the mirror - tracing::info!(commit = %base_commit, base = base, url = mirror_url, "pushing commit to mirror"); + tracing::info!(commit = %base_commit, base = base, url = push_url, "pushing commit to mirror"); let mut callbacks = setup_git_credentials(); + // libgit2 reports a refused reference through this callback rather than by failing + // the push, so without it a rejected push looks exactly like a successful one. + let rejection = Rc::new(RefCell::new(None)); + let rejection_sink = Rc::clone(&rejection); + callbacks.push_update_reference(move |reference, status| { + if let Some(status) = status { + *rejection_sink.borrow_mut() = + Some((reference.to_owned(), status.to_owned())); + } + Ok(()) + }); + // Add progress tracking for push operation let (span_push, mut quant_push) = utils::setup_progress_tracking(tracing::info_span!("pushing")); - let _ = span_push.enter(); + let push_progress = span_push.clone(); + let _span_push = span_push.entered(); callbacks.push_transfer_progress(move |current, total, _| { if total > 0 { - quant_push.update_span_progress(current, total, &span_push); + quant_push.update_span_progress(current, total, &push_progress); } }); @@ -631,11 +669,20 @@ fn main() -> Result<()> { mirror_remote .push(&[&refspec], Some(&mut push_options)) .context(PushToMirrorSnafu { - url: &mirror_url, + url: &push_url, refspec: &refspec, commit: base_commit, })?; + if let Some((reference, reason)) = rejection.take() { + return MirrorRejectedPushSnafu { + url: &push_url, + reference, + reason, + } + .fail(); + } + tracing::info!("successfully pushed base ref to mirror"); Some(mirror_url) } else { @@ -650,7 +697,6 @@ fn main() -> Result<()> { base: base_commit, mirror: mirror_url, }; - let config_path = ctx.version_config_path(); if let Some(config_dir) = config_path.parent() { std::fs::create_dir_all(config_dir) .context(CreatePatchDirSnafu { path: config_dir })?; diff --git a/rust/patchable/src/repo.rs b/rust/patchable/src/repo.rs index f663a352a..3e984173c 100644 --- a/rust/patchable/src/repo.rs +++ b/rust/patchable/src/repo.rs @@ -142,30 +142,36 @@ pub fn resolve_and_fetch_commitish( Ok(commit_obj) } Err(err) if !commitish_is_oid || err.code() == git2::ErrorCode::NotFound => { - tracing::info!( - error = &err as &dyn std::error::Error, - "base commit not found locally, fetching from upstream" - ); + if commitish_is_oid { + tracing::info!( + error = &err as &dyn std::error::Error, + "base commit not found locally, fetching from upstream" + ); + } else { + tracing::info!("base is not a commit id, resolving it against upstream"); + } let (span_recv, mut quant_recv) = setup_progress_tracking(tracing::info_span!("receiving")); let (span_index, mut quant_index) = setup_progress_tracking(tracing::info_span!("indexing")); - let _ = span_recv.enter(); - let _ = span_index.enter(); + let recv_progress = span_recv.clone(); + let index_progress = span_index.clone(); + let _span_recv = span_recv.entered(); + let _span_index = span_index.entered(); let mut callbacks = setup_git_credentials(); callbacks.transfer_progress(move |progress| { quant_recv.update_span_progress( progress.received_objects(), progress.total_objects(), - &span_recv, + &recv_progress, ); quant_index.update_span_progress( progress.indexed_objects(), progress.total_objects(), - &span_index, + &index_progress, ); true }); From a0efb651e72de99a128c8978eff7a62a42c5767c Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 16 Sep 2026 10:15:29 +0000 Subject: [PATCH 4/6] chore(boil): Remove some dead code (#1660) * chore(boil): Remove some dead code We ideally want dead_code_pub_in_binary = "warn", but that is currently nightly only and produces noise when running unit tests. For now, we could replace all pub items with pub(crate) to get proper dead code warnings again. * fix: Bump rustls to 0.23.45 to negate RUSTSEC-2026-0285 --- Cargo.lock | 130 +++++++++++++++++++++++------------------- rust/boil/src/main.rs | 66 --------------------- 2 files changed, 71 insertions(+), 125 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c4c01652..574db0a87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,9 +81,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -91,14 +91,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -184,9 +185,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.65" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" dependencies = [ "find-msvc-tools", "jobserver", @@ -258,7 +259,7 @@ dependencies = [ "proc-macro2", "pulldown-cmark", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -372,7 +373,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", ] [[package]] @@ -383,7 +384,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -410,7 +411,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -420,7 +421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.119", ] [[package]] @@ -431,7 +432,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -479,9 +480,9 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "fnv" @@ -526,19 +527,19 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.5", ] [[package]] @@ -549,9 +550,9 @@ checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-timer" @@ -561,9 +562,9 @@ checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-macro", @@ -618,7 +619,7 @@ checksum = "6cf442baaabe4213ce7d1239afc26c039180b6456da2cededa316ae2c8a77a77" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -982,7 +983,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn", + "syn 2.0.119", ] [[package]] @@ -1001,16 +1002,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] @@ -1048,9 +1049,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libgit2-sys" @@ -1303,9 +1304,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -1379,9 +1380,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1541,7 +1542,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn", + "syn 2.0.119", "unicode-ident", ] @@ -1585,9 +1586,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.41" +version = "0.23.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" dependencies = [ "aws-lc-rs", "once_cell", @@ -1611,9 +1612,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -1648,9 +1649,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "aws-lc-rs", "ring", @@ -1660,9 +1661,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "same-file" @@ -1747,7 +1748,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1843,7 +1844,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1892,7 +1893,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1904,7 +1905,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1915,9 +1916,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -1941,7 +1953,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1995,7 +2007,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2086,7 +2098,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2227,7 +2239,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2457,7 +2469,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] @@ -2758,7 +2770,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -2779,7 +2791,7 @@ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2799,7 +2811,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -2839,7 +2851,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] diff --git a/rust/boil/src/main.rs b/rust/boil/src/main.rs index 29decd43b..c18983b37 100644 --- a/rust/boil/src/main.rs +++ b/rust/boil/src/main.rs @@ -14,37 +14,6 @@ mod core; mod models; mod utils; -/// This trait extends functionailty provided by [`snafu`]. -/// -/// [`snafu`] already provides various ways to extend [`Result`]s with additional context-sensitive -/// information. This trait allows calling `if_context` on any type, which runs a predicate to -/// determine if an error with the provided context should be returned. -/// -/// This trait can be thought of as a combination of [`snafu::ensure!`] and returning [`Ok`] -/// afterwards. -pub trait IfContext: Sized { - /// Runs `predicate` and returns [`Ok`] if `true` or [`Err`] (with data from `context`) otherwise. - fn if_context(self, predicate: P, context: C) -> Result - where - P: Fn(&Self) -> bool, - C: snafu::IntoError, - E: std::error::Error + snafu::ErrorCompat; -} - -impl IfContext for T { - fn if_context(self, predicate: P, context: C) -> Result - where - P: Fn(&Self) -> bool, - C: snafu::IntoError, - E: std::error::Error + snafu::ErrorCompat, - { - match predicate(&self) { - true => Ok(self), - false => Err(context.into_error(snafu::NoneError)), - } - } -} - #[derive(Debug, Snafu)] enum Error { #[snafu(display("failed to run build command"))] @@ -95,38 +64,3 @@ async fn main() -> Result<(), Error> { } } } - -#[cfg(test)] -mod tests { - // TODO (@Techassi): These tests are currently commented out because rstest - // contains a bug related to the Rust's core library and the local core - // module. It is fixed upstream, but not released yet. - // Upstream fix PR: https://github.com/la10736/rstest/pull/336 - // use rstest::rstest; - - // use super::*; - - // #[rstest] - // #[case("25.11.0-rc.1+arm64", "25.11.0-rc.1")] - // #[case("25.11.0-rc.1", "25.11.0-rc.1")] - // #[case("25.11.0-rc1", "25.11.0-rc1")] - // #[case("0.0.0-dev", "0.0.0-dev")] - // #[case("25.11.0", "25.11.0")] - // #[case("0.0.0", "0.0.0")] - // fn version_ext_base_prerelease(#[case] input: &str, #[case] expected: &str) { - // let version: Version = input.parse().expect("must be a valid semantic version"); - // assert_eq!(version.base_prerelease(), expected); - // } - - // #[rstest] - // #[case("25.11.0-rc.1+arm64", "25.11.0")] - // #[case("25.11.0-rc.1", "25.11.0")] - // #[case("25.11.0-rc1", "25.11.0")] - // #[case("0.0.0-dev", "0.0.0")] - // #[case("25.11.0", "25.11.0")] - // #[case("0.0.0", "0.0.0")] - // fn version_ext_base(#[case] input: &str, #[case] expected: &str) { - // let version: Version = input.parse().expect("must be a valid semantic version"); - // assert_eq!(version.base(), expected); - // } -} From 5acd240193168ce2fcb40d76b489c9a6c8ae63bd Mon Sep 17 00:00:00 2001 From: Lukas Krug Date: Wed, 16 Sep 2026 13:09:22 +0000 Subject: [PATCH 5/6] fix(opensearch-dashboards): Generate the SBOM from the built distribution (#1663) --- CHANGELOG.md | 3 +++ opensearch-dashboards/Dockerfile | 31 +++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70b55842..1eee8175f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ All notable changes to this project will be documented in this file. - opa, statsd-exporter: Detect the licenses of the Go dependencies ([#1638]). - opa, statsd-exporter: Report the Go dependencies at module level instead of package and file level ([#1638]). +- opensearch-dashboards: Generate the SBOM from the built distribution instead of the source + worktree, so dev dependencies are excluded ([#1641]). ### Removed @@ -66,6 +68,7 @@ All notable changes to this project will be documented in this file. [#1630]: https://github.com/stackabletech/docker-images/pull/1630 [#1635]: https://github.com/stackabletech/docker-images/pull/1635 [#1638]: https://github.com/stackabletech/docker-images/pull/1638 +[#1641]: https://github.com/stackabletech/docker-images/pull/1641 ## [26.7.0] - 2026-07-21 diff --git a/opensearch-dashboards/Dockerfile b/opensearch-dashboards/Dockerfile index 96b57d7e0..7ee633303 100644 --- a/opensearch-dashboards/Dockerfile +++ b/opensearch-dashboards/Dockerfile @@ -195,6 +195,22 @@ for plugin in $(ls); do done EOF +# cdxgen runs against the built distribution in /stackable/opensearch-dashboards, +# not against the source worktree. The worktree is a full development install +# (yarn osd bootstrap), so scanning it reported every devDependency of the root +# project, of packages/*, examples/*, test/plugin_functional/plugins/* and of all +# plugin repositories: Cypress, Selenium WebDriver, ChromeDriver, Jest, Mocha, +# ESLint, webpack and ~350 @types/* packages, none of which are in the image. +# The built distribution contains exactly what is shipped. +# +# --exclude drops the lockfiles that the OpenSearch Dashboards plugins ship +# inside their installed plugin directory. cdxgen prefers a lockfile over +# node_modules, so without this it reads those 15 yarn.lock files and reports +# each plugin's devDependencies again. Excluding them makes cdxgen walk the +# installed node_modules instead, which additionally yields a license for almost +# every component, because an installed package.json records one while a Yarn 1 +# lockfile does not. +# # --spec-version is passed explicitly because cdxgen changes its default between # releases. The value is a global build argument, see boil.toml. # --type js restricts cdxgen to the JavaScript ecosystem. Without it, cdxgen @@ -202,11 +218,14 @@ EOF # GitHub Actions workflows, Gradle and Python files of the build tooling. # --no-babel disables the Babel based usage analysis, which is not needed for a # dependency inventory. -# Note: --required-only is not passed. cdxgen marks every package read from a -# yarn.lock as "required", because the Yarn 1 lockfile does not record whether a -# dependency is a devDependency, so the flag would have no effect here but would -# set `compositions.aggregate` to `incomplete`. -RUN PATH="/opt/node-cdxgen/bin:$PATH" cdxgen --type js --no-babel --json-pretty --spec-version "${CDXGEN_SPEC_VERSION}" +# Note: --required-only is not passed and is not needed. It filters a lockfile by +# the dev flag, which a Yarn 1 lockfile does not record anyway, and no lockfile is +# read here: the installed node_modules already contains only what was installed. +RUN PATH="/opt/node-cdxgen/bin:$PATH" cdxgen --type js --no-babel --json-pretty \ + --spec-version "${CDXGEN_SPEC_VERSION}" \ + --exclude '**/yarn.lock' --exclude '**/package-lock.json' \ + -o /stackable/bom.json \ + /stackable/opensearch-dashboards RUN < Date: Thu, 17 Sep 2026 15:22:44 +0000 Subject: [PATCH 6/6] feat(shared/statsd-exporter): Bump to 0.31.0 (#1664) * feat(shared/statsd-exporter): Bump to 0.31.0 * changelog --- CHANGELOG.md | 2 ++ shared/statsd-exporter/boil-config.toml | 13 +++++++++++++ .../stackable/patches/0.31.0/patchable.toml | 2 ++ 3 files changed, 17 insertions(+) create mode 100644 shared/statsd-exporter/stackable/patches/0.31.0/patchable.toml diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eee8175f..3b587e2a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - hbase: Add an SBOM for the web UI (npm) dependencies, which are unpacked from webjars and therefore not covered by the CycloneDX Maven plugin ([#1620]). - trino: Add SBOMs for the web UI, both for the two npm projects behind it and for the pre-built JavaScript vendored into the source tree ([#1620]). - hadoop, spark: Add SBOMs for the pre-built JavaScript that is vendored into the source tree for the HDFS and Spark web UIs ([#1620]). +- stats-exporter: Add `0.31.0` ([#1664]). ### Changed @@ -69,6 +70,7 @@ All notable changes to this project will be documented in this file. [#1635]: https://github.com/stackabletech/docker-images/pull/1635 [#1638]: https://github.com/stackabletech/docker-images/pull/1638 [#1641]: https://github.com/stackabletech/docker-images/pull/1641 +[#1664]: https://github.com/stackabletech/docker-images/pull/1664 ## [26.7.0] - 2026-07-21 diff --git a/shared/statsd-exporter/boil-config.toml b/shared/statsd-exporter/boil-config.toml index db472410d..9282ac5bf 100644 --- a/shared/statsd-exporter/boil-config.toml +++ b/shared/statsd-exporter/boil-config.toml @@ -13,3 +13,16 @@ cyclonedx-gomod-version = "1.12.0" [versions."0.30.0".local-images] stackable-devel = "1.0.0" + +[versions."0.31.0".build-arguments] +# Find this in https://github.com/prometheus/statsd_exporter/blob/v0.31.0/go.mod +# You can find the latest patch version at: https://go.dev/doc/devel/release +# Mirror golang (no `v` prefix) via https://github.com/stackabletech/docker-images/actions/workflows/mirror.yaml +# Note: currently mirrored to the `sdp` project, but should probably move elsewhere. +golang-version = "1.25.14" +# Find the latest version here: https://github.com/CycloneDX/cyclonedx-gomod/releases +# renovate: datasource=github-releases packageName=CycloneDX/cyclonedx-gomod +cyclonedx-gomod-version = "1.12.0" + +[versions."0.31.0".local-images] +stackable-devel = "1.0.0" diff --git a/shared/statsd-exporter/stackable/patches/0.31.0/patchable.toml b/shared/statsd-exporter/stackable/patches/0.31.0/patchable.toml new file mode 100644 index 000000000..a36fd4ac6 --- /dev/null +++ b/shared/statsd-exporter/stackable/patches/0.31.0/patchable.toml @@ -0,0 +1,2 @@ +mirror = "https://github.com/stackabletech/statsd_exporter.git" +base = "715f2b6565c491d017c1bf3b431e02d5515ffbf0"