@@ -283,6 +283,57 @@ func TestFreezerReadonlyValidate(t *testing.T) {
283283 }
284284}
285285
286+ func TestFreezerConcurrentReadonly (t * testing.T ) {
287+ t .Parallel ()
288+
289+ tables := map [string ]bool {"a" : true }
290+ dir := t .TempDir ()
291+
292+ f , err := NewFreezer (dir , "" , false , 2049 , tables )
293+ if err != nil {
294+ t .Fatal ("can't open freezer" , err )
295+ }
296+ var item = make ([]byte , 1024 )
297+ batch := f .tables ["a" ].newBatch ()
298+ items := uint64 (10 )
299+ for i := uint64 (0 ); i < items ; i ++ {
300+ require .NoError (t , batch .AppendRaw (i , item ))
301+ }
302+ require .NoError (t , batch .commit ())
303+ if loaded := f .tables ["a" ].items .Load (); loaded != items {
304+ t .Fatalf ("unexpected number of items in table, want: %d, have: %d" , items , loaded )
305+ }
306+ require .NoError (t , f .Close ())
307+
308+ var (
309+ wg sync.WaitGroup
310+ fs = make ([]* Freezer , 5 )
311+ errs = make ([]error , 5 )
312+ )
313+ for i := 0 ; i < 5 ; i ++ {
314+ wg .Add (1 )
315+ go func (i int ) {
316+ defer wg .Done ()
317+
318+ f , err := NewFreezer (dir , "" , true , 2049 , tables )
319+ if err == nil {
320+ fs [i ] = f
321+ } else {
322+ errs [i ] = err
323+ }
324+ }(i )
325+ }
326+
327+ wg .Wait ()
328+
329+ for i := range fs {
330+ if err := errs [i ]; err != nil {
331+ t .Fatal ("failed to open freezer" , err )
332+ }
333+ require .NoError (t , fs [i ].Close ())
334+ }
335+ }
336+
286337func newFreezerForTesting (t * testing.T , tables map [string ]bool ) (* Freezer , string ) {
287338 t .Helper ()
288339
0 commit comments