Я реализовал оболочку levigo в своем проекте, чтобы использовать LevelDB. Заявление довольно шаблонный, например, так:Каков подходящий способ многопоточного LevelDB в Go?
func NewLeveldbStorage(dbPath string) *leveldbStorage {
opts := levigo.NewOptions()
opts.SetCache(levigo.NewLRUCache(3<<30))
opts.SetCreateIfMissing(true)
log.Debugf("Entering Open")
db, err := levigo.Open(dbPath, opts); if err != nil {
log.Fatal("BOOM %v", err)
}
log.Debugf("Finished calling open")
opts.Close()
return &leveldbStorage{db:db}
}
Вот структура, которая возвращается:
type leveldbStorage struct {
db *levigo.DB
}
Затем я сделал несколько простых команд GET и STORE на структуры, которые в основном только использовать s.db.Get
и s.db.Put
. Это прекрасно работает в моих тестах, но когда я запускаю следующий тест:
func BenchmarkLeviDbGet(b *testing.B) {
s := storage.NewLeveldbStorage("/path/to/db")
value := "value"
uid,_ := s.Store(value)
b.ResetTimer()
for i := 0; i < b.N; i++ {
s.Get(uid)
}
Этот тест, при запуске, возвращается:
2014/10/12 21:17:09 BOOM %vIO error: lock /path/to/db/LOCK: already held by process
Есть соответствующий способ использования levigo/LevelDB, чтобы позволить многопоточный чтение? Как насчет письма? Я не удивлюсь, если многопоточная запись невозможна, но многопоточное чтение кажется таким, каким оно должно быть. Что я здесь делаю неправильно?
Вы закрываете db после 'BenchmarkLeviDbGet'? –