Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
6b8d2b3
Add disabled-by-default Iceberg REST catalog listener skeleton
balookrd May 25, 2026
f3e88b2
Wire read-only Iceberg REST endpoints to routing layer
balookrd May 25, 2026
e1cc69a
Add SPNEGO/Kerberos auth to Iceberg REST endpoint
balookrd May 25, 2026
00ee5b3
Document Iceberg REST frontend in README and CHANGELOG
balookrd May 25, 2026
21cdf19
Cover the Iceberg REST front door with a stand smoke scenario
balookrd Jul 27, 2026
375153a
Add catalog name translation for the REST multi-catalog phase
balookrd Jul 27, 2026
6862ef9
Teach the REST metastore client to translate catalog-scoped names
balookrd Jul 27, 2026
24726b8
Key IcebergRestService on an explicit catalog name
balookrd Jul 27, 2026
edc3d1e
Build a per-catalog registry of Iceberg REST services
balookrd Jul 27, 2026
64a9d21
Serve every configured catalog as an Iceberg REST prefix
balookrd Jul 27, 2026
425126a
Document multi-catalog Iceberg REST prefixes
balookrd Jul 27, 2026
8161f7b
Cover multi-catalog REST prefixes in the stand smoke
balookrd Jul 27, 2026
f4d133b
Apply final-review fixes for Iceberg REST phase 2
balookrd Jul 27, 2026
fcd72c8
Mention the service registry in the IcebergRestService Javadoc
balookrd Jul 27, 2026
d938f88
Assert both sides of the multi-catalog REST view in the smoke
balookrd Jul 27, 2026
0b47130
Add REST listener series to the Prometheus metrics
balookrd Jul 27, 2026
eec20f1
Record REST request metrics in the Iceberg HTTP handler
balookrd Jul 27, 2026
becda09
Cover REST metrics in the stand smoke
balookrd Jul 27, 2026
eca202f
Add an Iceberg REST row to the Grafana dashboard
balookrd Jul 27, 2026
613b7a1
Move the Iceberg REST front door to Iceberg 1.9.2
balookrd Jul 27, 2026
6e6452f
Document the Iceberg 1.9.2 upgrade
balookrd Jul 27, 2026
6dc58c6
Fix EXISTS-routes changelog claim and matrix pleonasm
balookrd Jul 27, 2026
e486696
Fix changelog overclaim on HEAD view-exists 204 case
balookrd Jul 27, 2026
42dcbdf
Fix REST pagination 500, document HEAD routes, drop dead exception ma…
balookrd Jul 27, 2026
1fa260b
Stop leaking server stack traces and answer 400 for unparseable bodies
balookrd Jul 27, 2026
6441ca2
Advertise the endpoints the REST front door actually serves
balookrd Jul 27, 2026
c2cc4fc
Cover the Iceberg REST exists routes with unit tests
balookrd Jul 27, 2026
4517d3f
Fix HEAD responses writing a body on Iceberg REST error paths
balookrd Jul 27, 2026
629aaf1
Fix non-discriminating body assertion in HEAD-404 tests
balookrd Jul 27, 2026
0170480
Fix HEAD responses writing a body on management endpoints
balookrd Jul 27, 2026
5397bb8
Cover the hardened REST error and config behavior in the stand smoke
balookrd Jul 27, 2026
592b4f4
Make HEAD-write guard testable and tighten the REST config smoke check
balookrd Jul 27, 2026
d3872ef
Reject non-GET methods on the config route
balookrd Jul 27, 2026
ae58c34
Let the REST metastore client issue table writes and commit locks
balookrd Jul 28, 2026
a390d11
Fix RoutingMetaStoreClient review findings: blind test, lock overload…
balookrd Jul 28, 2026
e191999
Refuse Iceberg REST writes outside the default catalog
balookrd Jul 28, 2026
4cc6469
Close write-gate hole: cover every REST write route, not just five
balookrd Jul 28, 2026
931b78d
Advertise write endpoints only for the default catalog
balookrd Jul 28, 2026
2f32ddc
Fix HDFS write NoSuchMethodError and widen REST handler catch-all
balookrd Jul 28, 2026
c4685ef
Cover Iceberg REST table writes in the stand smoke
balookrd Jul 28, 2026
902edf0
Exclude Xerces from hadoop-hdfs and add write-route drift guard
balookrd Jul 28, 2026
80aedd3
Cover REST commit, rename and gate negatives beyond CREATE_TABLE in s…
balookrd Jul 28, 2026
74ce37f
Turn on Iceberg REST under Kerberos and fix its HDFS write path
balookrd Jul 28, 2026
154a04e
Let the REST metastore client create, alter and drop namespaces
balookrd Jul 28, 2026
87676b4
Fix dropDatabase overload dispatch and honor ignoreUnknownDb
balookrd Jul 28, 2026
2b77859
Advertise the view, namespace and transaction writes the front door s…
balookrd Jul 28, 2026
a3d5356
Cover the completed Iceberg REST write surface in the stand smoke
balookrd Jul 28, 2026
33bfdaa
Drive view rename/update and cover four more write-gate negatives in …
balookrd Jul 28, 2026
5f84d4e
Fail closed on unresolved write namespaces, guard write-route/endpoin…
balookrd Jul 28, 2026
86c81e2
Make the REST smoke's namespace/view names configurable and safer
balookrd Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ scripts/run-real-installation-smoke-simple.sh --env-file smoke-stand/env/simple.
- Знание о служебном плейсхолдере Hive (`_dummy_database`/`_dummy_table`, константы `SemanticAnalyzer.DUMMY_DATABASE`/`DUMMY_TABLE`, которые Hive шлёт в `LockRequest` для `INSERT ... VALUES`) живёт только в `routing/HivePlaceholderNamespace`. Плейсхолдер не выбирает каталог, не считается вторым namespace lock-запроса и не переписывается интернализацией в реальную backend-базу. Не добавляй локальных сравнений с `_dummy_database` в других классах.
- Для RPC, у которых Hive IDL не объявляет исключений (`add_write_notification_log`, `open_txns`, `show_locks` и другие: у их `<method>_result` есть только поле `success`), libthrift 0.9.3 подменяет любое серверное исключение на `TApplicationException("Internal error processing <method>")`. Текст отказа таких методов виден только в логе - не рассчитывай, что его получит клиент, и не проверяй его в smoke-скриптах. Настоящий HMS теряет свои тексты ошибок так же.
- Классификация backend Thrift-ошибок живёт только в `thriftbridge/ThriftFailureClassifier`: «метода нет» - это `TApplicationException` с типом `UNKNOWN_METHOD` (или отсутствие метода в загруженном runtime), transport failure и protocol desync - отдельные категории. Не пиши локальные `instanceof TApplicationException` для решений про fallback, downgrade или переоткрытие соединения.
- `restcatalog` - Iceberg REST front door поверх routing-слоя: per-catalog сервисы работают через in-process прокси `IMetaStoreClient`; для не-default каталогов включён name translation, чтобы клиент видел внутренние имена баз этого каталога. Write-запросы к таблицам, view (create/update/drop/rename), namespace DDL (create/update/drop) и multi-table transaction commit поддержаны, но только когда namespace резолвится в `routing.default-catalog` - только его таблицы подкреплены реальным HMS-локом, остальные каталоги обслуживает synthetic lock shim без проверки конфликтов. `WriteRouteGate` проверяет резолвленный каталог, а не prefix запроса, поэтому federated-имя под default-prefix отказывается так же, как прямой запрос к non-default prefix; `GET /v1/config` объявляет всю эту асимметрию в `endpoints` - default-каталог видит все тринадцать write-маршрутов, что WriteRouteGate проверяет, остальные каталоги видят только чтение. Не добавляй локальных проверок "разрешён ли write" в других классах - весь gate живёт в `WriteRouteGate`. Каждый `IcebergRestService` получает per-catalog Hadoop `Configuration` через `IcebergRestServices.open(..., hadoopConfForCatalog)`, которая в проде резолвится в `router.requireBackend(catalog).hiveConf()` - тот же объект, что уже несёт `fs.defaultFS`/Kerberos-настройки catalog.<name>.conf.* для Thrift-пути. Не заводи для REST-пути отдельную голую `new Configuration()`: под Kerberos это провалит запись в HDFS ("Failed to specify server's Kerberos principal name"), потому что namenode-принципал у каждого каталога свой и известен только через его собственный conf.

## Парсинг конфигурации

Expand All @@ -98,8 +99,9 @@ scripts/run-real-installation-smoke-simple.sh --env-file smoke-stand/env/simple.
- Держи изменения узко сфокусированными. Пути routing, security, compatibility и class-loading чувствительны для production.
- Предпочитай deterministic routing и явные safe failures вместо догадок, когда catalog ownership или namespace context неоднозначны.
- Сохраняй совместимость с Java 17. Не добавляй требования к более новым версиям языка или runtime.
- Не добавляй новые зависимости без реальной необходимости; Hive/Hadoop dependency convergence хрупкий.
- Не добавляй новые зависимости без реальной необходимости; Hive/Hadoop dependency convergence хрупкий. `hadoop-hdfs` и `hadoop-common` обязаны быть одной версии: Maven их не сравнивает (разные artifact ID), а рассинхрон ломает `DFSOutputStream` (`NoSuchMethodError: FSOutputSummer.<init>`) при любой записи в HDFS изнутри JVM прокси - `pom.xml` явно исключает транзитивный `hadoop-hdfs` из `orc-core` и держит `hadoop-hdfs:2.6.0` напрямую, чтобы совпасть с `hadoop-common`. Проверяй `mvn -o dependency:tree | grep -iE "hadoop-hdfs|hadoop-common"` при трогании этих зависимостей.
- Логирование: slf4j-api и binding `slf4j-reload4j` держи на одной версии `${slf4j.version}`. `org.apache.log4j` должен приходить только из reload4j, поэтому `log4j:log4j` исключён во всех зависимостях, которые его тянут (обе Hive-зависимости, `hadoop-mapreduce-client-core`, `curator-test`). Добавляя зависимость, проверь `mvn -o dependency:tree | grep log4j`: второй провайдер этого пакета даст в fat jar классы, выбранные shade-плагином произвольно.
- `hadoop-hdfs` тянет `xerces:xercesImpl`/`xml-apis` (нужны только offline-вьюеру image/edits, не рантайм-пути `DFSClient`, который использует этот прокси) - оба исключены в блоке `hadoop-hdfs` в `pom.xml`. `xercesImpl` несёт `META-INF/services/javax.xml.parsers.*`, что в shaded fat jar делает 2007-летний парсер (с известными CVE) JVM-wide JAXP-провайдером для каждого `DocumentBuilderFactory`/`SAXParserFactory` в процессе, включая Hadoop `Configuration` и парсинг hive-site - и тихо вытесняет парсер JDK. Добавляя зависимость, проверь `mvn -o dependency:tree | grep -iE "xerces|xml-apis"`.
- Комментарии оставляй короткими и только там, где они объясняют неочевидное compatibility, security, routing или class-loading поведение.
- Не форматируй несвязанные файлы и не меняй generated docs, если твоя задача не требует их обновления.

Expand Down
Loading
Loading