Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'internal/praefect/router.go')
-rw-r--r--internal/praefect/router.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/praefect/router.go b/internal/praefect/router.go
index da9dbd36f..139bd62f9 100644
--- a/internal/praefect/router.go
+++ b/internal/praefect/router.go
@@ -3,9 +3,32 @@ package praefect
import (
"context"
+ "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
+ "github.com/sirupsen/logrus"
"google.golang.org/grpc"
)
+const (
+ logFieldRepositoryID = "repository_id"
+ logFieldReplicaPath = "replica_path"
+ logFieldAdditionalReplicaPath = "additional_replica_path"
+ logFieldPrimary = "primary"
+ logFieldSecondaries = "secondaries"
+ logFieldStorage = "storage"
+)
+
+func addRouteLogField(ctx context.Context, fields logrus.Fields) {
+ ctxlogrus.AddFields(ctx, logrus.Fields{"route": fields})
+}
+
+func routerNodeStorages(secondaries []RouterNode) []string {
+ storages := make([]string, len(secondaries))
+ for i := range secondaries {
+ storages[i] = secondaries[i].Storage
+ }
+ return storages
+}
+
// RepositoryAccessorRoute describes how to route a repository scoped accessor call.
type RepositoryAccessorRoute struct {
// ReplicaPath is the disk path where the replicas are stored.
@@ -14,6 +37,13 @@ type RepositoryAccessorRoute struct {
Node RouterNode
}
+func (r RepositoryAccessorRoute) addLogFields(ctx context.Context) {
+ addRouteLogField(ctx, logrus.Fields{
+ logFieldReplicaPath: r.ReplicaPath,
+ logFieldStorage: r.Node.Storage,
+ })
+}
+
// RouterNode is a subset of a node's configuration needed to perform
// request routing.
type RouterNode struct {
@@ -23,6 +53,12 @@ type RouterNode struct {
Connection *grpc.ClientConn
}
+func (r RouterNode) addLogFields(ctx context.Context) {
+ addRouteLogField(ctx, logrus.Fields{
+ logFieldStorage: r.Storage,
+ })
+}
+
// StorageMutatorRoute describes how to route a storage scoped mutator call.
type StorageMutatorRoute struct {
// Primary is the primary node of the routing decision.
@@ -31,6 +67,13 @@ type StorageMutatorRoute struct {
Secondaries []RouterNode
}
+func (r StorageMutatorRoute) addLogFields(ctx context.Context) {
+ addRouteLogField(ctx, logrus.Fields{
+ logFieldPrimary: r.Primary,
+ logFieldSecondaries: routerNodeStorages(r.Secondaries),
+ })
+}
+
// RepositoryMutatorRoute describes how to route a repository scoped mutator call.
type RepositoryMutatorRoute struct {
// RepositoryID is the repository's ID as Praefect identifies it.
@@ -49,6 +92,17 @@ type RepositoryMutatorRoute struct {
ReplicationTargets []string
}
+func (r RepositoryMutatorRoute) addLogFields(ctx context.Context) {
+ addRouteLogField(ctx, logrus.Fields{
+ logFieldRepositoryID: r.RepositoryID,
+ logFieldReplicaPath: r.ReplicaPath,
+ logFieldAdditionalReplicaPath: r.AdditionalReplicaPath,
+ logFieldPrimary: r.Primary,
+ logFieldSecondaries: routerNodeStorages(r.Secondaries),
+ "replication_targets": r.ReplicationTargets,
+ })
+}
+
// RepositoryMaintenanceRoute describes how to route a repository scoped maintenance call.
type RepositoryMaintenanceRoute struct {
// RepositoryID is the repository's ID as Praefect identifies it.
@@ -59,6 +113,14 @@ type RepositoryMaintenanceRoute struct {
Nodes []RouterNode
}
+func (r RepositoryMaintenanceRoute) addLogFields(ctx context.Context) {
+ addRouteLogField(ctx, logrus.Fields{
+ logFieldRepositoryID: r.RepositoryID,
+ logFieldReplicaPath: r.ReplicaPath,
+ "storages": routerNodeStorages(r.Nodes),
+ })
+}
+
// Router decides which nodes to direct accessor and mutator RPCs to.
type Router interface {
// RouteStorageAccessor returns the node which should serve the storage accessor request.