Skip to content

Commit 1158810

Browse files
committed
Fix: deadlock on sync all
1 parent 2b89223 commit 1158810

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

bitcask/bitcask.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,23 @@ func (db *DB) Meta() models.Metadata {
7171
return m
7272
}
7373

74+
func (db *DB) allStores() map[string]database.Filer {
75+
var stores = make(map[string]database.Filer)
76+
for n, s := range db.store {
77+
stores[n] = s
78+
}
79+
return stores
80+
}
81+
7482
// AllStores returns a map of the names of all bitcask datastores and the corresponding Filers.
7583
func (db *DB) AllStores() map[string]database.Filer {
7684
if err := db.init(); err != nil {
7785
panic(err)
7886
}
7987
db.mu.RLock()
80-
defer db.mu.RUnlock()
81-
var stores = make(map[string]database.Filer)
82-
for n, s := range db.store {
83-
stores[n] = s
84-
}
85-
return stores
88+
ast := db.allStores()
89+
db.mu.RUnlock()
90+
return ast
8691
}
8792

8893
func (db *DB) _init() error {
@@ -504,7 +509,7 @@ func (db *DB) CloseAll() error {
504509
return err
505510
}
506511
func (db *DB) addAllStoresToMeta() {
507-
storeMap := db.AllStores()
512+
storeMap := db.allStores()
508513
storeNames := make([]string, len(storeMap))
509514
for name := range storeMap {
510515
storeNames = append(storeNames, name)
@@ -513,6 +518,7 @@ func (db *DB) addAllStoresToMeta() {
513518
}
514519

515520
// SyncAll syncs all pogreb datastores.
521+
// TODO: investigate locking here, right now if we try to hold a lock during a backup we'll hang :^)
516522
func (db *DB) SyncAll() error {
517523
db.addAllStoresToMeta()
518524
var errs = make([]error, 0)

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
)
2424

2525
retract (
26+
v0.4.3 // deadlock
2627
v0.4.0 // broken metadata system
2728
v0.3.0 // doesn't pass go vet
2829
)

pogreb/pogreb.go

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -175,25 +175,37 @@ func (db *DB) Meta() models.Metadata {
175175
return m
176176
}
177177

178-
func (db *DB) UpdateMetrics() {
179-
db.mu.RLock()
180-
defer db.mu.RUnlock()
178+
func (db *DB) updateMetrics() {
181179
for _, s := range db.store {
182-
s.metrics = s.DB.Metrics()
180+
if s != nil && s.DB != nil {
181+
s.metrics = s.DB.Metrics()
182+
}
183183
}
184184
}
185185

186-
// AllStores returns a map of the names of all pogreb datastores and the corresponding Filers.
187-
func (db *DB) AllStores() map[string]database.Filer {
186+
func (db *DB) UpdateMetrics() {
188187
db.mu.RLock()
189-
defer db.mu.RUnlock()
188+
db.updateMetrics()
189+
db.mu.RUnlock()
190+
}
191+
192+
func (db *DB) allStores() map[string]database.Filer {
190193
var stores = make(map[string]database.Filer)
191194
for n, s := range db.store {
192195
stores[n] = s
193196
}
194197
return stores
195198
}
196199

200+
// AllStores returns a map of the names of all pogreb datastores and the corresponding Filers.
201+
func (db *DB) AllStores() map[string]database.Filer {
202+
203+
db.mu.RLock()
204+
ast := db.allStores()
205+
db.mu.RUnlock()
206+
return ast
207+
}
208+
197209
// FIXME: not returning the error is probably pretty irresponsible.
198210

199211
// OpenDB will either open an existing set of pogreb datastores at the given directory, or it will create a new one.
@@ -522,21 +534,19 @@ func (db *DB) CloseAll() error {
522534
}
523535

524536
func (db *DB) allMetrics() map[string]*pogreb.Metrics {
525-
db.UpdateMetrics()
537+
db.updateMetrics()
526538
allmet := make(map[string]*pogreb.Metrics, len(db.store))
527-
db.mu.RLock()
528539
for name, store := range db.store {
529540
if store == nil || store.Backend().(*pogreb.DB) == nil {
530541
continue
531542
}
532543
allmet[name] = store.metrics
533544
}
534-
db.mu.RUnlock()
535545
return allmet
536546
}
537547

538548
func (db *DB) addAllStoresToMeta() {
539-
storeMap := db.AllStores()
549+
storeMap := db.allStores()
540550
storeNames := make([]string, len(storeMap))
541551
for name := range storeMap {
542552
storeNames = append(storeNames, name)
@@ -550,6 +560,7 @@ func (db *DB) syncMetaValues() {
550560
}
551561

552562
// SyncAll syncs all pogreb datastores.
563+
// TODO: investigate locking here, right now if we try to hold a lock during a backup we'll hang :^)
553564
func (db *DB) SyncAll() error {
554565
db.syncMetaValues()
555566
var errs = make([]error, 0)

0 commit comments

Comments
 (0)