Browse Source

Fix LevelDB closing order.

The storage itself should be closed before any of the objects passed into it
are closed (otherwise closing the storage can randomly freeze). Defers are
executed in reverse order, so closing the storage should be the last of the
defer statements.

Change-Id: Id920318b876f5b94767ed48c81221b3456770620
changes/87/87/1
Julius Volz 11 years ago
parent
commit
718ad2224b
  1. 12
      storage/raw/leveldb/leveldb.go

12
storage/raw/leveldb/leveldb.go

@ -260,12 +260,6 @@ func NewLevelDBPersistence(o LevelDBOptions) (*LevelDBPersistence, error) {
func (l *LevelDBPersistence) Close() error {
// These are deferred to take advantage of forced closing in case of stack
// unwinding due to anomalies.
defer func() {
if l.storage != nil {
l.storage.Close()
}
}()
defer func() {
if l.filterPolicy != nil {
l.filterPolicy.Close()
@ -296,6 +290,12 @@ func (l *LevelDBPersistence) Close() error {
}
}()
defer func() {
if l.storage != nil {
l.storage.Close()
}
}()
return nil
}

Loading…
Cancel
Save