Experimental increased priorities for typical mt-server ops.

This commit is contained in:
Sascha L. Teichmann 2017-03-20 12:41:24 +01:00
parent 6a1356f0eb
commit aad612d097
1 changed files with 33 additions and 1 deletions

View File

@ -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 {