)]}'
{
  "log": [
    {
      "commit": "efbedc396fa178abe39ec24071f91f24163d8c9a",
      "tree": "1715c81d5a58e5ff0961825fe1c5369e2efc32d0",
      "parents": [
        "acb9a49a493fc0708e186a7da6bac9634deef895"
      ],
      "author": {
        "name": "csurong",
        "email": "csurong1@gmail.com",
        "time": "Thu Jul 30 21:39:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 21:39:30 2026 +0800"
      },
      "message": "[AMORO-4301][ams] Fix Kubernetes executor label prefix (#4302)\n\nUse Spark\u0027s executor label prefix for optimizer executor pods and add regression coverage for both driver and executor labels.\n\nCo-authored-by: caosurong \u003csurong.cao@thinkingdata.cn\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "acb9a49a493fc0708e186a7da6bac9634deef895",
      "tree": "c8046c3caf28829ff54bc4e60749db1b65cf765e",
      "parents": [
        "38b2b49e72676cc5623264ce6f5d0dd94d3e414c"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Thu Jul 30 19:11:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 19:11:45 2026 +0800"
      },
      "message": "[AMORO-4300] Recover active processes after table ownership transfer (#4304)\n\n[AMORO-4300][ams] Recover active processes after table ownership transfer\n\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "38b2b49e72676cc5623264ce6f5d0dd94d3e414c",
      "tree": "cd42bbd10c39642abb761fbc6a64c9019e3eacd1",
      "parents": [
        "b7bf0d39de9bb085446f1b06da2cb1810ac5cb26"
      ],
      "author": {
        "name": "Power John",
        "email": "johntomcat7408@gmail.com",
        "time": "Thu Jul 30 17:57:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 17:57:15 2026 +0800"
      },
      "message": "[AMORO-4240][AMS] Support staged table creation in REST catalog (#4284)\n\n* [AMORO-4240][AMS] Support staged table creation in REST catalog\n\n* [AMORO-4240][AMS] Address staged create review comments"
    },
    {
      "commit": "b7bf0d39de9bb085446f1b06da2cb1810ac5cb26",
      "tree": "9e790acfe129f3696c80c37462bd30e94c3088ed",
      "parents": [
        "ec28554a2eaab45c402d6c5a1a1c14ab36d769a1"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Thu Jul 30 15:21:11 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 14:21:11 2026 +0800"
      },
      "message": "[AMORO-4297][AMS] Persist failure reasons in task quota history (#4298)\n\nfix: persist task quota failure reasons\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "ec28554a2eaab45c402d6c5a1a1c14ab36d769a1",
      "tree": "b44bd75445ab5dccc7a10b1b9420e918642fb1de",
      "parents": [
        "ea4ea4cd31ecab35a3d8b7ebf39571d266cac472"
      ],
      "author": {
        "name": "ZhouJinsong",
        "email": "zhoujinsong0505@163.com",
        "time": "Wed Jul 29 11:58:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:58:32 2026 +0800"
      },
      "message": "[Hotfix] Change the docker action version to match ASF policy (#4299)\n\nChange the docker action version to match ASF policy"
    },
    {
      "commit": "ea4ea4cd31ecab35a3d8b7ebf39571d266cac472",
      "tree": "4913eb6bde9a1763395d01309e1e332bbb096285",
      "parents": [
        "436a3173b992cf049112b0ea47cb83f38a2afc6f"
      ],
      "author": {
        "name": "ZhouJinsong",
        "email": "zhoujinsong0505@163.com",
        "time": "Mon Jul 27 21:47:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 21:47:28 2026 +0800"
      },
      "message": "[Hotfix] Pin all external actions to the specific git hash (#4294)\n\n* Pin all external actions to the specific git hash\n\n* Update action version"
    },
    {
      "commit": "436a3173b992cf049112b0ea47cb83f38a2afc6f",
      "tree": "17fd86e099361a73165ac9216b803c6cf586d4d9",
      "parents": [
        "0dfaa4b159728d470f90e22e0cede8a3ef441fc6"
      ],
      "author": {
        "name": "ZhouJinsong",
        "email": "zhoujinsong0505@163.com",
        "time": "Mon Jul 27 17:40:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:40:28 2026 +0800"
      },
      "message": "[AMORO-4286]Change process status to failed when recover from AMS restarting (#4288)\n\n* Change process status to failed when recover from unknown status\n\n* Fix the checkstyle errors"
    },
    {
      "commit": "0dfaa4b159728d470f90e22e0cede8a3ef441fc6",
      "tree": "c8dfce1f0d57c03e4535a193b437dfda83adb959",
      "parents": [
        "7be0710b3e134f889ce1f970604428663c0ca97b"
      ],
      "author": {
        "name": "huangjc7",
        "email": "43225006+huangjc7@users.noreply.github.com",
        "time": "Mon Jul 27 17:31:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:31:45 2026 +0800"
      },
      "message": "[AMORO-4290][AMS] Propagate internal Iceberg table commit failures (#4291)\n\nLog internal commit errors and propagate CommitFailedException to REST clients instead of swallowing failures. Add unit tests for failure propagation and metadata cleanup errors."
    },
    {
      "commit": "7be0710b3e134f889ce1f970604428663c0ca97b",
      "tree": "cf3e5199d66d7cca441ec61148e4f9e64049e41c",
      "parents": [
        "eee2e3573180ae943adfa867018bdf310027efdf"
      ],
      "author": {
        "name": "Wang Tao",
        "email": "wtrunwolf@gmail.com",
        "time": "Fri Jul 24 15:45:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 15:45:39 2026 +0800"
      },
      "message": "[AMORO-4277] imporove expire_snapshots performance (#4278)\n\n* optimize expire snapshots\nfix: logical error\nremove some comments\n\n* remove duplicate class and move test case to amoro-format-iceberg\n\n* Update amoro-format-iceberg/src/main/java/org/apache/amoro/utils/TableFileUtil.java\n\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e\n\n* fix review comment\n\n---------\n\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e"
    },
    {
      "commit": "eee2e3573180ae943adfa867018bdf310027efdf",
      "tree": "5f406b2c9d2892048b789753ab5c98f047344c2f",
      "parents": [
        "da51a2d582deedab65b36c9c831e3a3f566caab0"
      ],
      "author": {
        "name": "csurong",
        "email": "csurong1@gmail.com",
        "time": "Fri Jul 24 11:49:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 11:49:22 2026 +0800"
      },
      "message": "[AMORO-4126][ams] Default waitAppCompletion\u003dfalse for Spark optimizer on Kubernetes (#4289)\n\n[AMORO-4126][ams] Default waitAppCompletion to false on Kubernetes\n\nCo-authored-by: caosurong \u003csurong.cao@thinkingdata.cn\u003e"
    },
    {
      "commit": "da51a2d582deedab65b36c9c831e3a3f566caab0",
      "tree": "db63b6097a091841c23f6a1bbae2b2bc105f0245",
      "parents": [
        "0704a1ee92df82bd923074d6714cb7612b45d964"
      ],
      "author": {
        "name": "Power John",
        "email": "johntomcat7408@gmail.com",
        "time": "Thu Jul 23 14:15:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 14:15:19 2026 +0800"
      },
      "message": "[AMORO-4240][AMS] Support namespace properties in REST catalog (#4283)"
    },
    {
      "commit": "0704a1ee92df82bd923074d6714cb7612b45d964",
      "tree": "1d4585c548604451f45cef7a6ece9984fbbaf52b",
      "parents": [
        "0cb625072686a58d32af00939d919569a7185586"
      ],
      "author": {
        "name": "ZhouJinsong",
        "email": "zhoujinsong0505@163.com",
        "time": "Wed Jul 22 19:28:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 19:28:00 2026 +0800"
      },
      "message": "[AMORO-4281]Fix cleanning process trigger issue for mixed format tables (#4282)\n\n* Fix expire process trigger issue\n\n* Add some method to reuse some codes\n\n* Fix some issues of comments\n\n---------\n\nCo-authored-by: baiyangtx \u003cxiangnebula@163.com\u003e"
    },
    {
      "commit": "0cb625072686a58d32af00939d919569a7185586",
      "tree": "8e2464935d51aac673646326a6c0bb93bc017b8a",
      "parents": [
        "d29cbf4bcfba2ee60b24c0708aa5e7a1962205b0"
      ],
      "author": {
        "name": "byungnam",
        "email": "lbn0216@gmail.com",
        "time": "Wed Jul 22 16:06:48 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 15:06:48 2026 +0800"
      },
      "message": "[AMORO-4274] Remove Roaring64Bitmap.isEmpty() check in CombinedDelete… (#4275)\n\n[AMORO-4274] Remove Roaring64Bitmap.isEmpty() check in CombinedDeleteFilter\n\npositionMap is populated only via computeIfAbsent(...).add(...) while reading\nposition-delete files, so any stored value is a non-empty Roaring64Bitmap.\npositionMap.get(...) therefore returns null or a non-empty bitmap, never an\nempty one, making the isEmpty() branch unreachable.\n\nRoaring64Bitmap.isEmpty() is backed by getLongCardinality(), which traverses\nall containers, so calling it once per scanned record wastes CPU on the hot\npath. Drop the check and keep only the null guard; behavior is unchanged.\n\nClose #4274"
    },
    {
      "commit": "d29cbf4bcfba2ee60b24c0708aa5e7a1962205b0",
      "tree": "424b3b8d584e19fc7e2e28463a65c32e0a5d8f62",
      "parents": [
        "cbd7d65652226f9f7b259924b3d2164b5ea8d7a5"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Wed Jul 22 16:06:17 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 15:06:17 2026 +0800"
      },
      "message": "[AMORO-4271] AIP-5 Phase 2: demand-driven scale-up for dynamic allocation groups (#4272)\n\n* [AMORO-4271] AIP-5 Phase 2: add dynamic-allocation.executor-parallelism config\n\nThe scaling unit of dynamic allocation is one homogeneous K-thread\noptimizer instance (the Spark executor model). K is configured by the\nnew dynamic-allocation.executor-parallelism property (default 1).\n\nvalidate() rejects K \u003c 1 and K \u003e max-parallelism: a single K-thread\ninstance already exceeding the cap could never be created, which would\nleave an enabled group as a silent no-op.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: pure demand accounting (serviceable planned, thread occupancy)\n\nserviceablePlannedCount implements quota-mode-aware demand counting:\na proportional quota (targetQuota \u003c\u003d 1) scales with availableCore, so\nthe whole backlog is serviceable; an absolute quota (\u003e 1) is a fixed\nlimit that scaling cannot raise, so only free slots count.\n\noccupiesThread counts SCHEDULED as occupying: a thread is busy from\nassignment (pollTask), not from ack; counting only ACKED would\noverestimate headroom during the poll-to-ack window.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: computeScaleUp scale-out decision\n\nPer-group decision state (backlog timer, cadence, exponential ramp)\nwith injected time, so every scenario is deterministic.\n\nOrdered checks:\n- min-parallelism floor: enforced immediately, no timing gate.\n- Immediate demand (busy + serviceable \u003e effective): exponential ramp\n  (1, 2, 4, 8) clamped to the actual need; the ramp resets when the\n  clamp binds (Spark addExecutors semantics) or when demand clears.\n- Future demand (pending tables while all threads are busy, including\n  the zero-optimizer cold start where nothing polls and planning never\n  runs): a single probe instance. Pending tables are not quantified\n  demand before planning, so no exponential growth on this signal.\n\nDemand must persist for scheduler-backlog-timeout before the first\nscale-out; later rounds are spaced by sustained-backlog-timeout, so a\ntrickle drained between rounds never accumulates toward a scale-out.\nThe max-parallelism cap always wins.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: pending registration accounting with boot deadline\n\nRegistration is optimizer-driven (the pod self-registers after boot),\nso scale-up counts requested-but-unregistered capacity to avoid\nduplicate scale-outs during the boot window. Entries carry their own\nboot deadline: a request that never registers (image pull failure,\nexhausted ResourceQuota, crash loop) is pruned instead of freezing\nscale-up below real demand forever. Heartbeat expiry cannot cover this\nwindow because it only starts after registration.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: dedicated scale keeper for dynamic-allocation groups\n\nDRA-enabled groups are taken over from the legacy floor keeper, whose\nmin-parallelism-check cadence (minutes, multiplied by consecutive\nattempts) would render the DRA backlog timeouts (seconds) physically\nunreachable. OptimizerScaleKeeper reuses the AbstractKeeper\ninfrastructure (HA leader gating, DelayQueue, lifecycle) and evaluates\neach group at its own sustained-backlog-timeout; the legacy keeper\nkeeps watching DRA groups only to resume floor duty if DRA is disabled\nlater.\n\nScale-outs are executed in executor-parallelism-thread instance units\n(computeScaleUp), with requested-but-unregistered capacity counted via\nPendingRegistrations so a booting pod is not re-requested every round;\na synchronous request failure is dropped immediately and retried.\nGroups are watched on create, startup load, and update (covering\nenabling DRA on an existing group at runtime); deleted or disabled\ngroups drop out of the watch set on their next evaluation.\n\nOptimizingQueue.collectDynamicAllocationLoad() snapshots the demand\nside: busy threads (SCHEDULED and ACKED), quota-mode-aware serviceable\nPLANNED tasks, and PENDING tables - the only signal observable on a\ncold group with zero optimizers.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: warn when a group is planning-bound instead of scaling\n\nIdle threads while tables wait as PENDING and no PLANNED tasks\nmaterialize means the bottleneck is the serialized planning\n(optimizer.max-planning-parallelism), not thread capacity: scaling out\nwould only add more idle threads. The scale keeper surfaces this as an\nedge-triggered warning naming the config to raise, and does not scale.\nA cold group (zero threads) stays the future-demand case.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: distinguish the scale keeper\u0027s failure modes\n\nThe keeper\u0027s drop-out path treated every irregularity the same way,\nwhich conflates situations that need opposite handling:\n\n- A transient group-read failure (e.g. a database hiccup) is not a\n  deletion: there is no periodic re-watch, so dropping the group there\n  would silently disable its dynamic allocation until the next config\n  change. Keep the task alive and retry shortly.\n- After unwatching a disabled group, re-read it once: an update\n  re-enabling DRA concurrently would have had its watch() call\n  swallowed by the still-present watched-set entry, orphaning the\n  group until its next change.\n- An enabled group whose queue is momentarily absent (a delete/create\n  racing the config watcher) is transient too; unwatch-plus-rewatch\n  there would spin a delay-0 hot loop of DB reads.\n- A scale-out that fails after requestResource succeeded has started a\n  real pod; erasing its boot-window entry would re-request a duplicate\n  next round. Only a failure before the request is dropped and retried.\n- Disabling DRA keeps the boot-window accounting (re-enabling within\n  the window must not re-request the same capacity); deleting the\n  group drops everything immediately, so a same-name group created\n  before the next evaluation does not inherit phantom capacity.\n- The planning-bound warning now counts registered threads only (a\n  booting pod\u0027s phantom capacity is not idle threads) and requires the\n  condition to persist across two consecutive evaluations, since a\n  single snapshot can hold transiently while planning is in flight.\n\nAlso pins in the integration test that registration clears the\nboot-window accounting: double-counted capacity would suppress demand\nscaling.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: keep floor handling consistent across validation and scaling\n\nTwo floor edge cases:\n\n- A floor unreachable in executor-parallelism units (e.g. min\u003d5, max\u003d6,\n  K\u003d4: covering the floor needs 2 instances \u003d 8 threads \u003e max) passed\n  validation and then sat permanently below its floor with no signal -\n  the same silent no-op the validation rules exist to prevent. Reject\n  it up front; the keeper-side cap clamp stays as defense in depth for\n  configs persisted before this rule.\n- A floor deficit (optimizers died, or a new group) now resets the\n  demand-phase state: previously a demand phase before the deficit\n  left a passed cadence gate and a grown ramp behind, so the first\n  demand after recovery fired immediately and oversized instead of\n  re-proving backlog persistence.\n\nAlso pins that a fractional absolute quota truncates like the poll\ngate does ((int) 2.5 \u003d 2 slots), keeping the two accountings aligned.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: snapshot table runtimes under the scheduling lock\n\nSchedulingPolicy\u0027s table runtime map is a plain HashMap whose\ncanonical accesses all hold tableLock; the dynamic-allocation load\nsnapshot iterated it lock-free from the scale keeper thread, so a\nconcurrent addTable/removeTable could throw\nConcurrentModificationException and skip that whole evaluation round.\nAdd a snapshot accessor that copies the runtimes under the lock and\nuse it for the load snapshot.\n\nAlso covers collectDynamicAllocationLoad with a queue-level test on a\nreal table: the PENDING table is the only demand signal before any\npoll (the cold-start case), and a polled task occupies its thread from\nSCHEDULED on.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4271] AIP-5 Phase 2: document the dynamic-allocation group properties\n\nAdd the dynamic-allocation.* properties to the optimizer group\nproperty table, mark the flat min-parallelism row deprecated in favor\nof the namespaced key, and recommend executor-parallelism 4-8 for\nKubernetes groups so per-pod JVM overhead is shared across threads.\nThe scale-down-related properties are documented as landing in a later\nrelease.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "cbd7d65652226f9f7b259924b3d2164b5ea8d7a5",
      "tree": "65ea4dcea6380c78f0421e956accf932d106fb7c",
      "parents": [
        "6318c408471847e4a6628104dc68764395bf1b19"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Tue Jul 21 15:50:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 15:50:08 2026 +0800"
      },
      "message": "[hotfix] Fix S3 credentials not vended when loading Lance table (#4279)\n\nfixup bug\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "6318c408471847e4a6628104dc68764395bf1b19",
      "tree": "c17f97d4dd83326b6f0e7ee34d2464855c09c535",
      "parents": [
        "27ae8d55f2d300acb0d123602d90928ab7349b6b"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Mon Jul 20 11:36:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 11:36:07 2026 +0800"
      },
      "message": "[AMORO-4269] Refactor Iceberg thread pool initialization and scope (#4270)\n\n* Refactor Iceberg thread pool initialization and usage for improved configuration management\n\n* Fix Iceberg thread pool initialization in tests\n\n* Restore Iceberg thread pool API compatibility\n\n* Make Iceberg thread pool methods public for enhanced accessibility\n\n* Document Iceberg thread pool fallback\n\n* Remove unused fallback warning set from Iceberg thread pool implementation"
    },
    {
      "commit": "27ae8d55f2d300acb0d123602d90928ab7349b6b",
      "tree": "98a3326b28edc4e74ae07710ca3ac3fd5a581ada",
      "parents": [
        "8b03fec1105aa4b29b5f4d09815c62628187c115"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Thu Jul 16 00:21:04 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 23:21:04 2026 +0800"
      },
      "message": "[AMORO-4235] Recognize stale optimizer responses on the AMS side (#4261)\n\n* [AMORO-4235] Recognize stale optimizer responses on the AMS side\n\nWhen the OptimizerKeeper (or resetStaleTasksForThread on re-poll) resets a\ntask that is still executing, the optimizer\u0027s in-flight ack/complete arrives\nafter the task\u0027s token has been cleared. TaskRuntime.validThread then threw\n\"Task has been reset or not yet scheduled\", surfacing as an ERROR; for\ncompletion it also broke the SCHEDULED -\u003e SUCCESS transition\n(IllegalTaskStateException).\n\nThe AMS now recognizes stale responses by (token, threadId, status):\n- ack: rejected outside the transaction so the optimizer skips the obsolete\n  round, without the misleading \"failed to commit transaction\" error.\n- complete: ignored gracefully, since the reported run belongs to a\n  torn-down round.\n\nThis fixes the rejection of valid optimizer responses. The permanent-stuck /\nuncancelable symptom in the issue could not be reproduced from the excerpt\nlogs and may need the full log to confirm -- hence \"Relates to\" rather than\n\"Close\".\n\nTests:\n- TestOptimizingQueue: unit reproductions via the pollTask path (multi-task\n  stale ack, single-task stale completion).\n- TestDefaultOptimizingService: end-to-end reproduction driving the real\n  OptimizerKeeper ack-timeout reset of a live optimizer\u0027s task.\n\nRelates to #4235\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4235] Fix testAckAndCompleteTask for absorbed stale completion\n\nCompleting a task before ack now produces no exception (the AMS absorbs it\nas a stale response, indistinguishable from a completion for a task reset\nand re-scheduled to the same thread), so assert the task stays SCHEDULED\ninstead of expecting IllegalTaskStateException.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4235] Apply spotless formatting\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4235] Lower test ack-timeout and poll for status instead of sleeping 35s\n\nAddress review feedback: testAckTimeoutResetThenLateAckRejected relied on the\ndefault 30s optimizer.task-ack-timeout and a fixed Thread.sleep(35000).\n\n- Override OPTIMIZER_TASK_ACK_TIMEOUT to 5s in AMSServiceTestBase. It must\n  stay above optimizer.polling-timeout (3s): a blocking pollTask waiting out\n  its full timeout would otherwise pick up the task the keeper reset by\n  ack-timeout in the meantime (this broke testPollTaskThreeTimes at 2s).\n- Replace the fixed sleep with waitForTaskStatus polling every 100ms, so the\n  test finishes right after the keeper reset lands (~6s instead of 35s).\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4235] Stamp an attempt id on schedule and ignore completions of previous attempts\n\nA completion delayed until the same task has been reset, re-scheduled to\nthe same optimizer thread and re-acked matches (token, threadId, status)\nand was accepted as the result of the new attempt.\n\nEvery schedule now stamps a monotonically increasing attempt id into the\ntask properties (reaching the optimizer via the existing\nOptimizingTask.properties map), the optimizer echoes it back in the\nresult summary, and complete() ignores a completion whose echoed attempt\nid does not match the current one. Results from older optimizers carry\nno attempt id and fall back to the previous checks.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\nCo-authored-by: ConradJam \u003cjam.gzczy@gmail.com\u003e"
    },
    {
      "commit": "8b03fec1105aa4b29b5f4d09815c62628187c115",
      "tree": "2fbd8d474d4889af852ee3256041c41366f40aa1",
      "parents": [
        "498ea2716df26ce0677e53401fb8d5c3058aa2c6"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Fri Jul 10 12:22:05 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:22:05 2026 +0800"
      },
      "message": "[AMORO-4253] AIP-5 Phase 1: dynamic allocation configuration and validation (#4254)\n\n* [AMORO-4253] AIP-5 Phase 1: dynamic allocation configuration and validation\n\nFirst implementation phase of AIP-5 (Dynamic Resource Allocation for\nOptimizer, #4191). Configuration foundation only; no runtime scaling\nbehavior. Dynamic allocation is opt-in and disabled by default, so\nexisting groups are unaffected.\n\n- OptimizerProperties: declare the dynamic-allocation.* constants (with\n  @since); deprecate the flat min-parallelism in favor of the namespaced\n  dynamic-allocation.min-parallelism, still honored as a fallback.\n- DynamicAllocationConfig: parse(ResourceGroup) + validate() enforcing\n  the AIP-5 constraints only when enabled (max-parallelism mandatory,\n  min \u003c\u003d max \u003c\u003d 1024, executor-idle-timeout \u003e\u003d 30s, positive durations,\n  reject the external container). resolveMinParallelism centralizes the\n  namespaced -\u003e legacy -\u003e 0 resolution.\n- OptimizerGroupController: reject an invalid DRA config with HTTP 400 on\n  create/update before persisting.\n- DefaultOptimizingService: startup load is fail-safe (invalid config\n  logs a warning and falls back to DRA-disabled instead of crashing AMS);\n  the keeper min-parallelism auto-reset is skipped when DRA is\n  effectively enabled, and otherwise writes the key the group actually\n  reads (fixing an endless no-op loop for namespaced groups).\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4253] Strictly validate min-parallelism on opted-in DRA groups\n\nresolveMinParallelism() is intentionally lenient (unparsable -\u003e 0) for the\nkeeper hot path and legacy compatibility, but validate() reused that leniency\nfor opted-in groups: an enabled group with \u0027dynamic-allocation.min-parallelism\u0027\nset to a non-numeric value silently degraded to 0, and a negative value passed\nthe max \u003e\u003d min check unchecked. This was asymmetric with max-parallelism, which\nis parsed strictly and rejected with HTTP 400.\n\nRetain the raw min-parallelism string at parse time so validate() can tell\n\"explicitly configured but unparsable\" from \"unset\" (the resolved int collapses\nboth to 0). When DRA is enabled, an explicitly configured min-parallelism that\nis unparsable or negative is now rejected. The keeper hot path stays lenient.\n\nAlso document the getMaxParallelism() unboxing precondition (nullable until\nvalidated) and leave a TODO for realistic lower bounds on the polling timeouts.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4253] Unify min-parallelism with max-parallelism as nullable Integer\n\nDrop the dual int/String representation of min-parallelism in favor of a\nsingle nullable Integer, mirroring max-parallelism: the value is strictly\nparsed in parse() (a malformed numeric throws there, honoring parse()\u0027s\ncontract, instead of being silently degraded to 0 by the lenient keeper\nresolver), and null encodes \"unset\". validate() then only checks the\nsemantic bounds (non-negative, max \u003e\u003d min).\n\nAlso align the trim semantics of the lenient resolveMinParallelism() path\nwith the strict one so a whitespace-padded value (e.g. \" 5 \") that\nvalidate() accepts resolves to the same floor the keeper reads, instead of\nsilently degrading to 0 at runtime.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4253] Cite the actually-used key in the min-parallelism parse error\n\nWhen min-parallelism is configured only via the deprecated flat key, a\nmalformed value reported the namespaced \u0027dynamic-allocation.min-parallelism\u0027\nthe user never set. Pick the value and its source key together so the error\nnames the key the value actually came from, folding the former\nrawMinParallelism helper into parseMinParallelism.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4253] Drop the inert DRA validation block from queue loading\n\nThe startup validate/fallback block in loadOptimizingQueues was\nbehaviorally inert: the disable is already implicit (isEffectivelyEnabled()\ntreats an invalid config as disabled wherever DRA is consumed), and in\nPhase 1 nothing strictly parses DRA config at load, so there was no crash\nto guard against. Validating inside the queue loader also mixed an unrelated\nconcern into it. Surfacing invalid configs as an alertable signal belongs\nwith the metric that lands in the observability phase.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "498ea2716df26ce0677e53401fb8d5c3058aa2c6",
      "tree": "39fa4efa49514f56ee09517f7c52ebdc03dfdb15",
      "parents": [
        "89d27bcd67541a6d3cc3a983cd9fe09a6e9c5cfb"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Wed Jul 08 19:41:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 19:41:59 2026 +0800"
      },
      "message": "[AMORO-4263] Persist cleanup operation metrics for Dashboard display (#4265)\n\n* Persist cleanup operation metrics for Dashboard display\n\n* fixup  metric\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e\nCo-authored-by: ConradJam \u003cjam.gzczy@gmail.com\u003e"
    },
    {
      "commit": "89d27bcd67541a6d3cc3a983cd9fe09a6e9c5cfb",
      "tree": "c638dc44055c9b631a209b1032c48253b6166301",
      "parents": [
        "d1dca2749a5c36a37c450734b6e826f07f272929"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Mon Jul 06 13:46:37 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 12:46:37 2026 +0800"
      },
      "message": "[AMORO-4198][optimizer] Support graceful shutdown for in-progress tasks (#4197)\n\n* [AMORO][optimizer] Support graceful shutdown for in-progress tasks\n\nOn SIGTERM the optimizer flips its stopped flag and returns immediately,\nso in-flight task results are silently dropped (completeTask is gated by\nisStarted). On K8s this is compounded by `sh -c` swallowing SIGTERM, a\n30s default grace period, and Hadoop\u0027s FileSystem cache cleanup racing\nJVM shutdown hooks.\n\n- Optimizer.stopOptimizing: join executors with a deadline, force\n  interrupt only on timeout; keep toucher alive so AMS heartbeats\n  continue while tasks drain.\n- OptimizerExecutor.completeTask: best-effort direct call after stop so\n  the in-flight result still reaches AMS.\n- SparkOptimizer / StandaloneOptimizer: register on Hadoop\n  ShutdownHookManager (priority above FS_CACHE / SparkContext) with an\n  explicit per-hook timeout.\n- OptimizerConfig: new -st / --shutdown-timeout-ms (default 600s).\n- KubernetesOptimizerContainer: `sh -c \u0027exec \u003cargs\u003e\u0027` and an explicit\n  terminationGracePeriodSeconds derived from -st + 30s buffer; user\n  podTemplate values are respected.\n- optimizer.sh start-foreground: exec $CMDS so java gets PID 1.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO][optimizer] Wire shutdown-timeout-ms group property to -st startup arg and K8s grace period\n\nThe -st/--shutdown-timeout-ms option was parsed by the optimizer but AMS\nnever emitted it into the startup args, so the configured shutdown timeout\nwas unreachable for AMS-spawned optimizers and the K8s grace period was\npinned at the default.\n\n- Emit \u0027-st \u003cvalue\u003e\u0027 in buildOptimizerStartupArgsString when the optimizer\n  group sets the shutdown-timeout-ms property (same pattern as -hb), which\n  wires all containers sharing the args builder.\n- Derive terminationGracePeriodSeconds from the same resource property that\n  drives the -st arg via PropertyUtil, instead of re-parsing the rendered\n  CLI string, and remove parseShutdownTimeoutMs. Reading from one source\n  guarantees the pod\u0027s SIGKILL deadline can never fall below the shutdown\n  timeout the optimizer JVM actually honors.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO][optimizer] Add graceful drain to Flink optimizer on job cancellation\n\nFlinkExecutor.close() previously interrupted the executor thread after a\nhardcoded 5s join, killing in-progress tasks on job cancellation and\nsilently ignoring the -st/--shutdown-timeout-ms option on the Flink engine.\n\n- close() now stops the executor first, waits up to the configured\n  shutdown timeout for the in-progress task to complete (so its result is\n  reported to AMS), and only then force-interrupts.\n- The drain absorbs interrupts of the thread running close(): Flink\u0027s\n  cancellation machinery (TaskCanceler/TaskInterrupter) interrupts the\n  task thread to unblock I/O, which must not abort the drain early.\n- The drain budget is capped safely below Flink\u0027s cancellation watchdog\n  (task.cancellation.timeout, default 180s), which would otherwise fail\n  the whole TaskManager; operators wanting longer drains must raise both\n  settings, as documented.\n- Document the shutdown-timeout-ms group property, the -st option for\n  Flink/Spark external optimizers, and the interaction with\n  task.cancellation.timeout.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO][optimizer] Harden the shutdown drain so finished task results survive\n\nFixes several defects in the graceful-shutdown paths that could still lose\nthe result of a task that completed during the drain, or leave the process\nin a bad state:\n\n- Optimizer.startOptimizing published the executorThreads array before\n  filling its elements; a concurrent shutdown hook could observe null\n  elements and skip joining executor threads that were already running\n  tasks. Build the array fully, then publish, then start the threads.\n- The force-interrupt pass in stopOptimizing interleaved interrupt with\n  per-thread 1s joins: when the stopping thread was itself interrupted\n  (e.g. the shutdown-hook watchdog cancelling a timed-out hook), join()\n  threw instantly and executor threads after the first were never\n  interrupted; the per-thread joins also overshot the deadline by up to N\n  seconds. Interrupt all survivors first, then await them against one\n  shared deadline, restoring the caller\u0027s interrupt status only after\n  cleanup completes.\n- waitAShortTime restored the interrupt flag unconditionally, but no\n  caller loop ever clears it: a stray interrupt while still running turned\n  every subsequent sleep into an instant return, busy-spinning the\n  poll/retry loops. Preserve the flag only once the operator is stopped.\n- completeTask checked isStarted() once at entry and fell back to a single\n  best-effort call after stop, so a result finishing during shutdown was\n  dropped on a stop/report race or one transient AMS error. It now retries\n  through callAuthenticatedAmsWithDrain: a bounded window anchored at the\n  moment shutdown is observed, reusing the existing transient-error and\n  auth handling, aborted early by the shutdown force-interrupt. The mock\n  AMS gains transient-failure injection to cover this.\n- The toucher stays alive during the drain for heartbeats, but scale-down\n  unregisters the optimizer before the pod receives SIGTERM; the resulting\n  auth error made the toucher re-register a ghost optimizer and rotate the\n  executors\u0027 token so their final completeTask was rejected. Drain mode\n  now skips re-registration once the token becomes invalid.\n- The graceful-shutdown test timed stop() with fixed sleeps against the\n  poll cadence (~0.5s margins on CI); slow test tasks now signal a latch\n  when execute() begins so the test stops the optimizer deterministically.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO][optimizer] Keep the optimizer registration alive during the Flink drain\n\nFlink cancels the FlinkToucher source before downstream operators, so\nheartbeats stop the moment the drain in FlinkExecutor.close() begins. AMS\nthen expires the optimizer after optimizer.heart-beat-timeout (default\n1 min) and, in the same sweep, unregisters it and resets its in-flight\ntasks — so any task finishing later than that lost its result even though\nthe drain was still waiting, capping the effective drain window at the\nheartbeat timeout instead of the configured shutdown timeout.\n\nThe drain loop now sends a best-effort touch with the existing token\nbetween join slices, at the configured heartbeat interval. Touching keeps\nthe registration and the task assignment alive for exactly as long as the\ndrain runs; it never re-registers (consistent with the drain-mode\ntoucher), and once close() returns the touches stop and AMS cleans up\nthrough the normal expiration path.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "d1dca2749a5c36a37c450734b6e826f07f272929",
      "tree": "ab6b601687bb964b03c5f25dfa642633bfb23938",
      "parents": [
        "2b3027d9c95e37fc329eeec7fb6d04f2963284b3"
      ],
      "author": {
        "name": "nathan.ma",
        "email": "majin1102@gmail.com",
        "time": "Thu Jun 25 14:54:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 14:54:58 2026 +0800"
      },
      "message": "[AMORO-3837] Integrate lance format (#4051)\n\n* Add Lance format support\n\n* Align Lance Arrow dependencies\n\n* Fix Lance CI dependency checks\n\n* Fix catalog refresh properties\n\n* Restore catalog refresh behavior\n\n* Fix Lance catalog exception handling\n\n* Avoid exposing Lance catalog credentials\n\n* Fix Lance catalog storage handling\n\n* Fix Lance OSS endpoint catalog config\n\n* Fix Lance database discovery semantics\n\n* Fix Lance load table fallback semantics\n\n---------\n\nCo-authored-by: majin.nathan \u003cmajin.nathan@bytedance\u003e\nCo-authored-by: ConradJam \u003cjam.gzczy@gmail.com\u003e"
    },
    {
      "commit": "2b3027d9c95e37fc329eeec7fb6d04f2963284b3",
      "tree": "ecbfe92ed8468644c2cb3d1c4008430d936fcc57",
      "parents": [
        "9126f7318adbe70e6d30dacfc5994e2f28f4e32e"
      ],
      "author": {
        "name": "Nikhil Ujjwal",
        "email": "67941788+NikhilUjjwal7@users.noreply.github.com",
        "time": "Wed Jun 24 21:33:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 00:03:27 2026 +0800"
      },
      "message": "[AMORO-4211] Fix legacy Flink config loading (#4249)\n\nFix legacy Flink config loading\n\nCo-authored-by: nujjwal \u003cnujjwal@cisco.com\u003e"
    },
    {
      "commit": "9126f7318adbe70e6d30dacfc5994e2f28f4e32e",
      "tree": "958cea2a223e6c57a123139ad79f6d2e78c7281b",
      "parents": [
        "bc83f0834d0f7c88d43f8add0312d29555aa063e"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Wed Jun 24 18:51:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 18:51:50 2026 +0800"
      },
      "message": "[AMORO-3853] Support Java 17 build for Amoro (#4244)\n\n* Refactor flink module for JDK 17 support\n\nAdd JDK 17 compatibility\n\n* Update SLF4J dependency to version 2.0.17 and adjust README for JDK compatibility\n\n* Fix CI configuration to properly format JDK matrix in core-hadoop3-ci.yml\n\n* Fix CI configuration to properly format JDK matrix in core-hadoop3-ci.yml\n\n* Stabilize continuous optimizing tests on Java 17\n\n* Update TestAutomaticLogWriter to use truncated LocalDateTime for consistency in time calculations\n\n* Remove reflective invocation of emitPeriodicWatermark in MixedFormatSourceReader\n\n* use FlinkWriteResult for consistency\n\n* Add locality exposure in IcebergClassUtil and implement tests for file committer\n\n* Remove Java 17 from CI build matrix and update wrapKrb method to accept nullable startSnapshotId\n\n* spotless\n\n* address"
    },
    {
      "commit": "bc83f0834d0f7c88d43f8add0312d29555aa063e",
      "tree": "7a047419c087b326f4a66e920944299efd01f773",
      "parents": [
        "675c222c3c3e208a1603415b1696704cc9de4621"
      ],
      "author": {
        "name": "felixhzhu",
        "email": "43262022+felixhzhu@users.noreply.github.com",
        "time": "Wed Jun 24 11:07:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 11:07:18 2026 +0800"
      },
      "message": "Fix expireSnapshots fails with IllegalArgumentException on object-store-backed tables (#4259)\n\n[AMORO-4237][Iceberg] Fix expireSnapshots fails with IllegalArgumentException on object-store-backed tables\n\nWhen the underlying FileIO is an object store (S3FileIO/OSSFileIO/GCSFileIO), deleteEmptyDirectory() calls asFileSystemIO() which throws IllegalArgumentException because supportFileSystemOperations() returns false.\n\nFix: 1) Add early-return in TableFileUtil.deleteEmptyDirectory() when !supportFileSystemOperations() 2) Guard the parent directory cleanup loop in RollingFileCleaner with supportFileSystemOperations() check 3) Move buffer clear() into finally block to prevent re-submission on failure\n\nfix #4237\n\nCo-authored-by: felixhzhu \u003cfelixhzhu@tencent.com\u003e"
    },
    {
      "commit": "675c222c3c3e208a1603415b1696704cc9de4621",
      "tree": "ef721ee6ab44fb04a5c773a7428701a92b27302d",
      "parents": [
        "b3bf85ab5b74f553f5d63c79d25e3d1b14347c12"
      ],
      "author": {
        "name": "felixhzhu",
        "email": "43262022+felixhzhu@users.noreply.github.com",
        "time": "Wed Jun 24 11:03:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 11:03:38 2026 +0800"
      },
      "message": "[AMORO-4257][AMS] Fix duplicate process ID caused by multiple SnowflakeIdGenerator instances (#4258)\n\nConsolidate multiple independent SnowflakeIdGenerator instances into a single global singleton (SnowflakeIdGenerator.INSTANCE) to prevent ID collisions when two instances generate IDs in the same 10ms time window with the same machineId\u003d0.\n\nfix #4257\n\nCo-authored-by: felixhzhu \u003cfelixhzhu@tencent.com\u003e"
    },
    {
      "commit": "b3bf85ab5b74f553f5d63c79d25e3d1b14347c12",
      "tree": "153d092a5fe5e859a4fdf7d26f4897ce84f652ac",
      "parents": [
        "374ed06bdb3d2de20856f6e2f13b4a5c49cc4757"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Wed Jun 24 11:03:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 11:03:19 2026 +0800"
      },
      "message": "[hotfix] Cleanup empty columns from Cleanup and Profiling pages (#4260)\n\nCleanup empty columns from Cleanup and Profiling pages\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "374ed06bdb3d2de20856f6e2f13b4a5c49cc4757",
      "tree": "6aae6f7a0801162b5adb43fc16c3b8345d2661b0",
      "parents": [
        "acf8ef47a3d9305ef217399a9aeb8c6d312bbe75"
      ],
      "author": {
        "name": "ZhouJinsong",
        "email": "zhoujinsong0505@163.com",
        "time": "Mon Jun 15 10:56:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 10:56:17 2026 +0800"
      },
      "message": "Revert \"[AMORO-4246] Refactor process data expiring via ProcessFactory plugin\" (#4252)\n\nRevert \"[AMORO-4246] Refactor process data expiring via ProcessFactory plugin…\"\n\nThis reverts commit acf8ef47a3d9305ef217399a9aeb8c6d312bbe75."
    },
    {
      "commit": "acf8ef47a3d9305ef217399a9aeb8c6d312bbe75",
      "tree": "243a1133abb93f3046cbf5213bfcbe6484e13c65",
      "parents": [
        "c812511fb0f9a969604c6b3a8c082062b696bb6d"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Thu Jun 11 17:16:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 17:16:56 2026 +0800"
      },
      "message": "[AMORO-4246] Refactor process data expiring via ProcessFactory plugin (#4247)\n\n* Refactor process data expiring via ProcessFactory plugin\n\n* fixup\n\n* fixup\n\n* fixup\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "c812511fb0f9a969604c6b3a8c082062b696bb6d",
      "tree": "6aae6f7a0801162b5adb43fc16c3b8345d2661b0",
      "parents": [
        "4ed2e91e3f70f3f3c0f8ca2b0cda5e187608041e"
      ],
      "author": {
        "name": "somaz",
        "email": "112675579+somaz94@users.noreply.github.com",
        "time": "Thu Jun 11 18:11:22 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 17:11:22 2026 +0800"
      },
      "message": "[AMORO-4242][Helm] Add Gateway API HTTPRoute support to the Amoro chart (#4243)\n\nSigned-off-by: somaz \u003cgenius5711@gmail.com\u003e"
    },
    {
      "commit": "4ed2e91e3f70f3f3c0f8ca2b0cda5e187608041e",
      "tree": "5b7e1c1e8ea355868db6810171c15ee84f8fbe01",
      "parents": [
        "d8f379346fcc8eb899808fbf2d41d39009b6b4ac"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Tue Jun 09 17:04:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 17:04:59 2026 +0800"
      },
      "message": "[AMORO-4236]  Splitting the “Optimizing” tab into the “Optimizing” tab,“Cleanup” tab and “Profiling” tab (#4238)\n\n* Add Maintenance tab for table process management\n\n* fix optimizing types in PaimonTableDescriptor\n\n* Refactor OPTIMIZING tab from OPTIMIZING to OPTIMIZING/CLEANUP/PROFILING tab\n\n* Replace static resolveCategoryTypes/matchProcessCategory with instance method getProcessTypesByCategory, moving routing logic into each descriptor.\n\n* fixup style\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "d8f379346fcc8eb899808fbf2d41d39009b6b4ac",
      "tree": "69d2319f446b04e64a9d1b7db3b900610c9daedb",
      "parents": [
        "be6663bcfa34eb10a91899480c33078a9a499469"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Thu May 28 14:56:34 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 13:56:34 2026 +0800"
      },
      "message": "[Hotfix] Force ReachableFileCleanup when snapshots exist outside main ancestry (#4231)\n\n[optimizer] Force reachable cleanup when snapshots exist outside main ancestry\n\nIceberg\u0027s auto-selected IncrementalFileCleanup can silently truncate its\nancestor walk when a parent snapshot is missing, deleting data files the\ncurrent snapshot still references. Force the safe ReachableFileCleanup only\nwhen snapshots exist outside the main ancestry; healthy tables are unchanged.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "be6663bcfa34eb10a91899480c33078a9a499469",
      "tree": "fd15588819276f355b7e05f262651c30e4a2114d",
      "parents": [
        "99fcc08893c3dd8a8340f9d05124e70c48adf1d5"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Mon May 25 15:00:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 15:00:28 2026 +0800"
      },
      "message": "[AMORO-4229] Refactor synchronizing Hive tables process via ProcessFactory plugin (#4230)\n\n* Refactor synchronizing Hive tables process via ProcessFactory plugin\n\n* Adding table format check\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "99fcc08893c3dd8a8340f9d05124e70c48adf1d5",
      "tree": "f9f3b175113780205888295614a0f7c8ce2418b0",
      "parents": [
        "23b0ab98ef4a07b60a7e4637692fb582fe8e8ca8"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Fri May 22 10:53:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 10:53:56 2026 +0800"
      },
      "message": "[AMORO-4227] Refactor auto-creating iceberg tags via ProcessFactory plugin (#4228)\n\nRefactor auto-creating iceberg tags via ProcessFactory plugin\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "23b0ab98ef4a07b60a7e4637692fb582fe8e8ca8",
      "tree": "d0f9405f862b20697459bbf73989e313b6e8d15d",
      "parents": [
        "e75b4a0b3cdba96a24ca7af1cd86833a1167dc99"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Wed May 20 14:57:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 14:57:19 2026 +0800"
      },
      "message": "[AMORO-4217] Clean up invalid code and parameters left over from the snapshot-expiring refactoring (#4226)\n\n* Remove unused code\n\n* Add assertions for containers in JacksonUtilTest\n\n* Clean up JacksonUtilTest by removing blank line\n\nRemoved unnecessary blank line in JacksonUtilTest.\n\n* Remove unnecessary newline in jacksonTest method\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "e75b4a0b3cdba96a24ca7af1cd86833a1167dc99",
      "tree": "dcadb7a31dbf522f3395771daa9b3a466367f83f",
      "parents": [
        "467930937fde7c2b3a6e7ef5e4f479104997872b"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Wed May 20 10:51:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 10:51:31 2026 +0800"
      },
      "message": "[AMORO-4186] Add support for Parquet row-group merging in IcebergRewriteExecutor (#4188)\n\n* Add support for Parquet row-group merging in IcebergRewriteExecutor\n\n* Enhance Parquet row-group merge support for Iceberg V2 tables and add version checks\n\n* Add cleanup for orphaned merged output files in Parquet row-group merge\n\n* Refactor ParquetFileMergeRunner to simplify ParquetWriter initialization\n\n* Implement Parquet schema context preparation for row-group merging in IcebergRewriteExecutor\n\n* Add minimum average row-group size threshold for Parquet row-group merge\n\n* fixup\n\n* fixup style\n\nRemoved unnecessary line breaks in the class documentation.\n\n* fixup style\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "467930937fde7c2b3a6e7ef5e4f479104997872b",
      "tree": "353f0c61d7fe452b7548417b1222e504341496d8",
      "parents": [
        "38ef38134d54a7381a351b4f17cba42a6c5356ac"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Tue May 19 21:32:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 21:32:16 2026 +0800"
      },
      "message": "[hotfix] Unify action names, pool names, and constants for SnapshotsExpiringProcess and OrphanFilesCleaningProcess (#4225)\n\nUnify action names, pool names, and constants for SnapshotsExpiringProcess and OrphanFilesCleaningProcess\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "38ef38134d54a7381a351b4f17cba42a6c5356ac",
      "tree": "76096727b35ceeb299320efb5e37bfffd155c76b",
      "parents": [
        "1d4bc38be54604ed2b73c7632864c498a9621d02"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Tue May 19 15:36:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 15:36:26 2026 +0800"
      },
      "message": "[AMORO-4215] Refactor data expiring via ProcessFactory plugin (#4218)\n\n* Refactor DataExpiringExecutor via ProcessFactory plugin\n\n# Conflicts:\n#\tamoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/process/iceberg/IcebergProcessFactory.java\n\n# Conflicts:\n#\tamoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/process/iceberg/IcebergProcessFactory.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableRuntime.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/table/cleanup/CleanupOperation.java\n#\tamoro-ams/src/test/java/org/apache/amoro/server/process/iceberg/TestIcebergProcessFactory.java\n#\tamoro-ams/src/test/java/org/apache/amoro/server/scheduler/inline/PeriodicTableSchedulerTestBase.java\n#\tamoro-ams/src/test/java/org/apache/amoro/server/scheduler/inline/TestPeriodicTableSchedulerCleanup.java\n#\tamoro-common/src/test/java/org/apache/amoro/process/TestLocalExecutionEngine.java\n#\tdist/src/main/amoro-bin/conf/plugins/execute-engines.yaml\n#\tdist/src/main/amoro-bin/conf/plugins/process-factories.yaml\n#\tdocs/admin-guides/deployment.md\n#\tdocs/configuration/ams-config.md\n\n* Add recover logic\n\n* Fix logging message formatting in DataExpiringProcess\n\n* Fix data expiration property name in documentation\n\nCorrected the property name from \u0027expire-data\u0027 to \u0027data-expiration\u0027 in the documentation.\n\n* Update using-tables.md\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "1d4bc38be54604ed2b73c7632864c498a9621d02",
      "tree": "60828d2fce09b585c5e1a3d96009c3945e5ea226",
      "parents": [
        "cba754f5994341e5a9da445c67843e4469f20217"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Tue May 19 11:13:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 11:13:16 2026 +0800"
      },
      "message": "[AMORO-4223][ams] Fix AMS startup crash when recovering Iceberg maintenance processes (#4224)\n\nIcebergProcessFactory.recover() was a stub that unconditionally threw\nRecoverProcessFailedException. Since ProcessService.recoverProcesses()\nhad no per-record error handling, any SUBMITTED/RUNNING Iceberg\nexpire-snapshots or clean-orphan-files record made AMS fail to start and\nenter a crash loop with no automatic recovery.\n\nChanges:\n- Implement IcebergProcessFactory.recover(): dispatch by the persisted\n  action and rebuild SnapshotsExpiringProcess / OrphanFilesCleaningProcess\n  bound to the local engine. Both are stateless, idempotent one-shot local\n  maintenance tasks, so re-running them on recovery is safe.\n- Harden ProcessService.recoverProcesses(): recover each record in its own\n  try/catch; on failure log it, mark the record FAILED and skip it so a\n  single un-recoverable record can no longer abort the whole AMS startup.\n- Add Action.toString() returning the action name so diagnostic logs print\n  a readable name instead of org.apache.amoro.Action@hash.\n- Add unit tests for IcebergProcessFactory.recover() and Action.toString(),\n  and a regression test covering the recoverProcesses() fail-safe path.\n\nCo-authored-by: lintingbin \u003clintingbin31@gmail.com\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "cba754f5994341e5a9da445c67843e4469f20217",
      "tree": "0e9e9905ef3fb3f4648a8853672062861d886de2",
      "parents": [
        "22092632f80badbee584bd9f920e853a1daf9734"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Tue May 19 11:11:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 11:11:08 2026 +0800"
      },
      "message": "[AMORO-4220] [Improvement] Support BETWEEN and reversed comparison SQL filters in ExpressionUtil. (#4221)\n\n[AMORO-4420] [Improvement] Support BETWEEN and reversed comparison SQL filters in ExpressionUtil."
    },
    {
      "commit": "22092632f80badbee584bd9f920e853a1daf9734",
      "tree": "4f70be1840c299aebc56b1ee931fd1da066954b9",
      "parents": [
        "0c5d3d84c6ba544adb10bdd4d4893de489e3dd4b"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Tue May 19 11:09:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 11:09:06 2026 +0800"
      },
      "message": "[Hotfix] Update release validation instructions to use ./mvnw for building (#4222)\n\nUpdate release validation instructions to use ./mvnw for building"
    },
    {
      "commit": "0c5d3d84c6ba544adb10bdd4d4893de489e3dd4b",
      "tree": "c1db568594b429a9ad7368fe8d18e3e75caefd66",
      "parents": [
        "75dd6570c0d8125bf892a2747342a16df089351d"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Tue May 19 10:24:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 10:24:53 2026 +0800"
      },
      "message": "[AMORO-4216] Refactor dangling-delete-files-cleaning via ProcessFactory plugin (#4214)\n\n* Refactor dangling-delete-files-cleaning via ProcessFactory plugin\n\n# Conflicts:\n#\tamoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/process/iceberg/IcebergProcessFactory.java\n#\tamoro-ams/src/main/java/org/apache/amoro/server/scheduler/inline/InlineTableExecutors.java\n\n* Fix IcebergActions init failure by increasing MAX_NAME_LENGTH to 32\n\n* rename action to clean-dangling-delete-files to fix pool tag mismatch\n\n* Fix: LocalProcess exceptions were swallowed, preventing state from being updated to FAILED\n\nProblem Analysis:\n- In DanglingDeleteFilesCleaningProcess, SnapshotsExpiringProcess, and OrphanFilesCleaningProcess, exceptions in the run() method were caught but not re-thrown\n- This caused LocalExecutionEngine.ProcessHolder.onComplete() to never detect failures\n- Process status was always set to SUCCESS even when execution actually failed\n\nFix:\n- Add  in the catch block to re-throw exceptions\n- Keep existing logging for troubleshooting\n- Ensure exceptions properly propagate to ProcessHolder so status is correctly updated to FAILED\n\nModified Files:\n- amoro-ams/src/main/java/.../DanglingDeleteFilesCleaningProcess.java\n- amoro-ams/src/main/java/.../SnapshotsExpiringProcess.java\n- amoro-ams/src/main/java/.../OrphanFilesCleaningProcess.java\n\n* Fix logging message for dangling delete files error\n\n* Fix formatting of class documentation comment\n\n* fixup style\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "75dd6570c0d8125bf892a2747342a16df089351d",
      "tree": "3dd86c9138f531aac885ea61a6612504594427c9",
      "parents": [
        "cf8ff05d72c67353fa8a76d1d73437abc3043ea7"
      ],
      "author": {
        "name": "WenLingzhang",
        "email": "1298877813@qq.com",
        "time": "Thu May 14 15:07:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 15:07:50 2026 +0800"
      },
      "message": "[AMORO-4208] Refactor orphan-files-cleaning via ProcessFactory plugin (#4209)\n\n* Refactor orphan-files-cleaning via ProcessFactory plugin\n\n# Conflicts:\n#\tamoro-common/src/test/java/org/apache/amoro/process/TestLocalExecutionEngine.java\n\n* Remove unused orphan file cleaning configs and inline executor\n\n* Add process factory and execute engine configuration docs\n\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "cf8ff05d72c67353fa8a76d1d73437abc3043ea7",
      "tree": "5c2404c815e2178def5fab736a59569250f7bacf",
      "parents": [
        "4d861516082a4d1cfa36c6a723a03f96157c84c3"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Thu May 07 16:07:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 16:07:23 2026 +0800"
      },
      "message": "[AMORO-4203][optimizer-common] Migrate tests from JUnit 4 to JUnit 5 (#4204)\n\nMigrate the 5 test files in amoro-optimizer-common to JUnit Jupiter:\nOptimizerTestBase, TestOptimizer, TestOptimizerToucher, TestOptimizerExecutor,\nTestOptimizerConfig.\n\nOptimizerTestBase no longer uses @ClassRule on TestAms (which still extends\nExternalResource until the closing PR of #4203). Its public before()/after()\nare invoked from @BeforeAll/@AfterAll instead, which preserves the original\nlifecycle without forcing TestAms itself to migrate yet. The duplicated\n@BeforeClass reduceCallAmsInterval() in TestOptimizer is dropped because the\nparent already runs it.\n\nMechanical changes elsewhere: org.junit.* -\u003e org.junit.jupiter.api.*;\n@Before/@After -\u003e @BeforeEach/@AfterEach; Assert.assertX -\u003e Assertions.assertX;\n@Test(expected\u003dCmdLineException.class) in TestOptimizerConfig -\u003e three\nAssertions.assertThrows(...) calls.\n\nmvn -pl amoro-optimizer/amoro-optimizer-common -am test passes (10/10)."
    },
    {
      "commit": "4d861516082a4d1cfa36c6a723a03f96157c84c3",
      "tree": "8f37da80da453eb7ddbe127696be14528a894538",
      "parents": [
        "08d49f4f3fa60ce3c96eb4c824b445e9f276d423"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Thu May 07 10:27:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 10:27:49 2026 +0800"
      },
      "message": "[AMORO-3974][common] Migrate self-contained tests from JUnit 4 to JUnit 5 (#4199)\n\nMigrate the JUnit 4 test classes in amoro-common that have no\nexternal JUnit 4 consumers to JUnit 5 (org.junit.jupiter):\n\n- TestLocalExecutionEngine\n- TestSimpleFuture\n- JacksonUtilTest\n- MemorySizeTest\n- TestPoolConfig\n- MockZookeeperServer\n\nShared test base classes and rule helpers (TestAms, TestHMS,\nAmoroCatalogTestBase, TestAmoroCatalogBase, TestServerTableDescriptor,\nAmoroRunListener) are kept on JUnit 4 because they are still extended\nor referenced as @Rule/@ClassRule by JUnit 4 tests in other modules\n(amoro-ams, amoro-format-iceberg, amoro-format-paimon,\namoro-format-mixed-flink, etc.). They will be migrated together with\nthose consumers in a follow-up so the JUnit 4 dependency can be dropped.\n\nCo-authored-by: Lin Tingbin \u003clintingbin31@gmail.com\u003e"
    },
    {
      "commit": "08d49f4f3fa60ce3c96eb4c824b445e9f276d423",
      "tree": "a6a114fd571cec217be1ece2adae389c12e6bcbf",
      "parents": [
        "ec2a448b32d22dbc25b8f8586cef65897e02b263"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Thu Apr 23 17:12:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 23 17:12:15 2026 +0800"
      },
      "message": "[AMORO-4163][ams] Fix Version-N-already-exists race in newTableOperations for legacy mixed-iceberg (#4185)\n\nWhen AMS saves a new legacy mixed-iceberg table to the database, a background\ntable-explorer thread can concurrently pick up the same table and call\nnewTableOperations(), which now commits the mixed-format properties to the\nIceberg metadata (introduced by the AMORO-4163 fix).  If the background thread\nwins the race and writes v2.metadata.json before the onTableCreated() path\nattempts the same commit, HadoopTableOperations throws CommitFailedException:\n\"Version 2 already exists\", aborting the createTableMeta RPC.\n\nFix: catch CommitFailedException in the commit block, refresh to obtain the\nlatest on-disk metadata, and proceed if a concurrent writer already committed\nthe correct properties.  Re-throw only when the properties still differ after\nrefresh, indicating a genuine commit conflict.\n\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ec2a448b32d22dbc25b8f8586cef65897e02b263",
      "tree": "aaa3fb31e4e5e6e9853861d7cf1cd4b73a2b5591",
      "parents": [
        "dad2c9fbea624e159653c123e2747c6091ea9cc0"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Wed Apr 22 18:04:52 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 17:04:52 2026 +0800"
      },
      "message": "[AMORO-4190][ams] Graceful handling of catalog initialization failures in DefaultCatalogManager (#4189)\n\n[Improvement] Graceful handling of catalog initialization failures in DefaultCatalogManager\n\n- Wrap individual catalog loading in try-catch during initialization so\n  that a single catalog failure is logged and skipped rather than crashing AMS\n- When a catalog is not present in serverCatalogMap (failed to initialize),\n  fall back to updating DB directly and attempt to rebuild with the new metadata\n- Add tests verifying both initialization resilience and update recovery\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "dad2c9fbea624e159653c123e2747c6091ea9cc0",
      "tree": "d43b238359e51475c8464da76d94de7f0c590c7c",
      "parents": [
        "d6b2cda8546ed27f40709df8541bc31420f827ba"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Tue Apr 21 21:18:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 21:18:34 2026 +0800"
      },
      "message": "[Hotfix][ams] Fix ResourceMapper.selectResourcesByGroup result mapping (#4194)\n\nThe @Result property names did not match the fields on Resource:\n- group -\u003e groupName\n- container -\u003e containerName\n- totalMemory -\u003e memoryMb\n\nThe start_time column and its @Result mapping were removed because\nResource has no startTime field; MyBatis would silently drop it anyway.\n\nThis method is currently only declared/implemented via\nDefaultOptimizerManager.listResourcesByGroup with no caller on master,\nso no behavioral change is observable. Fixing it now unblocks any future\ncaller (e.g. auto-restart feature) from getting back empty-field Resource\nobjects."
    },
    {
      "commit": "d6b2cda8546ed27f40709df8541bc31420f827ba",
      "tree": "2b90f1afe1b29942da1046bab599e70092f49823",
      "parents": [
        "93cde394135fe94f350d588364028f2af6764fdc"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Tue Apr 21 16:29:53 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 15:29:53 2026 +0800"
      },
      "message": "[AMORO-4193][ams] Fix MysqlDataTruncation caused by negative finishTime in TableProcessMeta (#4192)\n\n* Fix MysqlDataTruncation caused by negative finishTime in TableProcessMeta\n\nWhen creating a new TableProcessMeta via createProcessMeta(), finishTime\nwas initialized to -1. Long2TsConverter only converted 0 to null, so\nTimestamp(-1) was passed to MySQL, which is outside the valid TIMESTAMP\nrange (1970-01-01 00:00:01 UTC ~), causing MysqlDataTruncation.\n\n- Long2TsConverter: convert parameter \u003c\u003d 0 to null instead of only 0\n- TableProcessMeta: initialize finishTime to 0 in createProcessMeta()\n  for consistency with the of() factory method\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Add unit tests for Long2TsConverter\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "93cde394135fe94f350d588364028f2af6764fdc",
      "tree": "71379458dd37ea85b714afd749db324aca8948ef",
      "parents": [
        "80e3310208209bf9f4970f6929b827353b69a9ca"
      ],
      "author": {
        "name": "Takch02",
        "email": "lim70kr38@gmail.com",
        "time": "Sun Apr 19 17:11:57 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 19 16:11:57 2026 +0800"
      },
      "message": "[AMORO-4131] Add non-partitioned table tests for RewriteFiles and OverwriteFiles (#4137)\n\n* Test : Add NonPartition Test case of RewriteFile\n\nTest : Add NonPartition Test case of RewriteFile\n\n* Test : Add NonPartition Test case of OverwriteFile\n\n* style: fix spotless formatting for hive tests\n\n* fix: enforce Hive location consistency for non-partitioned tables on rewrite and overwrite\n\n---------\n\nCo-authored-by: ConradJam \u003cjam.gzczy@gmail.com\u003e"
    },
    {
      "commit": "80e3310208209bf9f4970f6929b827353b69a9ca",
      "tree": "1de760e25aff32a39633f7da6b1ca36031cf4074",
      "parents": [
        "7b19b7eaaa6f5ddd809d75886e15916b7ab57126"
      ],
      "author": {
        "name": "Darcy",
        "email": "lintingbin@lilith.com",
        "time": "Thu Apr 16 10:17:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 10:17:39 2026 +0800"
      },
      "message": "[AMORO-4163][ams] Fix CommitFailedException when loading legacy mixed-iceberg tables on Iceberg 1.7.2 (#4182)\n\n[AMORO-4163][ams] Fix CommitFailedException when loading legacy mixed-iceberg tables on Iceberg 1.7.x\n\nFound while investigating the CI failure in #4179.\n\nIceberg 1.7.x introduced a breaking change in HadoopTableOperations.commit(): it\nnow uses reference equality (\u003d\u003d) to compare the `base` argument against the cached\ncurrentMetadata. Previously, newTableOperations() called ops.current() to obtain the\ncurrent metadata, but versionAndMetadata() inside commit() may refresh the internal\nstate and return a different object instance. When the two references differ, commit()\nthrows CommitFailedException(\"Cannot commit changes based on stale table metadata\")\neven though the metadata content is identical, causing table loading to fail.\n\nFix: replace ops.current() with ops.refresh() so that the returned TableMetadata\nreference is the same object stored in ops\u0027 internal cache. When commit() then calls\nversionAndMetadata(), it finds the version unchanged on disk and returns the same\ncached reference, satisfying the reference-equality check.\n\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7b19b7eaaa6f5ddd809d75886e15916b7ab57126",
      "tree": "f58d3dfb81c8a96ca1e47d966d4a950508c146a8",
      "parents": [
        "dcab5b572aa4d2d12b6c7bb0923a2f4bce4a402a"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Thu Apr 16 10:09:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 10:09:54 2026 +0800"
      },
      "message": "[Subtask]: Optimizations and troubleshooting for the Master-Slave mode.  (#4174)\n\n* [Subtask]: Fixed several bugs in master-slave mode. #4171\n\n* [Subtask]: Fixed several bugs in master-slave mode. #4171\n\n* [Subtask]: Optimized based on CR feedback. #4171\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "dcab5b572aa4d2d12b6c7bb0923a2f4bce4a402a",
      "tree": "7adb8c84154ca65d95889fc1b9f0770714990e15",
      "parents": [
        "b7f7de31fb1815a9d022d0d76383e9f169e1f955"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Wed Apr 15 17:18:45 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 16:18:45 2026 +0800"
      },
      "message": "Cache dataTasks() result in NodeFileScanTask to avoid repeated list creation (#4146)\n\n* perf: cache dataTasks() result in NodeFileScanTask to avoid repeated list creation\n\ndataTasks() was creating a new List via Stream.concat().collect(toList())\non every call. Since the result is immutable after construction (or after\naddFile() calls complete), cache it lazily and invalidate the cache in\naddFile() when baseTasks or insertTasks are mutated.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Add tests for dataTasks() lazy caching in NodeFileScanTask\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Fix spotless format violations in TestNodeFileScanTask\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "b7f7de31fb1815a9d022d0d76383e9f169e1f955",
      "tree": "e229d6b2d2ae7ece86653233b7fa2755d05d76a4",
      "parents": [
        "10d13d4eb73705cf076fa5e3cb5bc6a31662c7f9"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Wed Apr 15 16:39:46 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 15:39:46 2026 +0800"
      },
      "message": "[AMORO-4099] Add table-summary metric collection option for non-optimizing tables (#4101)\n\n* [AMORO-4099] Add table-summary metric collection option for non-optimizing tables\n\n- Allow collecting table_summary metrics when self-optimizing is disabled\n  by setting table-summary.enabled\u003dtrue\n- Fix periodic collection bug: remove optimizingNotNecessary() call in\n  summary-only branch to prevent snapshot gate from blocking subsequent\n  collections\n- Separate property key from self-optimizing prefix:\n  self-optimizing.table-summary.enabled -\u003e table-summary.enabled\n- Add debug logging for table summary collection path\n- Add comprehensive test coverage for summary-only mode\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Fix review issues: remove double-append bug and redundant tableSummaryOnly gate\n\n- Remove duplicate newAppend().commit() in test appendData() since\n  OptimizingTestHelpers.appendBase() already commits\n- Remove unused AppendFiles import\n- Remove redundant tableSummaryOnly bypass in execute() since\n  snapshotChanged already covers unoptimized data\n- Fix misleading test comment\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Fix property key comment to match actual table property name\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\nCo-authored-by: ConradJam \u003cjam.gzczy@gmail.com\u003e"
    },
    {
      "commit": "10d13d4eb73705cf076fa5e3cb5bc6a31662c7f9",
      "tree": "e7affba3b391a24dde934c5e6ec9751c91d93631",
      "parents": [
        "67feed8c316ba4562dc7303ab07a797501cdd162"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Mon Apr 13 10:59:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 10:59:49 2026 +0800"
      },
      "message": "[Test] Add transactionId assertion in TestDefaultKeyedFile. (#4176)\n\n* [Test] Add transactionId assertion in TestDefaultKeyedFile.\n\n* [Test] Add transactionId assertion in TestDefaultKeyedFile."
    },
    {
      "commit": "67feed8c316ba4562dc7303ab07a797501cdd162",
      "tree": "3cde567e2a88989e258421ec123a4686eab18307",
      "parents": [
        "75916805291773dad5caa1c47a32dc2295e80351"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Fri Apr 10 01:07:02 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 00:07:02 2026 +0800"
      },
      "message": "Replace fully qualified Comparator reference with simple class name in AdaptHiveParquetUtil (#4170)\n\n[refactor] Replace fully qualified Comparator reference with simple class name in AdaptHiveParquetUtil\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "75916805291773dad5caa1c47a32dc2295e80351",
      "tree": "3d7c6371582a2638010b0e1b06717a9d93ba3565",
      "parents": [
        "5c8990523f56f11102fd813f8fa90f90afb99631"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Tue Apr 07 22:19:18 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 21:19:18 2026 +0800"
      },
      "message": "[AMORO-4162] Upgrade Iceberg dependency from 1.6.1 to 1.7.2 (#4163)\n\n* Upgrade Iceberg from 1.6.1 to 1.7.2\n\nBump iceberg.version in root pom.xml and update dependency manifests\nand documentation references.\n\nNotable transitive dependency changes:\n- Avro 1.11.3 → 1.12.0\n- httpclient5 5.3.1 → 5.4, httpcore5 5.2.4 → 5.3\n- New: failsafe 3.3.2\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Adapt to Iceberg 1.7.x API changes\n\n- Migrate WriteResult → FlinkWriteResult in Flink sink pipeline\n- Add FieldGetter[] parameter to RowDataUtil.clone() in RowDataRecordFactory\n- Migrate PruneColumns from ParquetTypeVisitor to TypeWithSchemaVisitor\n- Fix INT96 timestamp min/max statistics byte-order inversion\n- Fork MiniClusterResource (removed in Iceberg 1.7.0) into test package\n- Update MiniClusterResource imports in all test classes\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Add tests for Iceberg 1.7.2 API migration\n\n- TestAdaptHiveParquetSchemaUtil: verify pruneColumns with\n  TypeWithSchemaVisitor correctly prunes columns using expected schema\n- TestAdaptHiveParquetUtil: verify INT96 timestamp min/max statistics\n  are correctly re-ordered when byte-wise ordering disagrees with\n  chronological ordering\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e"
    },
    {
      "commit": "5c8990523f56f11102fd813f8fa90f90afb99631",
      "tree": "f74a54a9f57b54de34b036633462e6790098dc07",
      "parents": [
        "615c7e8c25b6646336440947169ad110ae697fe1"
      ],
      "author": {
        "name": "ConradJam",
        "email": "jam.gzczy@gmail.com",
        "time": "Tue Apr 07 21:06:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 21:06:28 2026 +0800"
      },
      "message": "[hotfix] Implement an independent process history cleanup mechanism and migrate the configuration item to the Duration type. (#4161)"
    },
    {
      "commit": "615c7e8c25b6646336440947169ad110ae697fe1",
      "tree": "144056fa59f9673d900550d1fc4c25dbdaf1b06b",
      "parents": [
        "05ff059df3be0e8769691cbcb57c0338e508b74e"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Tue Apr 07 14:55:32 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:55:32 2026 +0800"
      },
      "message": "Fix flaky TestInternalMixedCatalogService by hardening test cleanup (#4165)\n\n* Fix flaky TestInternalMixedCatalogService by hardening test cleanup\n\nWhen a test method fails mid-way after creating a table but before\ndropping it, the @AfterEach cleanup could not drop the non-empty\ndatabase.  This left residual state that caused cascading failures\nin subsequent nested test classes (Database already exists, assertion\non listDatabases().isEmpty(), etc.).\n\n- CompatibilityCatalogTests.cleanDatabase: drop residual table before\n  dropping database, wrap both in try-catch\n- TestTableCommit.after: guard dropTable with tableExists check, wrap\n  in try-catch to prevent cascading cleanup failures\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Wrap dropDatabase in try-catch in TestTableOperation cleanup\n\nAdd missing try-catch around dropDatabase in TestTableOperation.after()\nfor consistency with TestTableCommit and CompatibilityCatalogTests\ncleanup methods.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "05ff059df3be0e8769691cbcb57c0338e508b74e",
      "tree": "31ef0561333111fa2edebe18bf9874f58caea8ad",
      "parents": [
        "5abacab49f2c7f2df4f5cf6139b048140296b23c"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Tue Apr 07 11:42:10 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 10:42:10 2026 +0800"
      },
      "message": "[Improvement] Move snapshot ID capture in expireFiles() to after delete commit (#4169)\n\nMove snapshot ID capture in expireFiles() to after delete commit\n\nThe snapshot ID passed to RewriteFiles.validateFromSnapshot() was\ncaptured before DeleteFiles.commit(), making it stale for the\nsubsequent RewriteFiles operation. Although the current validation\npath is benign (replacedDataFiles is empty so conflict detection is\nskipped), passing a pre-commit snapshot ID is semantically incorrect\nand fragile against future Iceberg validation changes.\n\nMove the capture to after delete.commit() so that\nvalidateFromSnapshot() always receives the up-to-date snapshot.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "5abacab49f2c7f2df4f5cf6139b048140296b23c",
      "tree": "23eafd6c4d07c20a41e4956392bb707854bd1517",
      "parents": [
        "878d5b01e2eb019f26ac3f5c6a55296d61d336cf"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Mon Apr 06 19:14:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 19:14:44 2026 +0800"
      },
      "message": "[Dependency] Bump versions of Hadoop and Spark (#4168)\n\n* [Dependency] Bump versions of Hadoop and Spark\n\nUpgrade core dependencies to their latest patch versions:\n- Hadoop: 3.4.2 -\u003e 3.4.3\n- Spark: 3.5.7 -\u003e 3.5.8\n\n* [Dependency] Bump versions of Hadoop and Spark\n\nUpgrade core dependencies to their latest patch versions:\n- Hadoop: 3.4.2 -\u003e 3.4.3\n- Spark: 3.5.7 -\u003e 3.5.8"
    },
    {
      "commit": "878d5b01e2eb019f26ac3f5c6a55296d61d336cf",
      "tree": "6905884fb3c1d065c48a9a932bcaef38630eb169",
      "parents": [
        "7b23e5363642c49fdc8f4f355dbd2464e9d84f05"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Fri Apr 03 18:04:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 18:04:28 2026 +0800"
      },
      "message": "[Subtask]: In master-slave mode, each AMS should automatically senses the optimizer.  (#3937)\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n[Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n[Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n[Subtask]: Replace zk with mocking. #3919\n\n[Subtask]: Replace zk with mocking. #3919\n\n[Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n[Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n[Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n[Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n[Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n[Subtask]:  Fix unit test failure issue #3923\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n[Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n[Subtask]: Optimize the logic for retrieving the AMS list from ZooKeeper in master-slave mode. #3928\n\nThis addresses the conflict issues with the latest main branch and introduces a new solution for storing allocation information based on a database.\n\nThis addresses the conflict issues with the latest main branch and introduces a new solution for storing allocation information based on a database.\n\nTroubleshooting unit test failures.\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\nMade-with: Cursor\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\n* [Subtask]: Optimize based on CR\u0027s feedback.#3929\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "7b23e5363642c49fdc8f4f355dbd2464e9d84f05",
      "tree": "10a94bc683fa3aa95de99b49819b216564959a5e",
      "parents": [
        "f6b1e683f4bf650b860e39a09273f52ba703a128"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Thu Apr 02 15:38:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 15:38:37 2026 +0800"
      },
      "message": "[AMORO-3853] Stabilize continuous optimizing tests on Java 17 (#4142)\n\n* Stabilize continuous optimizing tests on Java 17\n\n* Remove unnecessary truncation of nanoseconds in RandomRecordGenerator\n\n* spotless"
    },
    {
      "commit": "f6b1e683f4bf650b860e39a09273f52ba703a128",
      "tree": "6819f2835d8c96ed9feeb42c0d092d12f9a11825",
      "parents": [
        "fa44c915e7a126e404239c170960ab69f2def8d2"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Thu Apr 02 11:30:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 11:30:25 2026 +0800"
      },
      "message": "[AMORO-3928] Modify the optimizer to support obtaining tasks from each AMS node for processing. (#3950)\n\n* [Subtask]: Use a new configuration item to control whether master \u0026 slave mode is enabled. #3845\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: In master-slave mode, each AMS should automatically senses the optimizer. #3929\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n* [Subtask]: Optimize the logic for retrieving the AMS list from ZooKeeper in master-slave mode. #3928\n\n* This addresses the conflict issues with the latest main branch and introduces a new solution for storing allocation information based on a database.\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n* [Subtask]: Modify the optimizer to support obtaining tasks from each AMS node for processing. #3928\n\n* [Subtask]: Fixed a legacy bug that could cause unit tests to fail during compilation. #3928\n\n* [Subtask]: Optimized based on CR feedback. #3928\n\n* [Subtask]: Fixed a legacy bug that could cause unit tests to fail during compilation. #3928\n\n* Revert \"[Subtask]: Fixed a legacy bug that could cause unit tests to fail during compilation. #3928\"\n\nThis reverts commit d54c126fdc32a77b4d1a5f8cf648cb3bbbca4a65.\n\n* [Subtask]: Optimized based on CR feedback. #3928\n\n* [Subtask]: Optimized based on CR feedback. #3928\n\n* [Subtask]: Optimized based on CR feedback. #3928\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "fa44c915e7a126e404239c170960ab69f2def8d2",
      "tree": "80d856f3585a0d5b3060f9990679c7093fca7574",
      "parents": [
        "ab8a1963f2276a73b515a86d0184dc37363876c3"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Thu Apr 02 10:45:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 10:45:38 2026 +0800"
      },
      "message": "[AMORO-4159] [Improvement]: Missing doAs wrapper in MixedTableOperations. (#4160)"
    },
    {
      "commit": "ab8a1963f2276a73b515a86d0184dc37363876c3",
      "tree": "54c2abdd00a11985cc546d144cb69847b1f512f8",
      "parents": [
        "958e2093d973482420012513ade460675e10da2b"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Tue Mar 31 20:31:14 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 19:31:14 2026 +0800"
      },
      "message": "[AMORO-4153]: Drop mixed Flink 1.17 support (#4154)\n\n* Drop mixed Flink 1.17 support\n\nFlink 1.17 support is removed to enable upgrading Iceberg from 1.6.x\nto 1.7.x, as Iceberg 1.7.0 dropped the iceberg-flink-1.17 artifact.\nAfter this change, only Flink 1.18 is supported for mixed format.\n\n- Remove v1.17 module directory (amoro-mixed-flink-1.17,\n  amoro-mixed-flink-runtime-1.17)\n- Remove v1.17 module entries from parent pom.xml\n- Update all documentation references from Flink 1.17 to 1.18\n- Update Iceberg source reference in MixedCatalog.java\n\n* Update AMORO_VERSION to 0.9.0-incubating in flink-get-started.md\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e"
    },
    {
      "commit": "958e2093d973482420012513ade460675e10da2b",
      "tree": "4479a067dfffe899180c92be819d4f281f45d0ca",
      "parents": [
        "e9087e3c64fd89bc31c13b1d907e149f958d705d"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Tue Mar 31 14:28:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 14:28:10 2026 +0800"
      },
      "message": "[site] Fix docs latest notice and Blogs label (#4144)\n\n* Fix docs latest notice and blogs label\n\n* Fix stable docs link path in latest notice\n\n* fix css"
    },
    {
      "commit": "e9087e3c64fd89bc31c13b1d907e149f958d705d",
      "tree": "514a2b431414e46eab2a1c813723c80c187f78af",
      "parents": [
        "2528923b0b7107ed4bbc00367cdad9d38a2cccda"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Tue Mar 31 10:31:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 10:31:45 2026 +0800"
      },
      "message": "[AMORO-4149]: Remove duplicate iceberg-bundled-guava dependency declaration in amoro-format-iceberg. (#4150)\n\nRemove duplicate iceberg-bundled-guava dependency declaration in amoro-format-iceberg."
    },
    {
      "commit": "2528923b0b7107ed4bbc00367cdad9d38a2cccda",
      "tree": "e9fcd8ce222b74f1b6d00b7cac0167f0ccf498a9",
      "parents": [
        "5313608fb9e66e6fb83b69885148dfb8aeab8ac2"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Mon Mar 30 20:36:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 20:36:06 2026 +0800"
      },
      "message": "[Bug] fix the of TestOptimizerGroupKeeper unit test suffers from intermittent failures. (#4152)\n\n[Bug] fix the of TestOptimizerGroupKeeper unit test suffers from intermittent failures. #4151\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "5313608fb9e66e6fb83b69885148dfb8aeab8ac2",
      "tree": "cdaabec58acc6bcd7054dbc5d07f3211fac2ca24",
      "parents": [
        "45f074df18c25e7baec37f6f8baecfa133d6a56b"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Mon Mar 30 10:44:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 10:44:55 2026 +0800"
      },
      "message": "[AMORO-4147] [Improvement]: Resource leak in CombinedDeleteFilter and MixedDeleteFilter position delete iterators. (#4148)"
    },
    {
      "commit": "45f074df18c25e7baec37f6f8baecfa133d6a56b",
      "tree": "65c6062adf6aae4bf86d4bad6b7af5a0c0e0aff3",
      "parents": [
        "fe98a6cc28ebc620b5045051f0d8766ff0cd5d3e"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Sat Mar 28 16:07:08 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 28 15:07:08 2026 +0800"
      },
      "message": "[AMORO-4127] Add mixed Flink 1.19 support (#4141)\n\n* [AMORO-4127][mixed-flink] Add mixed Flink 1.19 support\n\n- Add v1.19/amoro-mixed-flink-1.19 and v1.19/amoro-mixed-flink-runtime-1.19 modules\n- Register new modules in parent pom.xml\n- Update documentation to include Flink 1.19 in supported version matrix\n- Add kind cluster config for local E2E testing\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "fe98a6cc28ebc620b5045051f0d8766ff0cd5d3e",
      "tree": "e6d3eb16d46dfc0eeb33e13ea4b1f75478a3d7df",
      "parents": [
        "6c037912f7ada649f69afb643041a75eeeea8825"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Sat Mar 28 02:49:01 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 28 01:49:01 2026 +0800"
      },
      "message": "[Improvement] Hoist StructProjection.create out of per-record loop in CombinedDeleteFilter (#4145)\n\n* Hoist StructProjection.create out of per-record loop in initializeBloomFilter\n\nStructProjection is designed to be reused via .wrap(). Previously,\nStructProjection.create(requiredSchema, deleteSchema) was called inside\nthe per-record forEach, creating N*M objects (records x schemas). Pre-build\na Map\u003cSet\u003cInteger\u003e, StructProjection\u003e once before iterating records, then\ncall .wrap(record) on the pre-built projection inside the loop."
    },
    {
      "commit": "6c037912f7ada649f69afb643041a75eeeea8825",
      "tree": "ba5c1fd3fd2cf673885ee73ebfcec3658a193d0d",
      "parents": [
        "bf222b7b6b57b01b3d46a6ad469ea9afce89fb16"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Thu Mar 26 16:49:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 16:49:58 2026 +0800"
      },
      "message": "[AMORO-4117] Implement dashboard RBAC with jCasbin and LDAP role mapping (#4118)\n\n* [Feature] Implement role-based access control with ADMIN and READ_ONLY roles\n\n* Ensure username and password are converted to String in authentication and role resolution\n\n* Update RBAC documentation and configuration examples in ams-config.md and ConfigurationsTest.java\n\n* [Feature] Update role-based access control to use SERVICE_ADMIN and VIEWER roles\n\n* [Feature] Add RBAC configuration for SERVICE_ADMIN and VIEWER roles\n\n* [Feature] Update RBAC model and policy files with licensing information and new dependencies\n\n* [Feature] Refactor RBAC implementation to use string-based roles and enhance privilege mapping\n\n* Update RBAC default role handling and documentation\n\n* Update RBAC documentation to reflect changes in default role handling and introduce new roles\n\n* Fix comment in LdapPasswdAuthenticationProvider to reflect correct email example for username normalization\n\n* revert"
    },
    {
      "commit": "bf222b7b6b57b01b3d46a6ad469ea9afce89fb16",
      "tree": "3d1d437a5e54abbc22e83acbe2d13e32c26379a4",
      "parents": [
        "a40a8c14d201e45b4f5408825a70ad5104d738fe"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Wed Mar 25 16:17:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 16:17:42 2026 +0800"
      },
      "message": "[Subtask]: Modify DefaultTableService to be compatible with master-slave mode. (#3927)\n\n* [Subtask]: Use a new configuration item to control whether master \u0026 slave mode is enabled. #3845\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]:  Fix unit test failure issue #3923\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: Modify DefaultTableService to be compatible with master-slave mode #3923\n\n* [Subtask]: Optimized based on CR feedback. #3923\n\n* [Subtask]: Optimized based on CR feedback. #3923\n\n* [Subtask]: Optimized based on CR feedback. #3923\n\n* [Subtask]: Fixed a legacy bug that could cause unit tests to fail during compilation. #3923\n\n* [Subtask]: Optimized based on CR feedback. #3923"
    },
    {
      "commit": "a40a8c14d201e45b4f5408825a70ad5104d738fe",
      "tree": "7768da8cb1ff5771f336fc5896df2cde8282622c",
      "parents": [
        "cc03949943e6d0292f9813e2ebf0bd6e6c7d7b20"
      ],
      "author": {
        "name": "Baixiaochun",
        "email": "baixiaochun1217@gmail.com",
        "time": "Thu Mar 19 18:30:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 18:30:50 2026 +0800"
      },
      "message": "[AMORO-4135][amoro-web] Fix blank duration column for sub-second optimizing durations (#4136)\n\n[AMORO-4135][amoro-web] 修复 formatMS2Time() 对小于1秒的持续时间返回空字符串的问题\n\n当优化任务持续时间在 1ms-999ms 之间时，formatMS2Time() 函数的所有时间单位\n(天/时/分/秒) 经 Math.floor 计算后都为 0，导致 result 为空字符串，前端\nduration 列显示为空白。\n\n添加对 0 \u003c ms \u003c 1000 的边界处理，返回 \u0027\u003c1s\u0027 而非空字符串。\n\nfix #4135\n\nCo-authored-by: Bingtagui404 \u003c182930459+Bingtagui404@users.noreply.github.com\u003e"
    },
    {
      "commit": "cc03949943e6d0292f9813e2ebf0bd6e6c7d7b20",
      "tree": "7d89604b7660478915fc7f79d3a1a204032a42be",
      "parents": [
        "7ceec41890836f162cec5d073a6bddcd77d6b2e9"
      ],
      "author": {
        "name": "Baixiaochun",
        "email": "baixiaochun1217@gmail.com",
        "time": "Thu Mar 19 13:23:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 13:23:30 2026 +0800"
      },
      "message": "[AMORO-4130][amoro-web] Replace hardcoded frontend texts with i18n translations (#4133)\n\n替换 amoro-web 前端硬编码文本为 i18n 翻译\n\n将 5 个 Vue 文件中的硬编码英文文本替换为 vue-i18n 调用，\n并在 en.ts/zh.ts 中添加 11 个新翻译键。\n\n涉及的硬编码文本包括：\n- placeholder: Optimizer group, Action, Type, Status\n- form label: Catalog, Database, Table, Type, Endpoint, Region,\n  Hadoop Username, Kerberos Principal, Access Key, Secret Key\n- 展示文本: Charts, All\n- 列副标题: success / total, size / count\n\nCo-authored-by: Bingtagui404 \u003c182930459+Bingtagui404@users.noreply.github.com\u003e"
    },
    {
      "commit": "7ceec41890836f162cec5d073a6bddcd77d6b2e9",
      "tree": "bdf0ad94dba76b3382e14030ad25dd6d89cc9825",
      "parents": [
        "60fd89300a90ebd8fa7ccf09780a2faf47821537"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Thu Mar 19 13:22:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 13:22:40 2026 +0800"
      },
      "message": "[Subtask]: In master-slave mode, database-based bucket allocation is supported.  (#4123)\n\n* [Subtask]: In master-slave mode, database-based bucket allocation is supported. #4121\n\n* [Subtask]: Optimize based on CR\u0027s feedback.#4121\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "60fd89300a90ebd8fa7ccf09780a2faf47821537",
      "tree": "7bd4dfe48a4fac664ab8cce3813a388c9fe82602",
      "parents": [
        "7cebea493bcd8ef54387420f684b7014f4d1e3aa"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Thu Mar 19 14:22:23 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 13:22:23 2026 +0800"
      },
      "message": "[AMORO-4128] Drop mixed Flink 1.16 support (#4132)\n\n* Drop mixed Flink 1.16 support (#4128)\n\nRemove mixed Flink 1.16 modules and update documentation to reflect\nthe supported Flink versions (1.17, 1.18). This unblocks future\nIceberg upgrades that no longer support Flink 1.16.\n\n- Remove v1.16/amoro-mixed-flink-1.16 and v1.16/amoro-mixed-flink-runtime-1.16 modules\n- Remove Flink 1.16 entries from parent pom.xml module list\n- Update version matrices in README and docs\n- Update Flink documentation links from 1.16 to 1.17\n- Clean up stale Flink 1.15 references in docs\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Address review comment: sync MixedCatalog method with Iceberg 1.6.x source\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Fix stale Spark 3.2 path reference in deployment docs\n\nUpdate the example path from the non-existent\namoro-format-mixed-spark/v3.2 to amoro-mixed-spark/v3.3 to match\nthe current project structure. Also remove a trailing parenthesis\ntypo in the jar filename comment.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "7cebea493bcd8ef54387420f684b7014f4d1e3aa",
      "tree": "553e775355cdc9de99cd3e9cd7b70b9227a896f7",
      "parents": [
        "24c23a9d71f40c542ac49f87e5bbeff1cb66710d"
      ],
      "author": {
        "name": "Baixiaochun",
        "email": "baixiaochun1217@gmail.com",
        "time": "Wed Mar 18 22:00:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 22:00:51 2026 +0800"
      },
      "message": "[Improvement] Rename Maven property jackson.vesion to jackson.version (#4134)\n\nFix typo in the mixed Flink Maven property name: jackson.vesion -\u003e\njackson.version across all 3 pom.xml files that reference it.\n\nCo-authored-by: Bingtagui404 \u003cbaixiaochun0@gmail.com\u003e"
    },
    {
      "commit": "24c23a9d71f40c542ac49f87e5bbeff1cb66710d",
      "tree": "a2c172a1c0808066e89270b2164b79a521bc3cac",
      "parents": [
        "86357572e9ea46eb092aa3a7123f4f40f0af3a47"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Wed Mar 18 09:59:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 09:59:09 2026 +0800"
      },
      "message": "[Hotfix] Add Apache License header to AGENTS.md (#4125)\n\nAdd Apache License header to AGENTS.md"
    },
    {
      "commit": "86357572e9ea46eb092aa3a7123f4f40f0af3a47",
      "tree": "49ca75a68dabdfad5672897bb078acc2ce10eb66",
      "parents": [
        "0721df985beda5aeb76d9f6efb4f6c294247e728"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Wed Mar 18 00:28:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 00:28:40 2026 +0800"
      },
      "message": "[Doc] Add AGENTS.md for project overview and documentation (#4120)\n\n[Feature] Add AGENTS.md for project overview and documentation"
    },
    {
      "commit": "0721df985beda5aeb76d9f6efb4f6c294247e728",
      "tree": "a59e3579c6623a8b76b3d631ed7a59232c35b31c",
      "parents": [
        "25f19da9a6cf6aa4acea787a2834c864ea57edb0"
      ],
      "author": {
        "name": "baiyangtx",
        "email": "xiangnebula@163.com",
        "time": "Tue Mar 17 21:50:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 17 21:50:53 2026 +0800"
      },
      "message": "[Improvement]: Refactor snapshot-expiring via ProcessFactory plugin (#4107)\n\n* [Improvement] Refactor SnapshotExpiring inline executor with ProcessFactory\n\n \n\nCo-authored-by: zhangyongxiang.alpha \u003czhangyongxiang.alpha@bytedance.com\u003e\nCo-authored-by: Aime \u003caime@bytedance.com\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "25f19da9a6cf6aa4acea787a2834c864ea57edb0",
      "tree": "0eaf071e3c80b2c191d376f796202c2cc0976999",
      "parents": [
        "55fb785c94c4ff95d06b477bb2194a91c6171c25"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Mon Mar 16 14:19:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 16 14:19:47 2026 +0800"
      },
      "message": "[AMORO-3921] Add AmsAssignService and ZkBucketAssignStore to implement balanced bucket allocation in master-slave mode (#3922)\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: add AmsAssignService to implement balanced bucket allocation in master-slave mode. #3921\n\n* [Subtask]: Revised based on CR\u0027s comments. #3921\n\n* [Subtask]: Revised based on CR\u0027s comments. #3921\n\n* [Subtask]: Revised based on CR\u0027s comments. #3921\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "55fb785c94c4ff95d06b477bb2194a91c6171c25",
      "tree": "4e11b443f6009da42d72dc4e145daf6956addb33",
      "parents": [
        "316f5e8af5667eeebaa07546f161091d546a29c2"
      ],
      "author": {
        "name": "baiyangtx",
        "email": "xiangnebula@163.com",
        "time": "Thu Mar 12 21:40:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 12 21:40:45 2026 +0800"
      },
      "message": "[Improvement]: Extract TableProcessStore from AmoroProcess interface. (#4116)\n\n* refactor(process): extract process framework changes\n        \n* CI\n\n* Update amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java\n\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e\n\n* Update amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java\n\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e\n\n* Fix comments\n\n---------\n\nCo-authored-by: zhangyongxiang.alpha \u003czhangyongxiang.alpha@bytedance.com\u003e\nCo-authored-by: Aime \u003caime@bytedance.com\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e"
    },
    {
      "commit": "316f5e8af5667eeebaa07546f161091d546a29c2",
      "tree": "f5e243ffbf63be8289678abdec2b2484b3892f8b",
      "parents": [
        "5775d194270bca31f4e3c20d68adf6c9edcf44d3"
      ],
      "author": {
        "name": "davedwwang",
        "email": "iverson89w@163.com",
        "time": "Wed Mar 11 10:17:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 11 10:17:59 2026 +0800"
      },
      "message": "[AMORO-4108] Unify Testcontainers Dependency Version (#4115)\n\nCo-authored-by: davedwwang \u003cdavedwwang@tencent.com\u003e"
    },
    {
      "commit": "5775d194270bca31f4e3c20d68adf6c9edcf44d3",
      "tree": "f201e1012030d342a55e593b85b2767c3d7d89a1",
      "parents": [
        "a2d4b2185c8a40bc66172e9d32d5a6efa6a5dcdc"
      ],
      "author": {
        "name": "davedwwang",
        "email": "iverson89w@163.com",
        "time": "Tue Mar 10 11:12:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 10 11:12:54 2026 +0800"
      },
      "message": "[AMORO-4086] Add OptimizerGroupKeeper to automatically maintain optim… (#4087)\n\n[AMORO-4086] Add OptimizerGroupKeeper to automatically maintain optimizer resources based on min-parallelism configuration\n\nCo-authored-by: davedwwang \u003cdavedwwang@tencent.com\u003e"
    },
    {
      "commit": "a2d4b2185c8a40bc66172e9d32d5a6efa6a5dcdc",
      "tree": "e598ac08804b6b809e3e3c59b5a765bf8eba6105",
      "parents": [
        "db7c9048862718ead6fe2e548e2fac2411d02890"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Mon Mar 09 20:18:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 20:18:27 2026 +0800"
      },
      "message": "[AMORO-4103] Release table runtime when the group name is changed to a non-existent resource group (#4104)\n\n* Release table runtime when the group name is changed to a non-existent resource group.\n\n* spotless\n\n* Update optimizing status assertion in TestOptimizingQueue\n\n* Fix handling of optimizing process when resource group changes to non-existent group"
    },
    {
      "commit": "db7c9048862718ead6fe2e548e2fac2411d02890",
      "tree": "7493039e6b59c3c0aa42f93aed8ee5d490dbc72e",
      "parents": [
        "90b43e2ff1a49a00e294389de1a50cfc3407ab3f"
      ],
      "author": {
        "name": "baiyangtx",
        "email": "xiangnebula@163.com",
        "time": "Mon Mar 09 17:23:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 17:23:14 2026 +0800"
      },
      "message": "[Feature] Introduce a new plugin RestExtension to extend rest service (#4112)\n\n* [Feature] Introduce a new plugin RestExtension to extend rest service\n\nCherry-picked from 2010d5998a0770fa7b58456e51d63538af9e5e78.\n\nCo-Authored-By: Aime \u003caime@bytedance.com\u003e\nChange-Id: Iedfc5a383dabe42c96ce4030411cb93adc468a77\n\n* refactor\n\n* typo\n\n---------\n\nCo-authored-by: zhangyongxiang.alpha \u003czhangyongxiang.alpha@bytedance.com\u003e\nCo-authored-by: Aime \u003caime@bytedance.com\u003e"
    },
    {
      "commit": "90b43e2ff1a49a00e294389de1a50cfc3407ab3f",
      "tree": "f11748974ae0affc934456b67040abeae1c51223",
      "parents": [
        "6478275784d526a399e294d3806770e6f57a2c08"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Mon Mar 09 16:41:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 16:41:05 2026 +0800"
      },
      "message": "[Hotfix] Add LDAP login configuration options for Dashboard deployment (#4111)\n\nAdd LDAP authentication configuration options for Dashboard"
    },
    {
      "commit": "6478275784d526a399e294d3806770e6f57a2c08",
      "tree": "b6e974df7d6a5629f618c5730e1f4e76055e854c",
      "parents": [
        "02f7c4c1b4db597b1503487c946e278410e3152a"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Mon Mar 09 17:40:41 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 16:40:41 2026 +0800"
      },
      "message": "[AMORO-4113] Do not update snapshot markers on completeProcess(false) (#4114)\n\nWhen an optimizing process is closed without success (e.g., optimizer\ngroup change, task retry exhaustion), completeProcess(false) was\nunconditionally updating lastOptimizedSnapshotId and\nlastOptimizedChangeSnapshotId. This caused SchedulingPolicy.isTablePending()\nto return false, permanently preventing the table from being re-planned.\n\nFix by only updating snapshot markers when success is true.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "02f7c4c1b4db597b1503487c946e278410e3152a",
      "tree": "25d1fe103a7c022e38e91e6c58984df5150c5c8d",
      "parents": [
        "bb140417bdfd7de6401c9f660ea9c76eee884381"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Fri Mar 06 21:58:15 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 06 20:58:15 2026 +0800"
      },
      "message": "[AMORO-4044] Fix partition mapping bug in TableEntriesScan for tables with evolved PartitionSpec (#4085)\n\nThe entries metadata table returns a unified super-struct partition\ncontaining fields from all PartitionSpecs. buildDataFile() and\nbuildDeleteFile() passed this directly to withPartition(), causing\npartition mismatch after spec evolution. Fix by projecting the unified\npartition to the spec-specific type using StructProjection.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "bb140417bdfd7de6401c9f660ea9c76eee884381",
      "tree": "d4d093655cd774bef9584b0bb83ba69fa5499168",
      "parents": [
        "7ba51cda2bd9efa0216c915a98429cdce45642b1"
      ],
      "author": {
        "name": "can",
        "email": "95597038+wardlican@users.noreply.github.com",
        "time": "Fri Mar 06 11:02:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 06 11:02:36 2026 +0800"
      },
      "message": "Add a registration function for table allocation in master-slave mode.  (#3920)\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Use a new configuration item to control whether master \u0026 slave mode is enabled. #3845\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: Replace zk with mocking. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Add a registration function for table allocation in master-slave mode. #3919\n\n* [Subtask]: Fixing conflicts after a forced push following a rebase.\n\n* [Subtask]: change registAndElect to registerAndElect.\n\n* [Subtask]: Revised based on CR’s comments\n\n* [Subtask]: Revised based on CR’s comments\n\n---------\n\nCo-authored-by: wardli \u003cwardli@tencent.com\u003e"
    },
    {
      "commit": "7ba51cda2bd9efa0216c915a98429cdce45642b1",
      "tree": "419f7f9f9c2e12940db8285c7490734618779b18",
      "parents": [
        "19141452088c891c85ad5fc88f2c2b0837b9bf9c"
      ],
      "author": {
        "name": "baiyangtx",
        "email": "xiangnebula@163.com",
        "time": "Thu Mar 05 17:32:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 05 17:32:12 2026 +0800"
      },
      "message": "[Improvement]: Load process factories via DefaultTableRuntimeFactory (#4100)\n\n* feat(ams): load process factories via DefaultTableRuntimeFactory\n\n## Summary\n\nWire the new process plugin model into AMS so that table processes are discovered from `ProcessFactory` implementations and scheduled via the existing `ProcessService`.\n\n## Details\n\n- Extend `DefaultTableRuntimeFactory` to implement the `TableRuntimeFactory` process APIs:\n  - Aggregate installed `ProcessFactory` instances by `TableFormat` / `Action` and expose derived `ActionCoordinator` plugins via `supportedCoordinators()`\n  - Merge `DefaultTableRuntime.REQUIRED_STATES` with additional states required by all process factories for the same format when building `TableRuntimeCreator`\n  - Keep using `DefaultTableRuntime` without introducing extra runtime types\n- Introduce `DefaultActionCoordinator` to bridge `ProcessFactory` trigger/recover semantics to the existing scheduler:\n  - Build trigger strategies from `ProcessFactory#triggerStrategy`\n  - Delegate `trigger` and `recoverTableProcess` to the underlying factory\n- Add `TableProcessFactoryManager` as an `AbstractPluginManager\u003cProcessFactory\u003e` using the `process-factories` plugin namespace\n- Refactor `AmoroServiceContainer` startup sequence:\n  - Initialize `TableProcessFactoryManager` and collect all installed `ProcessFactory` instances\n  - Initialize all `TableRuntimeFactory` plugins with the shared list of process factories\n  - Collect all derived `ActionCoordinator`s from table runtime factories and inject them into `ProcessService`\n- Update `ProcessService` to accept a pre-built list of `ActionCoordinator`s while keeping the original constructors for backward compatibility and tests\n- Run `mvn spotless:apply` and `mvn -pl amoro-ams -am -DskipTests compile` to ensure style and compilation pass\n\nCo-Authored-By: Aime \u003caime@bytedance.com\u003e\nChange-Id: Iaa867503c8b0bf93c2b7f0b8fe7d752e2ddbac67\n\n* refactor(table-runtime): decouple TableRuntimeFactory from ActivePlugin and use default runtime\n\n## Summary\n\nDecouple `TableRuntimeFactory` from the generic `ActivePlugin` mechanism and make `AmoroServiceContainer` explicitly use `DefaultTableRuntimeFactory` as the default implementation.\n\n## Details\n\n- Change `TableRuntimeFactory` in `amoro-common` so it no longer extends `ActivePlugin`, keeping only process-related APIs:\n  - `List\u003cActionCoordinator\u003e supportedCoordinators()`\n  - `void initialize(List\u003cProcessFactory\u003e factories)`\n  - `Optional\u003cTableRuntimeCreator\u003e accept(ServerTableIdentifier, Map\u003cString, String\u003e)`\n- Refactor `TableRuntimeFactoryManager` in AMS:\n  - Remove inheritance from `AbstractPluginManager\u003cTableRuntimeFactory\u003e` to avoid the `ActivePlugin` constraint\n  - Implement a simple manager that wraps a provided `List\u003cTableRuntimeFactory\u003e`\n  - Provide a default no-arg constructor that installs a single `DefaultTableRuntimeFactory`\n  - Keep `initialize()` as a no-op and `installedPlugins()` as the accessor to preserve existing wiring in `DefaultTableService`\n- Update `DefaultTableRuntimeFactory`:\n  - Remove `@Override` annotations from `open/close/name` since they no longer implement `ActivePlugin` methods\n  - Keep the methods as no-op helpers with the same behavior\n- Update `AmoroServiceContainer.startOptimizingService` to use `DefaultTableRuntimeFactory` directly:\n  - Construct a `DefaultTableRuntimeFactory` instance explicitly\n  - Wrap it into `TableRuntimeFactoryManager` via `Collections.singletonList(tableRuntimeFactory)`\n  - Use the resulting singleton list as the only table runtime factory when initializing process factories and collecting `ActionCoordinator`s\n- Leave `DefaultTableService` logic unchanged, it still uses `TableRuntimeFactoryManager.installedPlugins()` but now operates over the explicit default factory list\n- Ensure `ProcessService` changes from previous step are included in this commit so the module compiles cleanly\n\n## Verification\n\n- Ran `./mvnw -pl amoro-ams -am -DskipTests compile` from repo root\n  - Build succeeded for the full AMS reactor\n  - `spotless` and `checkstyle` passed with only existing warnings unrelated to this change\n\nCo-Authored-By: Aime \u003caime@bytedance.com\u003e\nChange-Id: Ifa8deef0d2553176300cdef2c0cb073d52ee3303\n\n* refactor(table-runtime): remove TableRuntimeFactoryManager and inline default factory\n\n## Summary\n\n- Remove TableRuntimeFactoryManager indirection and wire DefaultTableService directly with a TableRuntimeFactory implementation.\n- Simplify DefaultTableRuntimeFactory after decoupling from plugin framework and ActivePlugin lifecycle.\n- Inline default table runtime factory wiring into AmoroServiceContainer and tests, and update process/service initialization.\n\n## Details\n\n- DefaultTableService\n  - Change constructor to accept a TableRuntimeFactory instead of TableRuntimeFactoryManager.\n  - Replace iteration over installed factories with a single factory.accept(...) call when creating TableRuntime instances.\n\n- DefaultTableRuntimeFactory\n  - Drop unused ActivePlugin-style methods: open(Map\u003cString, String\u003e), close(), and name().\n\n- AmoroServiceContainer\n  - Instantiate a single DefaultTableRuntimeFactory in startOptimizingService and pass it into DefaultTableService.\n  - Initialize the defaultRuntimeFactory with ProcessFactory plugins and derive ActionCoordinators from it directly.\n\n- Tests\n  - AMSServiceTestBase: construct DefaultTableService with a concrete DefaultTableRuntimeFactory instead of a mocked TableRuntimeFactoryManager.\n  - TestDefaultTableRuntimeHandler: hold a DefaultTableRuntimeFactory field and pass it into DefaultTableService for all test setups.\n\n- Cleanup\n  - Delete TableRuntimeFactoryManager class and remove all references and related imports across main and test code.\n  - Fix spotless formatting violations in the touched files so that `mvn -pl amoro-ams -am -DskipTests compile` passes.\n\nCo-Authored-By: Aime \u003caime@bytedance.com\u003e\nChange-Id: I8acca1841470dfc1bbd87b77e424a34f4d52ae82\n\n* fix comment\n\n* fix comment\n\n* fix comment\n\n* fix comment\n\n---------\n\nCo-authored-by: zhangyongxiang.alpha \u003czhangyongxiang.alpha@bytedance.com\u003e\nCo-authored-by: Aime \u003caime@bytedance.com\u003e\nCo-authored-by: ZhouJinsong \u003czhoujinsong0505@163.com\u003e"
    },
    {
      "commit": "19141452088c891c85ad5fc88f2c2b0837b9bf9c",
      "tree": "45d29091a3aa81a49c53b0214cf12207e3e7d2ed",
      "parents": [
        "d54b9362e5b58524f69a13e8441f308133e0cc7e"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Wed Mar 04 20:50:45 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 19:50:45 2026 +0800"
      },
      "message": "[AMORO-4089] Fix optimizing process stuck permanently after AMS restart (#4090)\n\n* [AMORO-4089] Fix optimizing process permanently stuck after AMS restart\n\nFix multiple scenarios where tables become permanently stuck after\nAMS restart by refactoring initTableRuntime() recovery logic, fixing\nOptimizerKeeper race condition, and adding defensive measures.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4089] Skip resetting PENDING tables during recovery\n\nPENDING tables (processId\u003d0) should not be reset via\ncompleteEmptyProcess() as it incorrectly marks existing snapshots\nas already optimized. Simply re-add them to the scheduler instead.\n\nAlso use separate optimizer threads in quota tests to avoid\ninterference with resetStaleTasksForThread.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4089] Avoid adding completed process to tableQueue during recovery\n\nWhen all tasks are already completed during recovery, skip adding the\nprocess to tableQueue and directly trigger beginCommitting() to prevent\nan empty shell process from lingering in the queue.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4089] Add Javadoc to completeEmptyProcess() documenting broader scope\n\nDocument that completeEmptyProcess() resets the table from any non-IDLE\nstate, not just PLANNING/PENDING, as it is now also used during startup\nrecovery for tables with unrecoverable processes.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4089] Remove redundant KILLED status guard in recovery constructor\n\ncanResumeProcess() already filters out KILLED processes, so the\nstatus !\u003d KILLED guard in the recovery constructor is unnecessary.\nRemove it to clean up legacy code as part of the refactoring.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* [AMORO-4089] Lower recovery log level for SCHEDULED/ACKED tasks to DEBUG\n\nTransient recovery state logs can be noisy in clusters with many tables.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\nCo-authored-by: Xu Bai \u003ctocreationbai@gmail.com\u003e"
    },
    {
      "commit": "d54b9362e5b58524f69a13e8441f308133e0cc7e",
      "tree": "074500a963d51869047268eb513d6a3bdc5fd267",
      "parents": [
        "4b9bf00d94f1ee5b716f05b3d67d13d594ee33af"
      ],
      "author": {
        "name": "nathan.ma",
        "email": "majin1102@gmail.com",
        "time": "Wed Mar 04 19:36:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 19:36:10 2026 +0800"
      },
      "message": "[UI]: Optimize table ui and deduplicate 403 login error (#4093)\n\nCo-authored-by: majin.nathan \u003cmajin.nathan@bytedance.com\u003e"
    },
    {
      "commit": "4b9bf00d94f1ee5b716f05b3d67d13d594ee33af",
      "tree": "e7e686b3fda00c7091ad84d296f5eabf2282f8c6",
      "parents": [
        "cf8561a6998cfd7e5daa845c4239ed1287ece434"
      ],
      "author": {
        "name": "nathan.ma",
        "email": "majin1102@gmail.com",
        "time": "Wed Mar 04 19:35:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 19:35:30 2026 +0800"
      },
      "message": "[UI] Provide new login page (#4094)\n\n[Web] Provide new login page\n\nCo-authored-by: majin.nathan \u003cmajin.nathan@bytedance.com\u003e"
    },
    {
      "commit": "cf8561a6998cfd7e5daa845c4239ed1287ece434",
      "tree": "b635ce88476c7822ee085919e5b846f2c530db9c",
      "parents": [
        "7ea367ee5a2b521c8763272c793dfa937af2a342"
      ],
      "author": {
        "name": "Xu Bai",
        "email": "tocreationbai@gmail.com",
        "time": "Wed Mar 04 10:29:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 10:29:39 2026 +0800"
      },
      "message": "[AMORO-3832] Update amoro site to meet ASF graduation requirements (#4105)\n\n* Add Events section to site navigation\n\n* Self-host Lato font to comply with ASF policy"
    },
    {
      "commit": "7ea367ee5a2b521c8763272c793dfa937af2a342",
      "tree": "0dad4b5989754950ab817e5257d15f486a99358d",
      "parents": [
        "1af9f36e24d5f0df115eae6edb1ddfeb46ac159e"
      ],
      "author": {
        "name": "Darcy",
        "email": "331046161@qq.com",
        "time": "Tue Mar 03 10:30:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 03 10:30:21 2026 +0800"
      },
      "message": "[AMORO-4044][amoro-format-iceberg] Fix SLF4J log format placeholder in TableEntriesScan (#4102)\n\n[AMORO-4044] Fix SLF4J log format placeholder in TableEntriesScan\n\nSigned-off-by: Darcy \u003clintingbin@lilith.com\u003e"
    },
    {
      "commit": "1af9f36e24d5f0df115eae6edb1ddfeb46ac159e",
      "tree": "cc43606db10ddd6cd4764c36778a9a8c49bcf105",
      "parents": [
        "e02295bb8fe0ee0892c87222fcfc5245c656b4ba"
      ],
      "author": {
        "name": "zhangwl9",
        "email": "1298877813@qq.com",
        "time": "Tue Mar 03 10:29:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 03 10:29:47 2026 +0800"
      },
      "message": "[AMORO-4037] Support dynamic refresh interval for table metadata refreshing in TableRuntimeRefreshExecutor (#4038)\n\nThis commit adds a dynamic refresh interval for table metadata refreshing support.\n\nThis is useful for a catalog that contains real-time tables and some static tables.\n---------\n\nCo-authored-by: 张文领 \u003czhangwl9@chinatelecom.cn\u003e"
    },
    {
      "commit": "e02295bb8fe0ee0892c87222fcfc5245c656b4ba",
      "tree": "f49623d164cdf5be14784a6d6a00e91a92b7d0e1",
      "parents": [
        "743e6f1cde34ec5b0dcc6b93503557c2daed2b12"
      ],
      "author": {
        "name": "Jiwon Park",
        "email": "jpark92@outlook.kr",
        "time": "Mon Mar 02 16:08:31 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 15:08:31 2026 +0800"
      },
      "message": "[Feature] Add metric category filtering support to Prometheus exporter (#4084)\n\n* Add metric category filtering support to Prometheus exporter\n\nAllow users to enable/disable metric categories (self-optimizing,\noptimizer-group, orphan-files, ams-jvm, table-summary) via\nmetric-reporters.yaml properties. All categories are enabled by\ndefault for backward compatibility. Also update Helm chart values\nand configmap tests to reflect the new configuration options.\n\nSigned-off-by: jiwonpark \u003cjiwonpark@example.com\u003e\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Replace category-based filtering with regex-based metric filtering\n\nReplace the fixed category enum approach with a flexible regex-based\nmetric filter. Users can now specify include/exclude patterns via\nmetric-filter.includes and metric-filter.excludes properties to\nfreely configure which metrics are exported.\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n* Handle invalid regex patterns gracefully and add includes Helm test\n\n- Catch PatternSyntaxException in MetricFilter.fromProperties() and\n  fall back to ACCEPT_ALL with a warning log instead of failing\n  reporter initialization\n- Add tests for invalid regex fallback (includes and excludes)\n- Add Helm unittest for metric-filter.includes configuration\n- Fix missing newline at end of amoro-configmap_test.yaml\n\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e\n\n---------\n\nSigned-off-by: jiwonpark \u003cjiwonpark@example.com\u003e\nSigned-off-by: Jiwon Park \u003cjpark92@outlook.kr\u003e"
    },
    {
      "commit": "743e6f1cde34ec5b0dcc6b93503557c2daed2b12",
      "tree": "47ad45ca02efe522b9d5ae4fe4549f88f4fc9642",
      "parents": [
        "853562e3558902e5636b498ce04fee5c2f90a611"
      ],
      "author": {
        "name": "baiyangtx",
        "email": "xiangnebula@163.com",
        "time": "Wed Feb 25 20:02:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 20:02:28 2026 +0800"
      },
      "message": "[Improvement]: Refactor process API and table runtime extension interfaces (#4097)\n\n* improvement: refactor process API and table runtime extension interfaces\n\n# Context\n\nSplit from upstream PR apache/amoro#4081 to make review easier.\n\nThis MR introduces the new process extension APIs in common module, without touching most AMS internals yet.\n\n# Changes\n\n- Promote `ProcessFactory` to a richer abstraction in `amoro-common`, preparing for plugin-based table process extension.\n- Adjust `Action`/`IcebergActions` and `TableRuntime` to align with the new process model.\n- Move `ActionCoordinator` into `amoro-common` so it can be shared as a public abstraction.\n- Introduce `ProcessTriggerStrategy` to describe trigger policies for processes.\n- Clean up legacy process state classes which will be replaced by the new abstractions in follow-up MRs.\n\n# Notes\n\n- This commit only updates the common module and the shared `ActionCoordinator` API; AMS-side wiring and runtime refactors will be done in separate branches/MRs as discussed.\n\nCo-Authored-By: Aime \u003caime@bytedance.com\u003e\nChange-Id: If84ada8fcae1cfb11577d56d3866db7ce0949102\n\n* fix compile error\n\n* fix compile error\n\n* fix compile error3\n\n* getTableConfig\n\n* refactor\n\n---------\n\nCo-authored-by: zhangyongxiang.alpha \u003czhangyongxiang.alpha@bytedance.com\u003e\nCo-authored-by: Aime \u003caime@bytedance.com\u003e"
    }
  ],
  "next": "853562e3558902e5636b498ce04fee5c2f90a611"
}
