)]}'
{
  "commit": "a418c12074e796ab8e01484c715804a071370e4a",
  "tree": "75ee12ee5add5a48a50abed3007253ab000c79b0",
  "parents": [
    "4296f7364429ffe5e537756199cd14daab2d3353"
  ],
  "author": {
    "name": "Kaushik Lingarkar",
    "email": "klingarkar@nvidia.com",
    "time": "Mon May 18 16:32:53 2026 -0700"
  },
  "committer": {
    "name": "Kaushik Lingarkar",
    "email": "klingarkar@nvidia.com",
    "time": "Wed Jul 15 09:39:27 2026 -0700"
  },
  "message": "Auto-repair replication on missing necessary objects error\n\nWhen a replication push fails because the remote git-receive-pack\nreports \u0027missing necessary objects\u0027, the destination is likely corrupt\nand requires manual intervention. Detect that error and, when enabled,\nschedule an asynchronous repair.\n\nRepair only runs for plain SSH destinations (not gerrit+ssh, http, or\ngit protocols) since rsync over SSH is required. Attempts are tracked\nper project+destination and gated by three new config options:\n\n  * autoRepairMaxAttempts (default 0, disabled): maximum number of\n    auto-repair attempts per project on each destination URL\n  * autoRepairInterval (default 3days): minimum spacing between\n    attempts for the same (project, destination)\n  * autoRepairConcurrencyLimit (default 2): maximum number of\n    auto-repair tasks allowed to run concurrently\n\nTracker state is in-memory and resets on plugin reload or Gerrit\nrestart, so the cap is best-effort rather than persistent. Enabling\nauto-repair in a clustered deployment can lead to redundant repairs as\nstate is not shared across nodes. This could be improved later if\ndesired, perhaps by persisting the state using the replication task\nstorage.\n\nAuto-repair deliberately uses the failing destination URI instead of\nround-robin failover, since repairs target corruption errors and are\nmore likely to succeed on the URL that just reported the problem.\n\nRelease-Notes: Auto-repair replication on missing objects errors\nChange-Id: I815f620af93b484fa801d0c953d56b6a6b00be66\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0c77b16262225d12cf5c4ccb3ebca29da8890514",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java",
      "new_id": "e2027290623984b02095b8791134e4fe3bbae3b0",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1be875898069d9d18b25a843caa8b0c2456ba35a",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/AutoRepairHandler.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "53d9c9ea18650d597e267bd881f31cccbcdac1fa",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/AutoRepairTracker.java"
    },
    {
      "type": "modify",
      "old_id": "c57f2560e572bc6c70747eb49f68cd941d6eac1d",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java",
      "new_id": "867ffa4fb4f621a5becb30fe073f011de854ead0",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java"
    },
    {
      "type": "modify",
      "old_id": "0e04e1e6ac669064e35484bde5b1189d767391ee",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java",
      "new_id": "232aa23d2808f03e3cfb166d6904bb41dfb8a22d",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java"
    },
    {
      "type": "modify",
      "old_id": "f6252321b5cfcbfd4856555c21a59e384b45f1ca",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationConfigImpl.java",
      "new_id": "72cd417547da2935a7d9d8e6746d41982335abdd",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationConfigImpl.java"
    },
    {
      "type": "modify",
      "old_id": "60c0254895cebdffcd889e5a9c68c291b29ea3b6",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java",
      "new_id": "711228b1570025bc3c279d26d536480376a06965",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java"
    },
    {
      "type": "modify",
      "old_id": "7202eab27affada9f0283a1302d2b0f898e21fb7",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStarter.java",
      "new_id": "e7157470be8464af09a705a4cf04cd09d8770569",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStarter.java"
    },
    {
      "type": "modify",
      "old_id": "1714c1a7b0a309b103efc6101b72cee5c1795685",
      "old_mode": 33188,
      "old_path": "src/main/java/com/googlesource/gerrit/plugins/replication/api/ReplicationConfig.java",
      "new_id": "6860098ae155debfe1531b3b233ac21bc82b82ae",
      "new_mode": 33188,
      "new_path": "src/main/java/com/googlesource/gerrit/plugins/replication/api/ReplicationConfig.java"
    },
    {
      "type": "modify",
      "old_id": "cef009c3354e9e086904366564fea450f122df8f",
      "old_mode": 33188,
      "old_path": "src/main/resources/Documentation/config.md",
      "new_id": "cf1b944a088a475395781663c68e7d01e4dd4d83",
      "new_mode": 33188,
      "new_path": "src/main/resources/Documentation/config.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "865ed2389008fe8dcd0e9aee845233e06ba9e82c",
      "new_mode": 33188,
      "new_path": "src/test/java/com/googlesource/gerrit/plugins/replication/AutoRepairTrackerTest.java"
    },
    {
      "type": "modify",
      "old_id": "339123a4fd1c5b21bc419bdd3ac77b9c1654cbfc",
      "old_mode": 33188,
      "old_path": "src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java",
      "new_id": "6def78fb398fd0a657734aede95f4b1de7a50c9b",
      "new_mode": 33188,
      "new_path": "src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java"
    }
  ]
}
