)]}'
{
  "commit": "6c8f2492d438cdfe28b3536ce5dfed225ea802e9",
  "tree": "e8fc1b74fca355a3427cb42cde662cde952111f4",
  "parents": [
    "83c521c4d7dced3cbaf862dc62093fd4052f6e70"
  ],
  "author": {
    "name": "CritasWang",
    "email": "critas@outlook.com",
    "time": "Fri Jan 30 20:26:11 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Jan 30 20:26:11 2026 +0800"
  },
  "message": "Implement automatic write redirection for multi-node clusters (#9)\n\n* Initial plan\n\n* Add redirection configuration and implement redirect handling in Session and SessionPool\n\n\n* Add E2E tests for redirection and update documentation\n\n\n* Remove unused variable to fix linting warning\n\n\n* Fix redirection implementation: write succeeds on first attempt, no retry needed\n\nThe previous implementation incorrectly threw an exception and retried the write when receiving code 400.\nAccording to IoTDB design, code 400 means the write ALREADY SUCCEEDED and the redirect recommendation\nis only for FUTURE writes. This commit fixes the behavior:\n\n- Session.ts: Store redirect endpoint internally, resolve successfully (no exception)\n- BaseSessionPool.ts: Check for redirect after successful write, cache for next write (no retry)\n- Remove maxRedirectRetries config (not needed since we don\u0027t retry)\n- Update all documentation to reflect correct behavior\n\n\n* Fix code 400 handling: accept response even without redirectNode\n\nThe table tablet test was failing because code 400 was only treated as success when\nredirectNode was present. According to IoTDB design, code 400 always means write succeeded,\nregardless of whether redirectNode is provided. This commit fixes both insertTreeTabletInternal\nand insertTableTabletInternal to:\n\n- Accept code 400 as success even when redirectNode is missing/null\n- Store redirect endpoint only when provided\n- Log debug message when code 400 received without redirect node\n\n\n---------\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ab0a32dae7c67969c2b8ff53004690353ee9e0db",
      "old_mode": 33188,
      "old_path": "README.md",
      "new_id": "0af2b83c3897f4d91b71d2b09ed705c64395a017",
      "new_mode": 33188,
      "new_path": "README.md"
    },
    {
      "type": "modify",
      "old_id": "c111d5d90995e832616a6e2f135bb571bae24035",
      "old_mode": 33188,
      "old_path": "README_zh.md",
      "new_id": "1b2cd643e7d5ca42da2667c7db906c0cfba38d87",
      "new_mode": 33188,
      "new_path": "README_zh.md"
    },
    {
      "type": "modify",
      "old_id": "32bb35e0b850868bcddb6187b5824f996e0b00f3",
      "old_mode": 33188,
      "old_path": "docs/redirection-design.md",
      "new_id": "f61f0c964655cb3a4a3cc9ab5f68f150de53d212",
      "new_mode": 33188,
      "new_path": "docs/redirection-design.md"
    },
    {
      "type": "modify",
      "old_id": "1e4210fed53bc4f2146e68d8c2b2991eaa8db105",
      "old_mode": 33188,
      "old_path": "src/client/BaseSessionPool.ts",
      "new_id": "1e2782712390f1d5274e5ca5166357301a3ae52b",
      "new_mode": 33188,
      "new_path": "src/client/BaseSessionPool.ts"
    },
    {
      "type": "modify",
      "old_id": "446cd71dd7ee27134ebedbdbbe116d0d263a04d3",
      "old_mode": 33188,
      "old_path": "src/client/Session.ts",
      "new_id": "8f9e40caa146b6ad5f5d1d394b1725354274351d",
      "new_mode": 33188,
      "new_path": "src/client/Session.ts"
    },
    {
      "type": "modify",
      "old_id": "6c6a77e6393cd236f665c48a5b9483325618fc46",
      "old_mode": 33188,
      "old_path": "src/utils/Config.ts",
      "new_id": "daa3984c4eb4eadc0d0601aeda3bbb07d4faa6ec",
      "new_mode": 33188,
      "new_path": "src/utils/Config.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e9a41a67e824665617fbf5102abd0f9c9784c525",
      "new_mode": 33188,
      "new_path": "tests/e2e/Redirection.test.ts"
    }
  ]
}
