)]}'
{
  "commit": "42547e4645cc67adc922ffd7a1db973da226d85e",
  "tree": "e05bca4bc5929600827c8545c9c02c0ac5bb760c",
  "parents": [
    "f9605ddf7774b98b89d3e4587d1a195d7620f493"
  ],
  "author": {
    "name": "Josh Hutton",
    "email": "55123932+JoshHuttonCode@users.noreply.github.com",
    "time": "Sun May 03 02:10:44 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun May 03 02:10:44 2026 -0700"
  },
  "message": "Add an implementation of the Raft consensus protocol (#223)\n\n* Bumped zlib version\nfixed a race condition in deploy_local.sh\n\n* Added Raft files, currently copies of PoE files per Dakai\u0027s guide.\n\n* set PoE script to use pbft\u0027s kvtools\n\n* Replace view change flag with leader election flag\n\n* WIP add initial happy path raft implementation\n\n* WIP some bug fixes\n\n* WIP log statements to try and figure things out\n\n* WIP fix using wrong value for leader id\n\n* WIP more print statements\n\n* Fixed errors in build files to support Intellisense\n\n* WIP temp change to broadcast\n\n* WIP add more prints, leader commits and executes\n\n* WIP switch back to SendMessage\n\n* WIP fixed committing condition\n\n* Added Heartbeat and Elections triggered by timeout\n\n* Update variable names to match the Raft paper\n\n* in progress requestVote and requestVoteResponse handlers\n\n* finished adding leader election logic, it seems buggy though.\n\n* blocked input from client, set appendEntries handler to always be happy\nraised timeout window and heartbeat interval\n\n* testing\n\n* testing leader election\n\n* staging for merge into raft branch\n\n* Added logic to redirect client proxy to current leader\n\n* Fix AppendEntries failure path to back off nextIndex and retry\n\n* redirect to leader working even on later terms\n\n* seems to kind of work. worried about duplicate entries?\n\n* modified some logging, changed config\n\n* moved some variables around in header, changed receivePropose to ReceiveAppendEntries\n\n* Swapped to requests instead of AppendEntries outside RPC logic\n\n* implemented LogEntry struct instead of using AppendEntries for everything\n\n* Create and send individual AppendEntries to each follower from ReceiveTransaction\n\n* Setting nextIndex to lastlogindex() - 1 in ReceiveAEResponse fail case\n\n* Modified CreateAndSendAppendEntries to CreateAndSendAppendEntryMsg and used it in ReceiveAppendEntriesResponse\n\n* Fix issues from the previous commit\n\n* WIP catch up transactions to leader\u0027s most current log entry\n\n* staging for benchmarks\n\n* Added support for multiple entries in AppendEntries RPC\nHeartbeat is skipped if leader recently broadcasted AppendEntries\nAdded logic for followers to truncate their log when leader sends conflicting entries\n\n* added followerId field to AeFields struct to simplify code\nchanged variable names for semanatic value\nremoved one line conditionals for readability\n\n* revamped follower truncate/append logic\n\n* added some comments to Raft::ReceiveAppendEntries method\n\n* update inflight limit code\n\n* modified config generation script to accomodate changes to config reading in upstream code\n\n* Add a function for use in later commit\n\n* Add tests related to timeouts and heartbeats for Raft\n\n* Add initial Raft tests for sending and receiving AppendEntries\n\n* Update tests, restructure raft tests to support multiple raft test files\n\n* Add tests for ReceiveAppendEntriesResponse()\n\n* Add tests related to voting\n\n* Run clang format and other style changes\n\n* Undo some changes unrelated to Raft\n\n* Change log_ to vector\u003cLogEntry\u003e. Add helper functions for future use\n\n* Change LogEntry to store Entry directly\n\n* WIP Add RaftRecovery class\n\n* WIP Extract common Recovery code to BaseRecovery\n\n* WIP Update RaftRecovery and tests, tentatively working\n\n* Run clang format\n\n* Change the templating of Recovery\n\n* Reorganize file structure of recovery files\n\n* Update things missed in previous commit\n\n* Fix RaftRecovery issue, add test for it, adjust dependencies\n\n* Remove access modifier change for test compilation, change whitespace\n\n* Address some PR comments, fix broken tests\n\nTests now work again after adding Recovery.\nAddressed minor test concerns.\nAdd Log Truncation support to Raft Recovery. This includes a new WALRecord and TruncationRecord protobuf message.\nMove LastLogIndex and log_ resizing into AddToLog and TruncateLog.\nAdd PrintDebugStateLocked() so that PrintDebugState() can be called under the lock.\nChange Recovery to not ignore all recovery data if a portion of the data is wrong.\n\n* Improve reliability of RaftRecovery\n\n* Update changes for tests, change how log is accessed\n\nFor checkpointing, we need to separate the logical log index and size from the actual indexing and size of the vector.\n\n* Add Checkpointing, new tests, miscellaneous changes\n\nAdded some handling to deal with snapshotting in Raft. Checkpoints will be taken, the last snapshot index and term need to be stored, and index arithmetic needs to be accounted for. Note that this largely is not yet in use, as the hook to actual truncate a prefix in Consensus is currently commented out. Once there is handling to send and receive Snapshots, this will be used.\n\nAdded a callback hook in recovery to let the consensus protocol know when a checkpoint has finished and up to what seq it covers.\n\nMoved some Raft test header functionality into a general Raft test utility to not be attached to that specific text fixture.\n\nAdded some new tests for existing Raft features.\n\nUpdated lastApplied_ in Raft to be lastCommitted (meaning we have queued it to be committed). lastApplied is now tracked in Raft\u0027s Consensus class.\n\nFixed a bug with min_seq_ tracking in Recovery.\n\nFixed potential issues with edge cases in ReadLogsFromFiles.\n\n* Undo change to recovery_ckpt_time_s_\n\n---------\n\nCo-authored-by: Jim Brower \u003cjimrabrower@gmail.com\u003e\nCo-authored-by: nachiket \u003cnachocheeeze922@gmail.com\u003e\nCo-authored-by: yhuan331 \u003cyhuan331@ucsc.edu\u003e\nCo-authored-by: hammerface \u003chammerface@users.noreply.github.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "134386e2a8a2f7d8941c5d30993557623e198179",
      "old_mode": 33188,
      "old_path": "WORKSPACE",
      "new_id": "44ed3bc06e5cfdb3446779aa389675f85db85c9e",
      "new_mode": 33188,
      "new_path": "WORKSPACE"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a65b722406f1ae3f63551cf5728126bd6c65dffd",
      "new_mode": 33188,
      "new_path": "benchmark/protocols/raft/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a74ef4537555a1146d3e38a1c936c975d622201d",
      "new_mode": 33188,
      "new_path": "benchmark/protocols/raft/kv_server_performance.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "43627b34f44561bed914eefcf8c7a3dbef9d8866",
      "new_mode": 33188,
      "new_path": "benchmark/protocols/raft/kv_service_tools.cpp"
    },
    {
      "type": "modify",
      "old_id": "de49376e752d7c5b82ef6af2e01c31f6fb050c5c",
      "old_mode": 33188,
      "old_path": "chain/storage/leveldb.cpp",
      "new_id": "47ae7a84ebd13e877fdf858862219028e08250cc",
      "new_mode": 33188,
      "new_path": "chain/storage/leveldb.cpp"
    },
    {
      "type": "modify",
      "old_id": "67ec7a40c28822782bbd12273cd8b781f9eb11f2",
      "old_mode": 33188,
      "old_path": "chain/storage/leveldb.h",
      "new_id": "f55e062ecce60122e968f424e85ca535711c063c",
      "new_mode": 33188,
      "new_path": "chain/storage/leveldb.h"
    },
    {
      "type": "modify",
      "old_id": "6b17c326201793f44351f0c18a485fb542f43e12",
      "old_mode": 33188,
      "old_path": "chain/storage/mock_storage.h",
      "new_id": "14681db728cff730e8eceffba2e30da08bc7a679",
      "new_mode": 33188,
      "new_path": "chain/storage/mock_storage.h"
    },
    {
      "type": "modify",
      "old_id": "7a0bfe5362730f5e57dd7118a29879e443d93bfe",
      "old_mode": 33188,
      "old_path": "chain/storage/storage.h",
      "new_id": "90db47694ba4e8a09b3eb40bc662852a0920bdc6",
      "new_mode": 33188,
      "new_path": "chain/storage/storage.h"
    },
    {
      "type": "modify",
      "old_id": "f8e47052a22d12a1dff036eba013d91bac5184bd",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/common/algorithm/protocol_base.h",
      "new_id": "d180746bdab162b91b4b678aaa3b6f81b36f6a5c",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/common/algorithm/protocol_base.h"
    },
    {
      "type": "modify",
      "old_id": "2f2884b89383c0a26032e2b25ff7bcccf05e6744",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/common/framework/consensus.h",
      "new_id": "022cc58bf3da1bc6bbb2c651416d7a775a7dcce9",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/common/framework/consensus.h"
    },
    {
      "type": "modify",
      "old_id": "ebaf1d6ab8d232f6b692da00988d3ffa87587174",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/common/framework/performance_manager.cpp",
      "new_id": "ed77c364608f9a694c7e40a00ef187577dd93282",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/common/framework/performance_manager.cpp"
    },
    {
      "type": "modify",
      "old_id": "c2dce102693efc3ba29382c958f8bbb1c21849ac",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/common/framework/performance_manager.h",
      "new_id": "b4fbf133a876b8bd6ce326be9b1508675e2aca8e",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/common/framework/performance_manager.h"
    },
    {
      "type": "modify",
      "old_id": "d7b3880766d3e29c4dc5f408dfb052a24ec7fdcb",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/pbft/consensus_manager_pbft.cpp",
      "new_id": "9023365f49ec67c480145207a24188892361be85",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/pbft/consensus_manager_pbft.cpp"
    },
    {
      "type": "modify",
      "old_id": "4df5e9c2e390a9e5f6a6b2d4a45da03ee4f6e3ee",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/pbft/consensus_manager_pbft.h",
      "new_id": "947ede07acf5815f29db1d56429a623cbd893f0f",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/pbft/consensus_manager_pbft.h"
    },
    {
      "type": "modify",
      "old_id": "197caac485973728a825f98879146e22485a36d0",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/pbft/query.cpp",
      "new_id": "732fa437a4d6bb863ad8eb754951e3d65bc7a971",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/pbft/query.cpp"
    },
    {
      "type": "modify",
      "old_id": "85f2e4c566427614a50aa07f708918ec5dfd7042",
      "old_mode": 33188,
      "old_path": "platform/consensus/ordering/pbft/query.h",
      "new_id": "4678fb83eff0b3f45040b552996e2bad4016fc7e",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/pbft/query.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9b713d7845af223ff0fedd75d7b5884553089e68",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "acb6cc5673d57447aa9c588d57b6c1fbff0de46f",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/leader_election_manager_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d2e4f1bf03ec469cea7570b1586103e9884c8cc2",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/leaderelection_manager.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "987cadd36756741081bea837821ca72300e341b4",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/leaderelection_manager.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "42b4e4502e63fd7f84d56202a6c21a3ca40ac0f8",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/mock_leader_election_manager.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2cd58089cf53a403fc08f1200898c1abb03940bf",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/mock_raft.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4b78b13359a5af36a373c20c49bcd73b87cbcda4",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5d33142c325deffaba94934d30b0f745bbaf377d",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "aaad9e8d8fe9b1ce2c132c5732e0673928392839",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_append_entries_response_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fbbba46b3562977958b5b45924356b625e907e6a",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_append_entries_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "61841dc0ad4e18e1e23dd3db000b5022afedf552",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_integration_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "08cd6c456c2bb7cade1451690d67a0bf3a11081a",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_request_vote_response_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "156a8ab1388670247c45b98bd04ef9a3a4920258",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_request_vote_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b468edc230f1cb20a6a5b6e1a1574ec837d2aa91",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_test_util.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5ead2ec96344ce1ed8f9841f53f10c3cf78174b0",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/algorithm/raft_tests.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6c70d578351f6968ddc0e4a82f1fa651732f87a7",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/framework/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c6c01117cb4717e0721903cad781d4b03185569e",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/framework/consensus.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "68ed55c44ebd7868a768c01ad586f39422489e84",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/framework/consensus.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c4774a27c71454cde8d9aceb1d51155a06450f68",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/framework/raft_checkpoint_manager.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "114b78e24bdf67d0689ea379451d549e263290e5",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/proto/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "835d5132f3fad45b876d8e590a4cbda8a1b3e4e7",
      "new_mode": 33188,
      "new_path": "platform/consensus/ordering/raft/proto/proposal.proto"
    },
    {
      "type": "modify",
      "old_id": "d429c6a7e81e9cf29587ae30b87d6d15373915b1",
      "old_mode": 33188,
      "old_path": "platform/consensus/recovery/BUILD",
      "new_id": "e9e74755ad15da759a0500f638033ac97055aa8d",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "136997263a5e5f9679ec9fce81a66bfe372bdd8a",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/mock_raft_recovery.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "65e893ed0afa700a27d61a7c619a3b561482250e",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/pbft_recovery.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6925b8ba1694f46ad6b867b8a130e9b6db8a2bb5",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/pbft_recovery.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b0d5d421df7c07b49bcec5eca645510ea3543254",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/raft_recovery.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0ab7ffaa97b8fc7a1e1610961f9cac32bf3846bd",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/raft_recovery.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3bcabfa292223aac7121d302957b5796b66b35f0",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/raft_recovery_test.cpp"
    },
    {
      "type": "delete",
      "old_id": "9e37f6eb7062dd3e88583923088c2f2dbfd6ec68",
      "old_mode": 33188,
      "old_path": "platform/consensus/recovery/recovery.cpp",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "426bffd27584dd8cb14c24b1244bdcca8b9ae288",
      "old_mode": 33188,
      "old_path": "platform/consensus/recovery/recovery.h",
      "new_id": "1517f6dd8aa6e47f7b23485e09a41e550d9014c0",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/recovery.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "463dc905e5b41c0efadb07d8c68caee69f0f39ad",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/recovery_impl.h"
    },
    {
      "type": "modify",
      "old_id": "f6aeba4734e68c34be10388a5ad8ef48366d6360",
      "old_mode": 33188,
      "old_path": "platform/consensus/recovery/recovery_test.cpp",
      "new_id": "9317589ef247ef49cc9eecf059f33d9affa1f35a",
      "new_mode": 33188,
      "new_path": "platform/consensus/recovery/recovery_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c688e75e3ddcd4d30fb5fcdcdf60ffb7fa669620",
      "new_mode": 33261,
      "new_path": "raft_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "1de013abf3cff69890f3c82bdbf6d55266411d93",
      "old_mode": 33188,
      "old_path": "scripts/deploy/config/pbft.config",
      "new_id": "e13d03df63f462fa8af0922eff526da3267fe86e",
      "new_mode": 33188,
      "new_path": "scripts/deploy/config/pbft.config"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d24bb8493b32d022bbe99bc18a74306e3fcd0768",
      "new_mode": 33188,
      "new_path": "scripts/deploy/config/raft.config"
    },
    {
      "type": "modify",
      "old_id": "f6892d268583d736d587b00156563a1c477b713c",
      "old_mode": 33188,
      "old_path": "scripts/deploy/performance/calculate_result.py",
      "new_id": "5852c3d472d0467db7acd6d7d81f19b66ec79de7",
      "new_mode": 33188,
      "new_path": "scripts/deploy/performance/calculate_result.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9603df099f1bf4b5c9049984387246a83939c220",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance/raft_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "7ef2b8a798c3a11be500a0d7a7cb02b7863c6972",
      "old_mode": 33261,
      "old_path": "scripts/deploy/performance/run_performance.sh",
      "new_id": "ca3f49a1329eba5d238e27b4caa692594628776c",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance/run_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "003b9787f8b13833f840b15c2a18faf4e37a9088",
      "old_mode": 33261,
      "old_path": "scripts/deploy/performance_local/pbft_performance.sh",
      "new_id": "5b337fe3185eb625068a1f9600f0895781f21f0e",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance_local/pbft_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "fd23e077a1d9bc3d30ac97fcc7b13b039f466d86",
      "old_mode": 33261,
      "old_path": "scripts/deploy/performance_local/poe_performance.sh",
      "new_id": "bbb48846febeefeeb43cafed0be5ce76a7f04fb7",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance_local/poe_performance.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "def1aa30effbb18776b3eaaf9630a040e0497697",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance_local/raft_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "25cab4cf4c03f420ce1e9505633ab16fd92acc88",
      "old_mode": 33261,
      "old_path": "scripts/deploy/performance_local/run_performance.sh",
      "new_id": "558c2282c1385c69268804fb02da87ea25aab9b0",
      "new_mode": 33261,
      "new_path": "scripts/deploy/performance_local/run_performance.sh"
    },
    {
      "type": "modify",
      "old_id": "11145de839639adea56b3c66a9073d66eec34571",
      "old_mode": 33261,
      "old_path": "scripts/deploy/script/deploy_local.sh",
      "new_id": "778ce744a5d6a759070d6c7b0f706c80bba367c4",
      "new_mode": 33261,
      "new_path": "scripts/deploy/script/deploy_local.sh"
    },
    {
      "type": "modify",
      "old_id": "aa3d77d71a20eca8ff2bc73f2458af80fcaf18b7",
      "old_mode": 33261,
      "old_path": "scripts/deploy/script/generate_config.sh",
      "new_id": "4fce410e0da57cfd1e92387b72a6b308092ef796",
      "new_mode": 33261,
      "new_path": "scripts/deploy/script/generate_config.sh"
    }
  ]
}
