diff options
author | Pavlo Strokov <pstrokov@gitlab.com> | 2020-05-18 14:42:19 +0300 |
---|---|---|
committer | Pavlo Strokov <pstrokov@gitlab.com> | 2020-05-19 14:27:51 +0300 |
commit | a6c5bfb562d6dd7c41657634f26b17764e4fec3c (patch) | |
tree | 1189fbd3be81d2436c7f9f193ad4176c4d5dcb67 | |
parent | 6d6b8db3b76f57d5a459cc64fd3ac583e6d96bf7 (diff) |
Include Praefect usage in the usage ping
With introduction of praefect between GitLab and Gitaly it is
required to include info about Praefect into Usage Ping.
As Praefect is a transparent proxy between two listed above
the new parameter is added to the response and will be filled
by the Praefect after gathering info from Gitalies behind it.
Later it will be used to calculate the number of storages
to send statistics into Usage Ping.
Part of: https://gitlab.com/gitlab-org/gitaly/-/issues/2664
-rw-r--r-- | changelogs/unreleased/ps-group-for-storage-info.yml | 5 | ||||
-rw-r--r-- | internal/praefect/server_test.go | 62 | ||||
-rw-r--r-- | internal/praefect/service/server/info.go | 4 | ||||
-rw-r--r-- | internal/service/server/info.go | 11 | ||||
-rw-r--r-- | internal/service/server/info_test.go | 2 | ||||
-rw-r--r-- | proto/go/gitalypb/server.pb.go | 67 | ||||
-rw-r--r-- | proto/server.proto | 1 | ||||
-rw-r--r-- | ruby/proto/gitaly/server_pb.rb | 1 |
8 files changed, 91 insertions, 62 deletions
diff --git a/changelogs/unreleased/ps-group-for-storage-info.yml b/changelogs/unreleased/ps-group-for-storage-info.yml new file mode 100644 index 000000000..0c6db3e7a --- /dev/null +++ b/changelogs/unreleased/ps-group-for-storage-info.yml @@ -0,0 +1,5 @@ +--- +title: Include Praefect usage in the usage ping +merge_request: 2180 +author: +type: changed diff --git a/internal/praefect/server_test.go b/internal/praefect/server_test.go index c9cd4fdce..47d38f75d 100644 --- a/internal/praefect/server_test.go +++ b/internal/praefect/server_test.go @@ -77,9 +77,13 @@ func TestServerRouteServerAccessor(t *testing.T) { } func TestGitalyServerInfo(t *testing.T) { + gitVersion, err := git.Version() + require.NoError(t, err) + conf := config.Config{ VirtualStorages: []*config.VirtualStorage{ &config.VirtualStorage{ + Name: "virtual-storage-1", Nodes: []*models.Node{ &models.Node{ Storage: "praefect-internal-1", @@ -95,41 +99,45 @@ func TestGitalyServerInfo(t *testing.T) { }, } - cc, _, cleanup := runPraefectServerWithGitaly(t, conf) - defer cleanup() - - client := gitalypb.NewServerServiceClient(cc) - ctx, cancel := testhelper.Context() defer cancel() - metadata, err := client.ServerInfo(ctx, &gitalypb.ServerInfoRequest{}) - require.NoError(t, err) - require.Len(t, metadata.GetStorageStatuses(), len(conf.VirtualStorages)) - require.Equal(t, conf.VirtualStorages[0].Name, metadata.GetStorageStatuses()[0].StorageName) - require.Equal(t, version.GetVersion(), metadata.GetServerVersion()) + t.Run("gitaly responds with ok", func(t *testing.T) { + cc, _, cleanup := runPraefectServerWithGitaly(t, conf) + defer cleanup() - gitVersion, err := git.Version() - require.NoError(t, err) - require.Equal(t, gitVersion, metadata.GetGitVersion()) + expected := &gitalypb.ServerInfoResponse{ + ServerVersion: version.GetVersion(), + GitVersion: gitVersion, + StorageStatuses: []*gitalypb.ServerInfoResponse_StorageStatus{ + {StorageName: "virtual-storage-1", Readable: true, Writeable: true, ReplicationFactor: 2}, + }, + } - // use mock gitaly backends. The ServerInfo call to Gitaly will fail with an error. - for _, storageStatus := range metadata.GetStorageStatuses() { - require.NotNil(t, storageStatus, "none of the storage statuses should be nil") - } + client := gitalypb.NewServerServiceClient(cc) + actual, err := client.ServerInfo(ctx, &gitalypb.ServerInfoRequest{}) + require.NoError(t, err) + for _, ss := range actual.StorageStatuses { + ss.FsType = "" + ss.FilesystemId = "" + } + require.True(t, proto.Equal(expected, actual), "expected: %v, got: %v", expected, actual) + }) - backends := map[string]mock.SimpleServiceServer{ - conf.VirtualStorages[0].Nodes[0].Storage: &mockSvc{}, - conf.VirtualStorages[0].Nodes[1].Storage: &mockSvc{}, - } + t.Run("gitaly responds with error", func(t *testing.T) { + backends := map[string]mock.SimpleServiceServer{ + conf.VirtualStorages[0].Nodes[0].Storage: &mockSvc{}, + conf.VirtualStorages[0].Nodes[1].Storage: &mockSvc{}, + } - cc, _, cleanup = runPraefectServerWithMock(t, conf, datastore.Datastore{}, backends) - defer cleanup() + cc, _, cleanup := runPraefectServerWithMock(t, conf, datastore.Datastore{}, backends) + defer cleanup() - client = gitalypb.NewServerServiceClient(cc) - metadata, err = client.ServerInfo(ctx, &gitalypb.ServerInfoRequest{}) - require.NoError(t, err, "we expect praefect's server info to fail open even if the gitaly calls result in an error") - require.Empty(t, metadata.StorageStatuses) + client := gitalypb.NewServerServiceClient(cc) + actual, err := client.ServerInfo(ctx, &gitalypb.ServerInfoRequest{}) + require.NoError(t, err, "we expect praefect's server info to fail open even if the gitaly calls result in an error") + require.Empty(t, actual.StorageStatuses, "got: %v", actual) + }) } func TestGitalyServerInfoBadNode(t *testing.T) { diff --git a/internal/praefect/service/server/info.go b/internal/praefect/service/server/info.go index 9c084cc33..d72c14a25 100644 --- a/internal/praefect/service/server/info.go +++ b/internal/praefect/service/server/info.go @@ -29,6 +29,7 @@ func (s *Server) ServerInfo(ctx context.Context, in *gitalypb.ServerInfoRequest) wg.Add(1) i := i virtualStorage := virtualStorage + replicas := uint32(1 + len(shard.Secondaries)) // 1 - is primary + N secondaries go func() { defer wg.Done() @@ -50,7 +51,7 @@ func (s *Server) ServerInfo(ctx context.Context, in *gitalypb.ServerInfoRequest) // name = "internal-gitaly-0" // path = "/var/opt/gitlab/git-data" // - // [storage]] + // [[storage]] // name = "internal-gitaly-1" // path = "/var/opt/gitlab/git-data" // @@ -69,6 +70,7 @@ func (s *Server) ServerInfo(ctx context.Context, in *gitalypb.ServerInfoRequest) // to the virtual storage's storage status. storageStatuses[i].StorageName = virtualStorage.Name storageStatuses[i].Writeable = !shard.IsReadOnly && storageStatus.Writeable + storageStatuses[i].ReplicationFactor = replicas break } } diff --git a/internal/service/server/info.go b/internal/service/server/info.go index 9218be54e..86cef6b6b 100644 --- a/internal/service/server/info.go +++ b/internal/service/server/info.go @@ -32,11 +32,12 @@ func (s *server) ServerInfo(ctx context.Context, in *gitalypb.ServerInfoRequest) } storageStatuses = append(storageStatuses, &gitalypb.ServerInfoResponse_StorageStatus{ - StorageName: shard.Name, - Readable: readable, - Writeable: writeable, - FsType: fsType, - FilesystemId: gitalyMetadata.GitalyFilesystemID, + StorageName: shard.Name, + ReplicationFactor: 1, // gitaly is always treated as a single replica + Readable: readable, + Writeable: writeable, + FsType: fsType, + FilesystemId: gitalyMetadata.GitalyFilesystemID, }) } diff --git a/internal/service/server/info_test.go b/internal/service/server/info_test.go index 817bd0967..a2c1153a9 100644 --- a/internal/service/server/info_test.go +++ b/internal/service/server/info_test.go @@ -63,10 +63,12 @@ func TestGitalyServerInfo(t *testing.T) { require.True(t, c.GetStorageStatuses()[0].Readable) require.True(t, c.GetStorageStatuses()[0].Writeable) require.NotEmpty(t, c.GetStorageStatuses()[0].FsType) + require.Equal(t, uint32(1), c.GetStorageStatuses()[0].ReplicationFactor) require.False(t, c.GetStorageStatuses()[1].Readable) require.False(t, c.GetStorageStatuses()[1].Writeable) require.Equal(t, metadata.GitalyFilesystemID, c.GetStorageStatuses()[0].FilesystemId) + require.Equal(t, uint32(1), c.GetStorageStatuses()[1].ReplicationFactor) } func runServer(t *testing.T, storages []config.Storage) (*grpc.Server, string) { diff --git a/proto/go/gitalypb/server.pb.go b/proto/go/gitalypb/server.pb.go index c46834dda..1c5f6ec5a 100644 --- a/proto/go/gitalypb/server.pb.go +++ b/proto/go/gitalypb/server.pb.go @@ -116,6 +116,7 @@ type ServerInfoResponse_StorageStatus struct { Writeable bool `protobuf:"varint,3,opt,name=writeable,proto3" json:"writeable,omitempty"` FsType string `protobuf:"bytes,4,opt,name=fs_type,json=fsType,proto3" json:"fs_type,omitempty"` FilesystemId string `protobuf:"bytes,5,opt,name=filesystem_id,json=filesystemId,proto3" json:"filesystem_id,omitempty"` + ReplicationFactor uint32 `protobuf:"varint,6,opt,name=replication_factor,json=replicationFactor,proto3" json:"replication_factor,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -181,6 +182,13 @@ func (m *ServerInfoResponse_StorageStatus) GetFilesystemId() string { return "" } +func (m *ServerInfoResponse_StorageStatus) GetReplicationFactor() uint32 { + if m != nil { + return m.ReplicationFactor + } + return 0 +} + type DiskStatisticsRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -320,35 +328,36 @@ func init() { func init() { proto.RegisterFile("server.proto", fileDescriptor_ad098daeda4239f7) } var fileDescriptor_ad098daeda4239f7 = []byte{ - // 434 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0xc1, 0x8e, 0xd3, 0x30, - 0x10, 0x86, 0x95, 0xa6, 0x94, 0x76, 0xda, 0x2e, 0x8b, 0x11, 0x6c, 0x89, 0x16, 0x58, 0x8a, 0x90, - 0x7a, 0x80, 0x14, 0x2d, 0x6f, 0x80, 0xb8, 0xec, 0x01, 0x0e, 0x29, 0x02, 0xc1, 0x25, 0x72, 0x9a, - 0x49, 0x64, 0x91, 0xc4, 0xc1, 0xe3, 0x16, 0xe5, 0x49, 0x78, 0x07, 0xde, 0x80, 0x27, 0xe1, 0xc6, - 0x83, 0x70, 0x42, 0xb1, 0x93, 0x66, 0x17, 0x5a, 0x90, 0xb8, 0x44, 0x9e, 0x7f, 0xfe, 0x19, 0x4f, - 0xbe, 0x49, 0x60, 0x42, 0xa8, 0xb6, 0xa8, 0xfc, 0x52, 0x49, 0x2d, 0xd9, 0x20, 0x15, 0x9a, 0x67, - 0x95, 0x07, 0x99, 0x28, 0xb4, 0xd5, 0xe6, 0xb7, 0xe0, 0xe6, 0xca, 0x78, 0x2e, 0x8a, 0x44, 0x06, - 0xf8, 0x69, 0x83, 0xa4, 0xe7, 0x3f, 0x7a, 0xc0, 0x2e, 0xab, 0x54, 0xca, 0x82, 0x90, 0x3d, 0x86, - 0x23, 0xdb, 0x2f, 0xdc, 0xa2, 0x22, 0x21, 0x8b, 0x99, 0x73, 0xe6, 0x2c, 0x46, 0xc1, 0xd4, 0xaa, - 0x6f, 0xad, 0xc8, 0x1e, 0xc0, 0x38, 0x15, 0x7a, 0xe7, 0xe9, 0x19, 0x0f, 0xa4, 0x42, 0xb7, 0x86, - 0x15, 0x1c, 0x93, 0x96, 0x8a, 0xa7, 0x18, 0x92, 0xe6, 0x7a, 0x43, 0x48, 0x33, 0xf7, 0xcc, 0x5d, - 0x8c, 0xcf, 0x17, 0xbe, 0x1d, 0xd1, 0xff, 0xf3, 0x76, 0x7f, 0x65, 0x4b, 0x56, 0xa6, 0x22, 0xb8, - 0x41, 0x97, 0x43, 0x24, 0xef, 0xab, 0x03, 0xd3, 0x2b, 0x16, 0xf6, 0x10, 0x26, 0xed, 0x35, 0x05, - 0xcf, 0xb1, 0x19, 0x76, 0xdc, 0x68, 0xaf, 0x79, 0x8e, 0xcc, 0x83, 0xa1, 0x42, 0x1e, 0xf3, 0x28, - 0x43, 0x33, 0xe7, 0x30, 0xd8, 0xc5, 0xec, 0x14, 0x46, 0x9f, 0x95, 0xd0, 0x68, 0x92, 0xae, 0x49, - 0x76, 0x02, 0x3b, 0x81, 0xeb, 0x09, 0x85, 0xba, 0x2a, 0x71, 0xd6, 0x37, 0x7d, 0x07, 0x09, 0xbd, - 0xa9, 0x4a, 0x64, 0x8f, 0x60, 0x9a, 0x88, 0x0c, 0xa9, 0x22, 0x8d, 0x79, 0x28, 0xe2, 0xd9, 0x35, - 0x93, 0x9e, 0x74, 0xe2, 0x45, 0x3c, 0x3f, 0x81, 0xdb, 0x2f, 0x05, 0x7d, 0xac, 0x07, 0x15, 0xa4, - 0xc5, 0x9a, 0x5a, 0xf2, 0xdf, 0x1d, 0xb8, 0xf3, 0x7b, 0xa6, 0xa1, 0xff, 0x6e, 0x0f, 0x35, 0xc7, - 0x50, 0x7b, 0xd2, 0x52, 0xdb, 0x5f, 0xf9, 0x2f, 0x72, 0xf1, 0x7f, 0x80, 0x3b, 0x85, 0x11, 0xdf, - 0x72, 0x91, 0xed, 0xc8, 0xb9, 0x41, 0x27, 0x30, 0x06, 0xfd, 0x0d, 0x61, 0x6c, 0xa8, 0xb9, 0x81, - 0x39, 0x9f, 0x7f, 0xab, 0xf7, 0x63, 0xb6, 0x5a, 0x3f, 0xc5, 0x1a, 0xd9, 0x2b, 0x80, 0x6e, 0xcd, - 0xec, 0xee, 0xbe, 0xd5, 0x1b, 0x28, 0x9e, 0x77, 0xf8, 0xab, 0x98, 0x0f, 0x7f, 0x7e, 0x59, 0xf4, - 0x87, 0xbd, 0x63, 0x87, 0xbd, 0x87, 0xa3, 0xab, 0xef, 0xcf, 0xee, 0x1d, 0xe2, 0x62, 0xdb, 0xde, - 0xff, 0x3b, 0xb6, 0xae, 0xf5, 0x8b, 0x67, 0x1f, 0x6a, 0x6b, 0xc6, 0x23, 0x7f, 0x2d, 0xf3, 0xa5, - 0x3d, 0x3e, 0x95, 0x2a, 0x5d, 0xda, 0x06, 0x4b, 0xf3, 0x2b, 0x2d, 0x53, 0xd9, 0xc4, 0x65, 0x14, - 0x0d, 0x8c, 0xf4, 0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xfc, 0xd2, 0x7e, 0x81, 0x03, - 0x00, 0x00, + // 460 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0x95, 0xeb, 0x10, 0x92, 0x49, 0x52, 0xda, 0x41, 0x50, 0x63, 0x15, 0x08, 0x41, 0x48, 0x3e, + 0x50, 0x07, 0x95, 0x3f, 0x40, 0x08, 0xa9, 0x07, 0x38, 0x38, 0x08, 0x04, 0x17, 0x6b, 0x63, 0x8f, + 0xad, 0x15, 0x8e, 0xd7, 0xec, 0x6c, 0x82, 0xf2, 0x11, 0x9c, 0xf9, 0x16, 0xbe, 0x04, 0xf1, 0x2b, + 0x9c, 0x50, 0xd6, 0x49, 0x9c, 0x42, 0x0a, 0x52, 0x2f, 0xd6, 0xce, 0x7b, 0x6f, 0x66, 0x67, 0xdf, + 0x8c, 0xa1, 0xcf, 0xa4, 0x17, 0xa4, 0xc3, 0x4a, 0x2b, 0xa3, 0xb0, 0x9d, 0x4b, 0x23, 0x8a, 0xa5, + 0x0f, 0x85, 0x2c, 0x4d, 0x8d, 0x8d, 0x6e, 0xc3, 0xf1, 0xc4, 0x6a, 0x2e, 0xca, 0x4c, 0x45, 0xf4, + 0x79, 0x4e, 0x6c, 0x46, 0x5f, 0x5d, 0xc0, 0x5d, 0x94, 0x2b, 0x55, 0x32, 0xe1, 0x13, 0x38, 0xac, + 0xeb, 0xc5, 0x0b, 0xd2, 0x2c, 0x55, 0xe9, 0x39, 0x43, 0x27, 0xe8, 0x46, 0x83, 0x1a, 0x7d, 0x57, + 0x83, 0xf8, 0x10, 0x7a, 0xb9, 0x34, 0x5b, 0xcd, 0x81, 0xd5, 0x40, 0x2e, 0xcd, 0x46, 0x30, 0x81, + 0x23, 0x36, 0x4a, 0x8b, 0x9c, 0x62, 0x36, 0xc2, 0xcc, 0x99, 0xd8, 0x73, 0x87, 0x6e, 0xd0, 0x3b, + 0x0f, 0xc2, 0xba, 0xc5, 0xf0, 0xef, 0xdb, 0xc3, 0x49, 0x9d, 0x32, 0xb1, 0x19, 0xd1, 0x2d, 0xde, + 0x0d, 0x89, 0xfd, 0x9f, 0x0e, 0x0c, 0x2e, 0x49, 0xf0, 0x11, 0xf4, 0x37, 0xd7, 0x94, 0x62, 0x46, + 0xeb, 0x66, 0x7b, 0x6b, 0xec, 0x8d, 0x98, 0x11, 0xfa, 0xd0, 0xd1, 0x24, 0x52, 0x31, 0x2d, 0xc8, + 0xf6, 0xd9, 0x89, 0xb6, 0x31, 0x9e, 0x42, 0xf7, 0x8b, 0x96, 0x86, 0x2c, 0xe9, 0x5a, 0xb2, 0x01, + 0xf0, 0x04, 0x6e, 0x66, 0x1c, 0x9b, 0x65, 0x45, 0x5e, 0xcb, 0xd6, 0x6d, 0x67, 0xfc, 0x76, 0x59, + 0x11, 0x3e, 0x86, 0x41, 0x26, 0x0b, 0xe2, 0x25, 0x1b, 0x9a, 0xc5, 0x32, 0xf5, 0x6e, 0x58, 0xba, + 0xdf, 0x80, 0x17, 0x29, 0x9e, 0x01, 0x6a, 0xaa, 0x0a, 0x99, 0x08, 0x23, 0x55, 0x19, 0x67, 0x22, + 0x31, 0x4a, 0x7b, 0xed, 0xa1, 0x13, 0x0c, 0xa2, 0xe3, 0x1d, 0xe6, 0x95, 0x25, 0x46, 0x27, 0x70, + 0xe7, 0xa5, 0xe4, 0x4f, 0xab, 0x77, 0x49, 0x36, 0x32, 0xe1, 0xcd, 0xa0, 0x7e, 0x38, 0x70, 0xf7, + 0x4f, 0x66, 0x3d, 0xac, 0xf7, 0x7b, 0x4c, 0x76, 0xac, 0xc9, 0x4f, 0x37, 0x26, 0xef, 0xcf, 0xfc, + 0x9f, 0xd1, 0xe9, 0x35, 0x7c, 0x3e, 0x85, 0xae, 0x58, 0x08, 0x59, 0x6c, 0x8d, 0x76, 0xa3, 0x06, + 0x40, 0x84, 0xd6, 0x9c, 0x29, 0xb5, 0x26, 0xbb, 0x91, 0x3d, 0x9f, 0x7f, 0x5f, 0x8d, 0xd3, 0x2e, + 0xc1, 0xea, 0x2b, 0x13, 0xc2, 0xd7, 0x00, 0xcd, 0x56, 0xe0, 0xbd, 0x7d, 0x9b, 0x62, 0x4d, 0xf1, + 0xfd, 0xab, 0x97, 0x68, 0xd4, 0xf9, 0xf5, 0x2d, 0x68, 0x75, 0x0e, 0x8e, 0x1c, 0xfc, 0x00, 0x87, + 0x97, 0xdf, 0x8f, 0xf7, 0xaf, 0xf2, 0xa5, 0x2e, 0xfb, 0xe0, 0xdf, 0xb6, 0x35, 0xa5, 0x5f, 0x3c, + 0xfb, 0xb8, 0x92, 0x16, 0x62, 0x1a, 0x26, 0x6a, 0x36, 0xae, 0x8f, 0x67, 0x4a, 0xe7, 0xe3, 0xba, + 0xc0, 0xd8, 0xfe, 0x79, 0xe3, 0x5c, 0xad, 0xe3, 0x6a, 0x3a, 0x6d, 0x5b, 0xe8, 0xf9, 0xef, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x7c, 0x52, 0xb9, 0x17, 0xb0, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/server.proto b/proto/server.proto index 07941752e..29fbc55ff 100644 --- a/proto/server.proto +++ b/proto/server.proto @@ -30,6 +30,7 @@ message ServerInfoResponse { bool writeable = 3; string fs_type = 4; string filesystem_id = 5; + uint32 replication_factor = 6; } string server_version = 1; diff --git a/ruby/proto/gitaly/server_pb.rb b/ruby/proto/gitaly/server_pb.rb index d4662040c..ed4237e2b 100644 --- a/ruby/proto/gitaly/server_pb.rb +++ b/ruby/proto/gitaly/server_pb.rb @@ -18,6 +18,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :writeable, :bool, 3 optional :fs_type, :string, 4 optional :filesystem_id, :string, 5 + optional :replication_factor, :uint32, 6 end add_message "gitaly.DiskStatisticsRequest" do end |