1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
package info
import (
"context"
"errors"
"gitlab.com/gitlab-org/gitaly/v15/structerr"
"gitlab.com/gitlab-org/gitaly/proto/v15/go/gitalypb"
"gitlab.com/gitlab-org/gitaly/v15/internal/praefect/commonerr"
"gitlab.com/gitlab-org/gitaly/v15/internal/praefect/datastore"
"google.golang.org/protobuf/types/known/timestamppb"
)
// GetRepositoryMetadata returns the cluster metadata for a repository.
func (s *Server) GetRepositoryMetadata(ctx context.Context, req *gitalypb.GetRepositoryMetadataRequest) (*gitalypb.GetRepositoryMetadataResponse, error) {
var getMetadata func() (datastore.RepositoryMetadata, error)
switch query := req.Query.(type) {
case *gitalypb.GetRepositoryMetadataRequest_RepositoryId:
getMetadata = func() (datastore.RepositoryMetadata, error) {
return s.rs.GetRepositoryMetadata(ctx, query.RepositoryId)
}
case *gitalypb.GetRepositoryMetadataRequest_Path_:
getMetadata = func() (datastore.RepositoryMetadata, error) {
return s.rs.GetRepositoryMetadataByPath(ctx, query.Path.VirtualStorage, query.Path.RelativePath)
}
default:
return nil, structerr.NewInternal("unknown query type: %T", query)
}
metadata, err := getMetadata()
if err != nil {
if errors.Is(err, commonerr.ErrRepositoryNotFound) {
return nil, structerr.NewNotFound("%w", err)
}
return nil, structerr.NewInternal("get metadata: %w", err)
}
replicas := make([]*gitalypb.GetRepositoryMetadataResponse_Replica, 0, len(metadata.Replicas))
for _, replica := range metadata.Replicas {
var verifiedAt *timestamppb.Timestamp
if !replica.VerifiedAt.IsZero() {
verifiedAt = timestamppb.New(replica.VerifiedAt)
}
replicas = append(replicas, &gitalypb.GetRepositoryMetadataResponse_Replica{
Storage: replica.Storage,
Assigned: replica.Assigned,
Generation: replica.Generation,
Healthy: replica.Healthy,
ValidPrimary: replica.ValidPrimary,
VerifiedAt: verifiedAt,
})
}
return &gitalypb.GetRepositoryMetadataResponse{
RepositoryId: metadata.RepositoryID,
VirtualStorage: metadata.VirtualStorage,
RelativePath: metadata.RelativePath,
ReplicaPath: metadata.ReplicaPath,
Primary: metadata.Primary,
Generation: metadata.Generation,
Replicas: replicas,
}, nil
}
|