From 2b855c42c33e91820f14720f699c92017826afe2 Mon Sep 17 00:00:00 2001 From: RandomChars <random@chars.jp> Date: Sat, 16 Oct 2021 15:48:18 +0900 Subject: [PATCH] safe concurrent access and (transparent) creation of page DBs --- store/page.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/store/page.go b/store/page.go index 937b195..8a1a623 100644 --- a/store/page.go +++ b/store/page.go @@ -12,10 +12,18 @@ const PageSize = 64 // pageDB returns leveldb of page variant and creates it as required. func (s *Store) pageDB(variant string) *leveldb.DB { + l := s.getLock("pageDB_get") + l.RLock() + defer l.RUnlock() + if s.pageldb[variant] != nil { return s.pageldb[variant] } else { + l.RUnlock() + l.Lock() if db, err := leveldb.OpenFile(s.PageVariantPath(variant), nil); err != nil { + l.Unlock() + l.RLock() s.fatalClose(fmt.Sprintf("Error opening leveldb for page variant %s, %s", variant, err)) } else { s.pageldb[variant] = db @@ -23,6 +31,8 @@ func (s *Store) pageDB(variant string) *leveldb.DB { log.Infof("Page variant %s created.", variant) s.pageSetTotalCountNoDestroy(variant, 0) } + l.Unlock() + l.RLock() return db } } -- GitLab