)]}'
{
  "commit": "e70cefe8a283c5bbf8b2d55f2788bab73bbcfbef",
  "tree": "c7c991ff161b93c8d69c88d6d3f062fb4d4b6669",
  "parents": [
    "ace60d47d05689fb9074b7fb5fbbc0b8960cf1da"
  ],
  "author": {
    "name": "Kaushik Lingarkar",
    "email": "klingarkar@nvidia.com",
    "time": "Fri Aug 07 09:13:51 2026 -0700"
  },
  "committer": {
    "name": "Gerrit Code Review",
    "email": "noreply-gerritcodereview@google.com",
    "time": "Fri Aug 07 09:13:51 2026 -0700"
  },
  "message": "Update git submodules\n\n* Update plugins/replication from branch \u0027master\u0027\n  to f0b8c225e060c49072c5a000d5462cb46f5c5b53\n  - Distributor: Skip re-fire of already pending tasks\n    \n    On every cycle the distributor streams all tasks under waiting/ and\n    calls fireFromStorage() for each one, which allocates a fresh\n    ReplicationState and consolidates it into the pending PushOne for that\n    URI. PushOne deduplicates refs, since refBatchesToPush is a Set, but\n    its stateMap is a ListMultimap that appends unconditionally. A task\n    that stays in waiting/ across cycles therefore grows the pending\n    task\u0027s notification list by one entry per ref per cycle while adding\n    no work at all.\n    \n    The distributor already snapshots the ref updates carried by pending\n    push tasks, in order to prune queue entries whose stored counterpart\n    is gone. Each streamed update is removed from that snapshot, leaving\n    only the prunable ones behind by the end. Reuse that removal as the\n    test, i.e a non-null result means a pending task on this node is already\n    holding the update, so re-firing it would append a redundant state. Skip\n    it, and let only updates with no pending task reach fireFromStorage().\n    Tasks written by another primary are absent from the snapshot and\n    continue to be fired, so cluster distribution is unaffected.\n    \n    This change removes the repeat re-fires when Prune.TRUE rather than\n    every possible source of stateMap growth. The startup replay passes\n    Prune.FALSE and is deliberately left uncovered. It walks each waiting/\n    file exactly once, so no task is fired twice into the same pending push\n    and the growth is not reachable there today.\n    \n    Change-Id: Ib9e77f9cf99cab3d5a6f110f0578ae02eafe9198\n    \n  - Distributor: Add tests for firing of tasks from storage\n    \n    Add test coverage to ensure the distributor fires an update which no\n    pending task on this node is holding, and the startup replay fires\n    unconditionally, without looking at the pending push tasks.\n    \n    Change-Id: If7fb97cbe9e64dc21dbfb5593541ed2367dad1f5\n    ",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c89dc44d4bddfc7d2d34051c7d5aebf7755c6f2e",
      "old_mode": 57344,
      "old_path": "plugins/replication",
      "new_id": "f0b8c225e060c49072c5a000d5462cb46f5c5b53",
      "new_mode": 57344,
      "new_path": "plugins/replication"
    }
  ]
}
