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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package praefect
import (
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/internal/praefect/config"
"gitlab.com/gitlab-org/gitaly/internal/praefect/models"
)
// TestMemoryDatastoreWhitelist verifies that the in-memory datastore will
// populate itself with the correct replication jobs and repositories when initialized
// with a configuration file specifying the shard and whitelisted repositories.
func TestMemoryDatastoreWhitelist(t *testing.T) {
repo1 := models.Repository{
RelativePath: "abcd1234",
}
repo2 := models.Repository{
RelativePath: "5678efgh",
}
mds := NewMemoryDatastore(config.Config{
StorageNodes: []*models.StorageNode{
&models.StorageNode{
ID: 0,
Address: "tcp://default",
Storage: "praefect-internal-1",
},
&models.StorageNode{
ID: 1,
Address: "tcp://backup-2",
Storage: "praefect-internal-2",
}, &models.StorageNode{
ID: 2,
Address: "tcp://backup-2",
Storage: "praefect-internal-3",
}},
Whitelist: []string{repo1.RelativePath, repo2.RelativePath},
})
expectReplicas := []models.StorageNode{
mds.storageNodes.m[1],
mds.storageNodes.m[2],
}
for _, repo := range []models.Repository{repo1, repo2} {
actualReplicas, err := mds.GetReplicas(repo.RelativePath)
require.NoError(t, err)
require.ElementsMatch(t, expectReplicas, actualReplicas)
}
backup1 := mds.storageNodes.m[1]
backup2 := mds.storageNodes.m[2]
backup1ExpectedJobs := []ReplJob{
ReplJob{
ID: 1,
TargetNodeID: backup1.ID,
Source: models.Repository{RelativePath: repo1.RelativePath},
SourceStorage: "praefect-internal-1",
State: JobStateReady,
},
ReplJob{
ID: 3,
TargetNodeID: backup1.ID,
Source: models.Repository{RelativePath: repo2.RelativePath},
SourceStorage: "praefect-internal-1",
State: JobStateReady,
},
}
backup2ExpectedJobs := []ReplJob{
ReplJob{
ID: 2,
TargetNodeID: backup2.ID,
Source: models.Repository{RelativePath: repo1.RelativePath},
SourceStorage: "praefect-internal-1",
State: JobStateReady,
},
ReplJob{
ID: 4,
TargetNodeID: backup2.ID,
Source: models.Repository{RelativePath: repo2.RelativePath},
SourceStorage: "praefect-internal-1",
State: JobStateReady,
},
}
backup1ActualJobs, err := mds.GetJobs(JobStatePending|JobStateReady, backup1.ID, 10)
require.NoError(t, err)
require.Equal(t, backup1ExpectedJobs, backup1ActualJobs)
backup2ActualJobs, err := mds.GetJobs(JobStatePending|JobStateReady, backup2.ID, 10)
require.NoError(t, err)
require.Equal(t, backup2ActualJobs, backup2ExpectedJobs)
}
|