Skip to content

Commit

Permalink
Shrink: fix renaming on Windows
Browse files Browse the repository at this point in the history
Changing the behavior to support buntdb across different operating systems
as the following crash encountered on windows while renaming in shrink:

```
panic: buntdb: rename mydb.tmp mydb: Access is denied
```
  • Loading branch information
Ido Savion authored and Ido Savion committed Sep 4, 2024
1 parent e0e630f commit edbeb9e
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion buntdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"fmt"
"io"
"os"
"runtime"
"sort"
"strconv"
"strings"
Expand Down Expand Up @@ -753,7 +754,7 @@ func (db *DB) Shrink() error {
return err
}
// Any failures below here are really bad. So just panic.
if err := os.Rename(tmpname, fname); err != nil {
if err := renameFile(tmpname, fname); err != nil {
panicErr(err)
}
db.file, err = os.OpenFile(fname, os.O_CREATE|os.O_RDWR, 0666)
Expand All @@ -773,6 +774,18 @@ func panicErr(err error) error {
panic(fmt.Errorf("buntdb: %w", err))
}

func renameFile(src, dest string) error {
var err error
if err = os.Rename(src, dest); err != nil {
if runtime.GOOS == "windows" {
if err = os.Remove(dest); err == nil {
err = os.Rename(src, dest)
}
}
}
return err
}

// readLoad reads from the reader and loads commands into the database.
// modTime is the modified time of the reader, should be no greater than
// the current time.Now().
Expand Down

0 comments on commit edbeb9e

Please sign in to comment.