Shrink: fix renaming on Windows

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
```
This commit is contained in:
Ido Savion 2024-08-26 17:24:57 +03:00
parent e0e630f20f
commit edbeb9e03c
1 changed files with 14 additions and 1 deletions

View File

@ -10,6 +10,7 @@ import (
"fmt"
"io"
"os"
"runtime"
"sort"
"strconv"
"strings"
@ -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)
@ -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().