2014-10-12 2 views
1

Я реализовал оболочку 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, чтобы позволить многопоточный чтение? Как насчет письма? Я не удивлюсь, если многопоточная запись невозможна, но многопоточное чтение кажется таким, каким оно должно быть. Что я здесь делаю неправильно?

+1

Вы закрываете db после 'BenchmarkLeviDbGet'? –

ответ

1

Вам либо нужно закрыть файл базы данных, либо использовать для него глобальный экземпляр, вы не сможете открыть его несколько раз, однако вы можете получить доступ к одному экземпляру из нескольких goroutines.

+0

Да, я неправильно понял контрольную настройку; Я думал, что он будет запускать вещи в цикле 'for' непрерывно, но на самом деле он выполняет всю процедуру непрерывно. – tmesser

Смежные вопросы