19414: Fix concurrent map read/write.
[arvados.git] / services / keep-balance / block_state_test.go
index 8a58be288ff1832a3799224510d04d5d581d2455..c6076bbd3d526c144849cd8890832e08c7df3b65 100644 (file)
@@ -5,6 +5,7 @@
 package keepbalance
 
 import (
+       "sync"
        "time"
 
        "git.arvados.org/arvados.git/sdk/go/arvados"
@@ -92,3 +93,25 @@ func (s *confirmedReplicationSuite) TestBlocksOnMultipleMounts(c *check.C) {
        n = s.blockStateMap.GetConfirmedReplication([]arvados.SizedDigest{knownBlkid(40), knownBlkid(41)}, nil)
        c.Check(n, check.Equals, 4)
 }
+
+func (s *confirmedReplicationSuite) TestConcurrency(c *check.C) {
+       var wg sync.WaitGroup
+       for i := 1000; i < 1256; i++ {
+               i := i
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       n := s.blockStateMap.GetConfirmedReplication([]arvados.SizedDigest{knownBlkid(i), knownBlkid(i)}, []string{"default"})
+                       c.Check(n, check.Equals, 0)
+               }()
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       n := s.blockStateMap.GetConfirmedReplication([]arvados.SizedDigest{knownBlkid(10)}, []string{"default"})
+                       c.Check(n, check.Equals, 1)
+                       n = s.blockStateMap.GetConfirmedReplication([]arvados.SizedDigest{knownBlkid(20)}, []string{"default"})
+                       c.Check(n, check.Equals, 2)
+               }()
+       }
+       wg.Wait()
+}