mirror of
https://bitbucket.org/s_l_teichmann/mtsatellite
synced 2025-02-02 03:00:20 +01:00
Experimental increased priorities for typical mt-server ops.
This commit is contained in:
parent
6a1356f0eb
commit
aad612d097
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user