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
66
|
package server
import (
"context"
"io/ioutil"
"os"
"path/filepath"
"github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
"gitlab.com/gitlab-org/gitaly/internal/git"
"gitlab.com/gitlab-org/gitaly/internal/helper"
"gitlab.com/gitlab-org/gitaly/internal/helper/fstype"
"gitlab.com/gitlab-org/gitaly/internal/storage"
"gitlab.com/gitlab-org/gitaly/internal/version"
"gitlab.com/gitlab-org/gitaly/proto/go/gitalypb"
)
func (s *server) ServerInfo(ctx context.Context, in *gitalypb.ServerInfoRequest) (*gitalypb.ServerInfoResponse, error) {
gitVersion, err := git.CurrentVersion(ctx, s.gitCmdFactory)
if err != nil {
return nil, helper.ErrInternal(err)
}
var storageStatuses []*gitalypb.ServerInfoResponse_StorageStatus
for _, shard := range s.storages {
readable, writeable := shardCheck(shard.Path)
fsType := fstype.FileSystem(shard.Path)
gitalyMetadata, err := storage.ReadMetadataFile(shard.Path)
if err != nil {
ctxlogrus.Extract(ctx).WithField("storage", shard).WithError(err).Error("reading gitaly metadata file")
}
storageStatuses = append(storageStatuses, &gitalypb.ServerInfoResponse_StorageStatus{
StorageName: shard.Name,
ReplicationFactor: 1, // gitaly is always treated as a single replica
Readable: readable,
Writeable: writeable,
FsType: fsType,
FilesystemId: gitalyMetadata.GitalyFilesystemID,
})
}
return &gitalypb.ServerInfoResponse{
ServerVersion: version.GetVersion(),
GitVersion: gitVersion.String(),
StorageStatuses: storageStatuses,
}, nil
}
func shardCheck(shardPath string) (readable bool, writeable bool) {
if _, err := os.Stat(shardPath); err == nil {
readable = true
}
// the path uses a `+` to avoid naming collisions
testPath := filepath.Join(shardPath, "+testWrite")
content := []byte("testWrite")
if err := ioutil.WriteFile(testPath, content, 0644); err == nil {
writeable = true
}
os.Remove(testPath)
return
}
|