(t *testing.T)
| 70 | } |
| 71 | |
| 72 | func TestDMap_Fragment_Concurrent_Access(t *testing.T) { |
| 73 | cluster := testcluster.New(NewService) |
| 74 | s := cluster.AddMember(nil).(*Service) |
| 75 | dm, err := s.NewDMap("mydmap") |
| 76 | if err != nil { |
| 77 | t.Fatalf("Expected nil. Got: %v", err) |
| 78 | } |
| 79 | |
| 80 | part := dm.getPartitionByHKey(123, partitions.PRIMARY) |
| 81 | |
| 82 | var mtx sync.RWMutex |
| 83 | var wg sync.WaitGroup |
| 84 | for i := 0; i < 1000; i++ { |
| 85 | wg.Add(1) |
| 86 | go func(idx int) { |
| 87 | defer wg.Done() |
| 88 | |
| 89 | f, err := dm.loadOrCreateFragment(part) |
| 90 | if err != nil { |
| 91 | t.Errorf("Expected nil. Got: %v", err) |
| 92 | } |
| 93 | |
| 94 | e := f.storage.NewEntry() |
| 95 | e.SetKey(testutil.ToKey(idx)) |
| 96 | |
| 97 | mtx.Lock() |
| 98 | // storage engine is not thread-safe |
| 99 | err = f.storage.Put(uint64(idx), e) |
| 100 | mtx.Unlock() |
| 101 | |
| 102 | if err != nil { |
| 103 | t.Errorf("Expected nil. Got: %v", err) |
| 104 | } |
| 105 | }(i) |
| 106 | } |
| 107 | |
| 108 | wg.Wait() |
| 109 | |
| 110 | f, err := dm.loadFragment(part) |
| 111 | if err != nil { |
| 112 | t.Errorf("Expected nil. Got: %v", err) |
| 113 | } |
| 114 | for i := 0; i < 1000; i++ { |
| 115 | entry, err := f.storage.Get(uint64(i)) |
| 116 | if err != nil { |
| 117 | t.Fatalf("Expected nil. Got: %v", err) |
| 118 | } |
| 119 | if entry.Key() != testutil.ToKey(i) { |
| 120 | t.Fatalf("Expected key: %s. Got: %s", testutil.ToKey(i), entry.Key()) |
| 121 | } |
| 122 | } |
| 123 | } |
nothing calls this directly
no test coverage detected