mirror of
https://github.com/project-zot/zot.git
synced 2026-06-16 04:17:55 +08:00
feat(sync): support for periodic repo sync in scale-out cluster (#2424)
This commit includes support for periodic repo sync in a scale-out cluster. Before this commit, all cluster members would sync all the repos as the config is shared. With this change, in periodic sync, the cluster member checks whether it manages the repo. If it does not manage the repo, it will skip the sync. This commit also includes a unit test to test on-demand sync too, but there are no logic changes for it as it is implicitly handled by the proxying logic. Signed-off-by: Vishwas Rajashekar <vrajashe@cisco.com>
This commit is contained in:
committed by
GitHub
parent
2bb46b0562
commit
767f81d4f5
+2
-18
@@ -8,11 +8,10 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/dchest/siphash"
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"zotregistry.dev/zot/pkg/api/config"
|
||||
"zotregistry.dev/zot/pkg/api/constants"
|
||||
"zotregistry.dev/zot/pkg/cluster"
|
||||
"zotregistry.dev/zot/pkg/common"
|
||||
)
|
||||
|
||||
@@ -46,8 +45,7 @@ func ClusterProxy(ctrlr *Controller) func(http.HandlerFunc) http.HandlerFunc {
|
||||
|
||||
// the target member is the only one which should do read/write for the dist-spec APIs
|
||||
// for the given repository.
|
||||
targetMemberIndex, targetMember := computeTargetMember(config, name)
|
||||
|
||||
targetMemberIndex, targetMember := cluster.ComputeTargetMember(config.Cluster.HashKey, config.Cluster.Members, name)
|
||||
logger.Debug().Str(constants.RepositoryLogKey, name).
|
||||
Msg(fmt.Sprintf("target member socket: %s index: %d", targetMember, targetMemberIndex))
|
||||
|
||||
@@ -86,20 +84,6 @@ func ClusterProxy(ctrlr *Controller) func(http.HandlerFunc) http.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
// computes the target member using siphash and returns the index and the member
|
||||
// siphash was chosen to prevent against hash attacks where an attacker
|
||||
// can target all requests to one given instance instead of balancing across the cluster
|
||||
// resulting in a Denial-of-Service (DOS).
|
||||
// ref: https://en.wikipedia.org/wiki/SipHash
|
||||
func computeTargetMember(config *config.Config, name string) (uint64, string) {
|
||||
h := siphash.New([]byte(config.Cluster.HashKey))
|
||||
h.Write([]byte(name))
|
||||
sum64 := h.Sum64()
|
||||
targetIdx := sum64 % uint64(len(config.Cluster.Members))
|
||||
|
||||
return targetIdx, config.Cluster.Members[targetIdx]
|
||||
}
|
||||
|
||||
// gets all the server sockets of a target member - IP:Port.
|
||||
// for IPv6, the socket is [IPv6]:Port.
|
||||
// if the input is an IP address, returns the same targetMember in an array.
|
||||
|
||||
Reference in New Issue
Block a user