From aad612d097bb2377369aa20e55ccc3250599a929 Mon Sep 17 00:00:00 2001 From: "Sascha L. Teichmann" Date: Mon, 20 Mar 2017 12:41:24 +0100 Subject: [PATCH] Experimental increased priorities for typical mt-server ops. --- cmd/mtredisalize/leveldb.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/cmd/mtredisalize/leveldb.go b/cmd/mtredisalize/leveldb.go index f218ba4..1e9f1a5 100644 --- a/cmd/mtredisalize/leveldb.go +++ b/cmd/mtredisalize/leveldb.go @@ -23,6 +23,9 @@ type LevelDBBackend struct { changeTracker *changeTracker mutex sync.RWMutex + + priority *sync.Cond + priorityCount int } type LevelDBSession struct { @@ -72,7 +75,8 @@ func NewLeveDBBackend( interleaved: interleaved, encoder: encoder, decoder: decoder, - changeTracker: changeTracker} + changeTracker: changeTracker, + priority: sync.NewCond(new(sync.Mutex))} if !interleaved { if err = ldb.buildCoverage(); err != nil { @@ -84,6 +88,28 @@ func NewLeveDBBackend( return } +func (ldb *LevelDBBackend) suspend() { + ldb.priority.L.Lock() + for ldb.priorityCount > 0 { + ldb.priority.Wait() + } + ldb.priority.L.Unlock() +} + +func (ldb *LevelDBBackend) grab() { + ldb.priority.L.Lock() + ldb.priorityCount++ + ldb.priority.L.Unlock() +} + +func (ldb *LevelDBBackend) ungrab() { + ldb.priority.L.Lock() + if ldb.priorityCount--; ldb.priorityCount <= 0 { + ldb.priority.Broadcast() + } + ldb.priority.L.Unlock() +} + func (ldb *LevelDBBackend) buildCoverage() error { log.Println("INFO: Start building coverage index (this may take some time)...") @@ -169,6 +195,9 @@ func (ldbs *LevelDBSession) Fetch(hash, key []byte) (value []byte, err error) { return } ldbs.backend.doRead(func(db *leveldb.DB) { + ldbs.backend.grab() + defer ldbs.backend.ungrab() + ro := leveldb.NewReadOptions() value, err = ldbs.backend.db.Get(ro, key) //if err != nil { @@ -202,6 +231,8 @@ func (ldbs *LevelDBSession) Store(hash, key, value []byte) (exists bool, err err return } ldbs.backend.doWrite(func(db *leveldb.DB) { + ldbs.backend.grab() + defer ldbs.backend.ungrab() if exists, err = keyExists(db, key); err != nil { return } @@ -424,6 +455,7 @@ func (ldbs *LevelDBSession) interleavedSpatialQuery( //log.Printf("seeking to: %d\n", zmin) it.Seek(common.ToBigEndian(zmin)) for it.Valid() { + ldbs.backend.suspend() zcode := common.FromBigEndian(it.Key()) if zcode > zmax {