diff --git a/CHANGELOG.md b/CHANGELOG.md index 602a64cf2..609b98b91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,14 @@ 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]). +- stats-exporter: Add `0.31.0` ([#1664]). ### 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 +48,13 @@ 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]). +- opensearch-dashboards: Generate the SBOM from the built distribution instead of the source + worktree, so dev dependencies are excluded ([#1641]). +- 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 +71,10 @@ 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 +[#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/Cargo.lock b/Cargo.lock index 278d32207..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" @@ -1074,9 +1075,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", @@ -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/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); 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/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 <(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); - // } -} 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 }); 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..9282ac5bf 100644 --- a/shared/statsd-exporter/boil-config.toml +++ b/shared/statsd-exporter/boil-config.toml @@ -7,8 +7,22 @@ # 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" + +[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"