Skip to content

Commit ad36005

Browse files
authored
Merge pull request #439 from jmhbnz/backport-failpoints-injection
[1.3] Backport change to error handling logic
2 parents e4e06d2 + 8165a40 commit ad36005

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

db.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -649,9 +649,10 @@ func (db *DB) close() error {
649649
// Clear ops.
650650
db.ops.writeAt = nil
651651

652+
var errs []error
652653
// Close the mmap.
653654
if err := db.munmap(); err != nil {
654-
return err
655+
errs = append(errs, err)
655656
}
656657

657658
// Close file handles.
@@ -660,18 +661,22 @@ func (db *DB) close() error {
660661
if !db.readOnly {
661662
// Unlock the file.
662663
if err := funlock(db); err != nil {
663-
return fmt.Errorf("bolt.Close(): funlock error: %w", err)
664+
errs = append(errs, fmt.Errorf("bolt.Close(): funlock error: %w", err))
664665
}
665666
}
666667

667668
// Close the file descriptor.
668669
if err := db.file.Close(); err != nil {
669-
return fmt.Errorf("db file close: %s", err)
670+
errs = append(errs, fmt.Errorf("db file close: %w", err))
670671
}
671672
db.file = nil
672673
}
673674

674675
db.path = ""
676+
677+
if len(errs) > 0 {
678+
return errs[0]
679+
}
675680
return nil
676681
}
677682

tests/failpoint/db_failpoint_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package failpoint
33
import (
44
"path/filepath"
55
"testing"
6+
"time"
67

78
"github.com/stretchr/testify/require"
89

@@ -23,3 +24,25 @@ func TestFailpoint_MapFail(t *testing.T) {
2324
require.Error(t, err)
2425
require.ErrorContains(t, err, "map somehow failed")
2526
}
27+
28+
// ensures when munmap fails, the flock is unlocked
29+
func TestFailpoint_UnmapFail_DbClose(t *testing.T) {
30+
//unmap error on db close
31+
//we need to open the db first, and then enable the error.
32+
//otherwise the db cannot be opened.
33+
f := filepath.Join(t.TempDir(), "db")
34+
35+
err := gofail.Enable("unmapError", `return("unmap somehow failed")`)
36+
require.NoError(t, err)
37+
_, err = bolt.Open(f, 0666, nil)
38+
require.Error(t, err)
39+
require.ErrorContains(t, err, "unmap somehow failed")
40+
//disable the error, and try to reopen the db
41+
err = gofail.Disable("unmapError")
42+
require.NoError(t, err)
43+
44+
db, err := bolt.Open(f, 0666, &bolt.Options{Timeout: 30 * time.Second})
45+
require.NoError(t, err)
46+
err = db.Close()
47+
require.NoError(t, err)
48+
}

0 commit comments

Comments
 (0)