)]}'
{
  "commit": "8d82f8d261b14b73385ba66e44279c53bb9fef13",
  "tree": "f7332695f7546dd34ac043ac4ce4d6dcc6547dce",
  "parents": [
    "ad8982fcd78a3408c024d9031fa611b48dd86304"
  ],
  "author": {
    "name": "Jan Schär",
    "email": "jan@monogon.tech",
    "time": "Wed Sep 18 11:22:46 2024 +0200"
  },
  "committer": {
    "name": "Jan Schär",
    "email": "jan@monogon.tech",
    "time": "Thu Sep 26 11:44:09 2024 +0000"
  },
  "message": "m/n/c/curator: maintain consistency between roles and etcd members\n\nWhen updating the consensus role, both etcd membership and the role need\nto be updated. It is possible that the etcd membership change is applied\nbut the role update fails, resulting in an inconsistency. This change\nadds a background process which cleans up this inconsistency by updating\nroles to match etcd membership.\n\nThis is partially based on previous work by Serge Bazanski, where this\nbackground sync was performed in the opposite direction: etcd membership\nis removed if the role is missing. Here, I instead update the role based\non etcd membership. This has the benefit that we finish partially\napplied management operations, instead of fighting them.\n\nCo-authored-by: Serge Bazanski \u003cserge@monogon.tech\u003e\nChange-Id: I8871b068d1d20c65bcbea5289eafe54676906819\nReviewed-on: https://review.monogon.dev/c/monogon/+/3438\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "fb8336af0c64bc236b49d3ec483ec08d87663f0e",
      "old_mode": 33188,
      "old_path": "metropolis/node/core/curator/BUILD.bazel",
      "new_id": "eb6dbc81b76c9430537ef44bb8345d279fcb769d",
      "new_mode": 33188,
      "new_path": "metropolis/node/core/curator/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "fe60550c9b626f087a7a4f81edb6373141329f17",
      "old_mode": 33188,
      "old_path": "metropolis/node/core/curator/impl_leader.go",
      "new_id": "6d5be0f3089f01d0bcffbe74d0f8a826bd19edb9",
      "new_mode": 33188,
      "new_path": "metropolis/node/core/curator/impl_leader.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "46f78ec44696b52edbbe4a6e67bb3a6e02057b2c",
      "new_mode": 33188,
      "new_path": "metropolis/node/core/curator/impl_leader_background.go"
    },
    {
      "type": "modify",
      "old_id": "917ba667a37659baf9ee360ca03ebb920aeaa178",
      "old_mode": 33188,
      "old_path": "metropolis/node/core/curator/impl_leader_test.go",
      "new_id": "a6ad457937943e253848ae09ab1d38438ffa6ff4",
      "new_mode": 33188,
      "new_path": "metropolis/node/core/curator/impl_leader_test.go"
    },
    {
      "type": "modify",
      "old_id": "d0995831f13c26a0f5459ff122425a6b3becf4b9",
      "old_mode": 33188,
      "old_path": "metropolis/node/core/curator/listener.go",
      "new_id": "40d1f19f37f370a44d60592f1581ecd192ac99ef",
      "new_mode": 33188,
      "new_path": "metropolis/node/core/curator/listener.go"
    }
  ]
}
