|
@@ -93,6 +93,7 @@ type DB struct {
|
|
|
|
|
|
|
|
path string
|
|
path string
|
|
|
file *os.File
|
|
file *os.File
|
|
|
|
|
+ lockfile *os.File // windows only
|
|
|
dataref []byte // mmap'ed readonly, write throws SEGV
|
|
dataref []byte // mmap'ed readonly, write throws SEGV
|
|
|
data *[maxMapSize]byte
|
|
data *[maxMapSize]byte
|
|
|
datasz int
|
|
datasz int
|
|
@@ -177,7 +178,7 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) {
|
|
|
// if !options.ReadOnly.
|
|
// if !options.ReadOnly.
|
|
|
// The database file is locked using the shared lock (more than one process may
|
|
// The database file is locked using the shared lock (more than one process may
|
|
|
// hold a lock at the same time) otherwise (options.ReadOnly is set).
|
|
// hold a lock at the same time) otherwise (options.ReadOnly is set).
|
|
|
- if err := flock(db.file, !db.readOnly, options.Timeout); err != nil {
|
|
|
|
|
|
|
+ if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil {
|
|
|
_ = db.close()
|
|
_ = db.close()
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
@@ -379,6 +380,10 @@ func (db *DB) Close() error {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (db *DB) close() error {
|
|
func (db *DB) close() error {
|
|
|
|
|
+ if !db.opened {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
db.opened = false
|
|
db.opened = false
|
|
|
|
|
|
|
|
db.freelist = nil
|
|
db.freelist = nil
|
|
@@ -397,7 +402,7 @@ func (db *DB) close() error {
|
|
|
// No need to unlock read-only file.
|
|
// No need to unlock read-only file.
|
|
|
if !db.readOnly {
|
|
if !db.readOnly {
|
|
|
// Unlock the file.
|
|
// Unlock the file.
|
|
|
- if err := funlock(db.file); err != nil {
|
|
|
|
|
|
|
+ if err := funlock(db); err != nil {
|
|
|
log.Printf("bolt.Close(): funlock error: %s", err)
|
|
log.Printf("bolt.Close(): funlock error: %s", err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -824,8 +829,10 @@ func (db *DB) grow(sz int) error {
|
|
|
// Truncate and fsync to ensure file size metadata is flushed.
|
|
// Truncate and fsync to ensure file size metadata is flushed.
|
|
|
// https://github.com/boltdb/bolt/issues/284
|
|
// https://github.com/boltdb/bolt/issues/284
|
|
|
if !db.NoGrowSync && !db.readOnly {
|
|
if !db.NoGrowSync && !db.readOnly {
|
|
|
- if err := db.file.Truncate(int64(sz)); err != nil {
|
|
|
|
|
- return fmt.Errorf("file resize error: %s", err)
|
|
|
|
|
|
|
+ if runtime.GOOS != "windows" {
|
|
|
|
|
+ if err := db.file.Truncate(int64(sz)); err != nil {
|
|
|
|
|
+ return fmt.Errorf("file resize error: %s", err)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
if err := db.file.Sync(); err != nil {
|
|
if err := db.file.Sync(); err != nil {
|
|
|
return fmt.Errorf("file sync error: %s", err)
|
|
return fmt.Errorf("file sync error: %s", err)
|