4 "git.curoverse.com/arvados.git/sdk/go/blockdigest"
5 "git.curoverse.com/arvados.git/services/datamanager/collection"
6 "git.curoverse.com/arvados.git/services/datamanager/keep"
12 func BlockSetFromSlice(digests []int) (bs BlockSet) {
14 for _, digest := range digests {
15 bs.Insert(blockdigest.MakeTestBlockDigest(digest))
20 func CollectionIndexSetFromSlice(indices []int) (cis CollectionIndexSet) {
21 cis = make(CollectionIndexSet)
22 for _, index := range indices {
28 func (cis CollectionIndexSet) ToSlice() (ints []int) {
29 ints = make([]int, len(cis))
31 for collectionIndex := range cis {
32 ints[i] = collectionIndex
39 // Takes a map from block digest to replication level and represents
40 // it in a keep.ReadServers structure.
41 func SpecifyReplication(digestToReplication map[int]int) (rs keep.ReadServers) {
42 rs.BlockToServers = make(map[blockdigest.BlockDigest][]keep.BlockServerInfo)
43 for digest, replication := range digestToReplication {
44 rs.BlockToServers[blockdigest.MakeTestBlockDigest(digest)] =
45 make([]keep.BlockServerInfo, replication)
51 // blocks.ToCollectionIndexSet(rc.BlockToCollectionIndices) returns
52 // expectedCollections.
53 func VerifyToCollectionIndexSet(
56 blockToCollectionIndices map[int][]int,
57 expectedCollections []int) {
59 expected := CollectionIndexSetFromSlice(expectedCollections)
61 rc := collection.ReadCollections{
62 BlockToCollectionIndices: map[blockdigest.BlockDigest][]int{},
64 for digest, indices := range blockToCollectionIndices {
65 rc.BlockToCollectionIndices[blockdigest.MakeTestBlockDigest(digest)] = indices
68 returned := make(CollectionIndexSet)
69 BlockSetFromSlice(blocks).ToCollectionIndexSet(rc, &returned)
71 if !reflect.DeepEqual(returned, expected) {
72 t.Errorf("Expected %v.ToCollectionIndexSet(%v) to return \n %v \n but instead received \n %v",
74 blockToCollectionIndices,
80 func TestToCollectionIndexSet(t *testing.T) {
81 VerifyToCollectionIndexSet(t, []int{6}, map[int][]int{6: []int{0}}, []int{0})
82 VerifyToCollectionIndexSet(t, []int{4}, map[int][]int{4: []int{1}}, []int{1})
83 VerifyToCollectionIndexSet(t, []int{4}, map[int][]int{4: []int{1, 9}}, []int{1, 9})
84 VerifyToCollectionIndexSet(t, []int{5, 6},
85 map[int][]int{5: []int{2, 3}, 6: []int{3, 4}},
87 VerifyToCollectionIndexSet(t, []int{5, 6},
88 map[int][]int{5: []int{8}, 6: []int{4}},
90 VerifyToCollectionIndexSet(t, []int{6}, map[int][]int{5: []int{0}}, []int{})
93 func TestSimpleSummary(t *testing.T) {
94 rc := collection.MakeTestReadCollections([]collection.TestCollectionSpec{
95 collection.TestCollectionSpec{ReplicationLevel: 1, Blocks: []int{1, 2}},
98 cIndex := rc.CollectionIndicesForTesting()
100 keepInfo := SpecifyReplication(map[int]int{1: 1, 2: 1})
102 expectedSummary := ReplicationSummary{
103 CollectionBlocksNotInKeep: BlockSet{},
104 UnderReplicatedBlocks: BlockSet{},
105 OverReplicatedBlocks: BlockSet{},
106 CorrectlyReplicatedBlocks: BlockSetFromSlice([]int{1, 2}),
107 KeepBlocksNotInCollections: BlockSet{},
109 CollectionsNotFullyInKeep: CollectionIndexSet{},
110 UnderReplicatedCollections: CollectionIndexSet{},
111 OverReplicatedCollections: CollectionIndexSet{},
112 CorrectlyReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[0]}),
115 returnedSummary := SummarizeReplication(rc, keepInfo)
117 if !reflect.DeepEqual(returnedSummary, expectedSummary) {
118 t.Fatalf("Expected returnedSummary to look like %+v but instead it is %+v", expectedSummary, returnedSummary)
122 func TestMissingBlock(t *testing.T) {
123 rc := collection.MakeTestReadCollections([]collection.TestCollectionSpec{
124 collection.TestCollectionSpec{ReplicationLevel: 1, Blocks: []int{1, 2}},
127 cIndex := rc.CollectionIndicesForTesting()
129 keepInfo := SpecifyReplication(map[int]int{1: 1})
131 expectedSummary := ReplicationSummary{
132 CollectionBlocksNotInKeep: BlockSetFromSlice([]int{2}),
133 UnderReplicatedBlocks: BlockSet{},
134 OverReplicatedBlocks: BlockSet{},
135 CorrectlyReplicatedBlocks: BlockSetFromSlice([]int{1}),
136 KeepBlocksNotInCollections: BlockSet{},
138 CollectionsNotFullyInKeep: CollectionIndexSetFromSlice([]int{cIndex[0]}),
139 UnderReplicatedCollections: CollectionIndexSet{},
140 OverReplicatedCollections: CollectionIndexSet{},
141 CorrectlyReplicatedCollections: CollectionIndexSet{},
144 returnedSummary := SummarizeReplication(rc, keepInfo)
146 if !reflect.DeepEqual(returnedSummary, expectedSummary) {
147 t.Fatalf("Expected returnedSummary to look like %+v but instead it is %+v",
153 func TestUnderAndOverReplicatedBlocks(t *testing.T) {
154 rc := collection.MakeTestReadCollections([]collection.TestCollectionSpec{
155 collection.TestCollectionSpec{ReplicationLevel: 2, Blocks: []int{1, 2}},
158 cIndex := rc.CollectionIndicesForTesting()
160 keepInfo := SpecifyReplication(map[int]int{1: 1, 2: 3})
162 expectedSummary := ReplicationSummary{
163 CollectionBlocksNotInKeep: BlockSet{},
164 UnderReplicatedBlocks: BlockSetFromSlice([]int{1}),
165 OverReplicatedBlocks: BlockSetFromSlice([]int{2}),
166 CorrectlyReplicatedBlocks: BlockSet{},
167 KeepBlocksNotInCollections: BlockSet{},
169 CollectionsNotFullyInKeep: CollectionIndexSet{},
170 UnderReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[0]}),
171 OverReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[0]}),
172 CorrectlyReplicatedCollections: CollectionIndexSet{},
175 returnedSummary := SummarizeReplication(rc, keepInfo)
177 if !reflect.DeepEqual(returnedSummary, expectedSummary) {
178 t.Fatalf("Expected returnedSummary to look like %+v but instead it is %+v",
184 func TestMixedReplication(t *testing.T) {
185 rc := collection.MakeTestReadCollections([]collection.TestCollectionSpec{
186 collection.TestCollectionSpec{ReplicationLevel: 1, Blocks: []int{1, 2}},
187 collection.TestCollectionSpec{ReplicationLevel: 1, Blocks: []int{3, 4}},
188 collection.TestCollectionSpec{ReplicationLevel: 2, Blocks: []int{5, 6}},
191 cIndex := rc.CollectionIndicesForTesting()
193 keepInfo := SpecifyReplication(map[int]int{1: 1, 2: 1, 3: 1, 5: 1, 6: 3, 7: 2})
195 expectedSummary := ReplicationSummary{
196 CollectionBlocksNotInKeep: BlockSetFromSlice([]int{4}),
197 UnderReplicatedBlocks: BlockSetFromSlice([]int{5}),
198 OverReplicatedBlocks: BlockSetFromSlice([]int{6}),
199 CorrectlyReplicatedBlocks: BlockSetFromSlice([]int{1, 2, 3}),
200 KeepBlocksNotInCollections: BlockSetFromSlice([]int{7}),
202 CollectionsNotFullyInKeep: CollectionIndexSetFromSlice([]int{cIndex[1]}),
203 UnderReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[2]}),
204 OverReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[2]}),
205 CorrectlyReplicatedCollections: CollectionIndexSetFromSlice([]int{cIndex[0]}),
208 returnedSummary := SummarizeReplication(rc, keepInfo)
210 if !reflect.DeepEqual(returnedSummary, expectedSummary) {
211 t.Fatalf("Expected returnedSummary to look like: \n%+v but instead it is: \n%+v. Index to UUID is %v. BlockToCollectionIndices is %v.", expectedSummary, returnedSummary, rc.CollectionIndexToUuid, rc.BlockToCollectionIndices)