Skip to content

raft: Prep work for Raft cluster bootstrapping

For #6152 (closed), a portion of #6032

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

Merge request reports