internal/gitaly/storage/raftmgr/replica_registry.go (32 lines of code) (raw):
package raftmgr
import (
"fmt"
"sync"
"gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
)
func partitionKeyToString(pk *gitalypb.PartitionKey) string {
return fmt.Sprintf("%d:%s", pk.GetPartitionId(), pk.GetAuthorityName())
}
// ReplicaRegistry is an interface that defines the methods to register and retrieve replicas.
type ReplicaRegistry interface {
// GetReplica returns the replica for a given partition key.
GetReplica(key *gitalypb.PartitionKey) (RaftReplica, error)
// RegisterReplica registers a replica for a given partition key.
RegisterReplica(key *gitalypb.PartitionKey, replica RaftReplica)
// DeregisterReplica removes the replica with the given key from the registry.
DeregisterReplica(key *gitalypb.PartitionKey)
}
// raftRegistry is a concrete implementation of the ReplicaRegistry interface.
type raftRegistry struct {
replicas *sync.Map
}
// NewReplicaRegistry creates a new replicaRegistry.
func NewReplicaRegistry() *raftRegistry {
return &raftRegistry{replicas: &sync.Map{}}
}
// GetReplica returns the replica for a given partitionKey.
func (r *raftRegistry) GetReplica(key *gitalypb.PartitionKey) (RaftReplica, error) {
if mgr, ok := r.replicas.Load(partitionKeyToString(key)); ok {
return mgr.(RaftReplica), nil
}
return nil, fmt.Errorf("no replica found for partition key %+v", key)
}
// RegisterReplica registers a replica for a given partitionKey.
func (r *raftRegistry) RegisterReplica(key *gitalypb.PartitionKey, replica RaftReplica) {
r.replicas.LoadOrStore(partitionKeyToString(key), replica)
}
// DeregisterReplica removes the replica with the given key from the registry.
func (r *raftRegistry) DeregisterReplica(key *gitalypb.PartitionKey) {
r.replicas.Delete(partitionKeyToString(key))
}