Skip to content

Commit 0403f95

Browse files
authored
Merge pull request #1738 from CortexFoundation/dev
core/rawdb: use readonly file lock in readonly mode
2 parents 1b309b7 + 3eb9d71 commit 0403f95

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

core/rawdb/freezer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ func NewFreezer(datadir string, namespace string, readonly bool, maxTableSize ui
108108
// Leveldb uses LOCK as the filelock filename. To prevent the
109109
// name collision, we use FLOCK as the lock name.
110110
lock := flock.New(flockFile)
111-
if locked, err := lock.TryLock(); err != nil {
111+
tryLock := lock.TryLock
112+
if readonly {
113+
tryLock = lock.TryRLock
114+
}
115+
if locked, err := tryLock(); err != nil {
112116
return nil, err
113117
} else if !locked {
114118
return nil, errors.New("locking failed")

core/rawdb/freezer_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
286337
func newFreezerForTesting(t *testing.T, tables map[string]bool) (*Freezer, string) {
287338
t.Helper()
288339

0 commit comments

Comments
 (0)