mirror of https://github.com/etcd-io/bbolt.git
Consolidate file and metafile descriptors.
Previously, a two file descriptors were used for the database: file & metafile. The "file" file descriptor was used for async writes while the "metafile" file descriptor was used with O_SYNC writes. This commit changes that so that there's only one file descriptor and it uses fdatasync() to synchronize writes.pull/34/head
parent
76acd60ff3
commit
4ef19124d1
23
db.go
23
db.go
|
@ -32,7 +32,6 @@ var (
|
|||
type DB struct {
|
||||
path string
|
||||
file *os.File
|
||||
metafile *os.File
|
||||
data []byte
|
||||
meta0 *meta
|
||||
meta1 *meta
|
||||
|
@ -47,8 +46,7 @@ type DB struct {
|
|||
mmaplock sync.RWMutex // Protects mmap access during remapping.
|
||||
|
||||
ops struct {
|
||||
writeAt func(b []byte, off int64) (n int, err error)
|
||||
metaWriteAt func(b []byte, off int64) (n int, err error)
|
||||
writeAt func(b []byte, off int64) (n int, err error)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -80,14 +78,9 @@ func Open(path string, mode os.FileMode) (*DB, error) {
|
|||
_ = db.close()
|
||||
return nil, err
|
||||
}
|
||||
if db.metafile, err = os.OpenFile(db.path, os.O_RDWR|os.O_SYNC, mode); err != nil {
|
||||
_ = db.close()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Default values for test hooks
|
||||
db.ops.writeAt = db.file.WriteAt
|
||||
db.ops.metaWriteAt = db.metafile.WriteAt
|
||||
|
||||
// Initialize the database if it doesn't exist.
|
||||
if info, err := db.file.Stat(); err != nil {
|
||||
|
@ -240,7 +233,10 @@ func (db *DB) init() error {
|
|||
p.count = 0
|
||||
|
||||
// Write the buffer to our data file.
|
||||
if _, err := db.ops.metaWriteAt(buf, 0); err != nil {
|
||||
if _, err := db.ops.writeAt(buf, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := fdatasync(db.file); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -263,7 +259,6 @@ func (db *DB) close() error {
|
|||
|
||||
// Clear ops.
|
||||
db.ops.writeAt = nil
|
||||
db.ops.metaWriteAt = nil
|
||||
|
||||
// Close the mmap.
|
||||
if err := db.munmap(); err != nil {
|
||||
|
@ -273,16 +268,10 @@ func (db *DB) close() error {
|
|||
// Close file handles.
|
||||
if db.file != nil {
|
||||
if err := db.file.Close(); err != nil {
|
||||
return fmt.Errorf("db file close error: %s", err)
|
||||
return fmt.Errorf("db file close: %s", err)
|
||||
}
|
||||
db.file = nil
|
||||
}
|
||||
if db.metafile != nil {
|
||||
if err := db.metafile.Close(); err != nil {
|
||||
return fmt.Errorf("db metafile close error: %s", err)
|
||||
}
|
||||
db.metafile = nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
5
tx.go
5
tx.go
|
@ -381,7 +381,10 @@ func (t *Tx) writeMeta() error {
|
|||
t.meta.write(p)
|
||||
|
||||
// Write the meta page to file.
|
||||
if _, err := t.db.ops.metaWriteAt(buf, int64(p.id)*int64(t.db.pageSize)); err != nil {
|
||||
if _, err := t.db.ops.writeAt(buf, int64(p.id)*int64(t.db.pageSize)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := fdatasync(t.db.file); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue