raft: Prep work for Raft cluster bootstrapping
For #6152 (closed), a portion of #6032 (closed)
This MR contains all prep work for the main implementation of cluster bootstrapping. It includes:
- Add Raft config to Gitaly.
- Declare cluster protobuf definitions
- Some utility modules such as logger, ID system, etc.
- Implement an abstraction to interact with the Raft cluster
The main implementation MR is in draft here: !7005 (diffs). It will change heavily soon, but it acts as a good reference for how the mentioned utilities are used.
A sample Raft config:
[raft]
cluster_id = "7766d7c1-7266-4bc9-9dad-5ee8617c455b"
node_id = 1
raft_addr = "127.0.0.1:3001"
initial_addresses = {1: "127.0.0.1:3001", 2: "127.0.0.1:3002", 3: "127.0.0.1:3003"}
The main focus of this MR is the requester abstraction. It allows the caller to interact with the cluster in a safer way.
requester := NewRequester[*gitalypb.RegisterStorageRequest, *gitalypb.RegisterStorageResponse](
node, groupID, logger, requestOption{
retry: 5
timeout: 1 * time.Second,
},
)
result, response, err := requester.SyncWrite(ctx, &gitalypb.RegisterStorageRequest{StorageName: "storage-2"})
requester := NewRequester[*gitalypb.GetClusterRequest, *gitalypb.GetClusterResponse](
node, groupID, logger, requestOption{
retry: 5
timeout: 1 * time.Second,
},
)
response, err := requester.SyncRead(ctx, &gitalypb.GetClusterRequester{})
Edited by Quang-Minh Nguyen