mirror of
https://github.com/etcd-io/bbolt.git
synced 2025-05-31 11:42:30 +00:00
Ignore multiple transaction commit/rollback/close.
This commit is contained in:
parent
7214e089c0
commit
3a1b152562
2
db.go
2
db.go
@ -571,7 +571,7 @@ func (db *DB) Stat() (*Stat, error) {
|
||||
|
||||
// page retrieves a page reference from the mmap based on the current page size.
|
||||
func (db *DB) page(id pgid) *page {
|
||||
pos := id*pgid(db.pageSize)
|
||||
pos := id * pgid(db.pageSize)
|
||||
return (*page)(unsafe.Pointer(&db.data[pos]))
|
||||
}
|
||||
|
||||
|
@ -82,6 +82,10 @@ func (t *RWTransaction) DeleteBucket(name string) error {
|
||||
// Commit writes all changes to disk and updates the meta page.
|
||||
// Returns an error if a disk write error occurs.
|
||||
func (t *RWTransaction) Commit() error {
|
||||
if t.db == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
defer t.close()
|
||||
|
||||
// TODO(benbjohnson): Use vectorized I/O to write out dirty pages.
|
||||
@ -119,7 +123,10 @@ func (t *RWTransaction) Rollback() {
|
||||
}
|
||||
|
||||
func (t *RWTransaction) close() {
|
||||
t.db.rwlock.Unlock()
|
||||
if t.db != nil {
|
||||
t.db.rwlock.Unlock()
|
||||
t.db = nil
|
||||
}
|
||||
}
|
||||
|
||||
// allocate returns a contiguous block of memory starting at a given page.
|
||||
|
@ -40,10 +40,14 @@ func (t *Transaction) id() txnid {
|
||||
|
||||
// Close closes the transaction and releases any pages it is using.
|
||||
func (t *Transaction) Close() {
|
||||
if t.rwtransaction != nil {
|
||||
t.rwtransaction.Rollback()
|
||||
if t.db != nil {
|
||||
if t.rwtransaction != nil {
|
||||
t.rwtransaction.Rollback()
|
||||
} else {
|
||||
t.db.removeTransaction(t)
|
||||
t.db = nil
|
||||
}
|
||||
}
|
||||
t.db.removeTransaction(t)
|
||||
}
|
||||
|
||||
// DB returns a reference to the database that created the transaction.
|
||||
|
Loading…
x
Reference in New Issue
Block a user