aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2014-03-26 11:00:25 -0600
committerBen Johnson <benbjohnson@yahoo.com>2014-03-26 11:00:25 -0600
commitb10aa18c8872572072890a59eda62c4387084271 (patch)
treef10836fe819a9c8d38d2052a3371292288113160
parentMerge pull request #91 from benbjohnson/quickcheck (diff)
parentFix DB.Copy() meta lock and partial write checks. (diff)
downloaddedo-b10aa18c8872572072890a59eda62c4387084271.tar.gz
dedo-b10aa18c8872572072890a59eda62c4387084271.tar.xz
Merge pull request #92 from benbjohnson/safe-copy
Fix DB.Copy() meta lock and partial write checks.
-rw-r--r--db.go13
1 files changed, 12 insertions, 1 deletions
diff --git a/db.go b/db.go
index 1acef14..cbcc322 100644
--- a/db.go
+++ b/db.go
@@ -453,13 +453,24 @@ func (db *DB) Copy(w io.Writer) error {
return err
}
- // Copy everything.
+ // Copy the meta pages.
+ db.metalock.Lock()
+ _, err = io.CopyN(w, f, int64(db.pageSize*2))
+ db.metalock.Unlock()
+ if err != nil {
+ _ = t.Rollback()
+ _ = f.Close()
+ return fmt.Errorf("meta copy: %s", err)
+ }
+
+ // Copy data pages.
if _, err := io.Copy(w, f); err != nil {
_ = t.Rollback()
_ = f.Close()
return err
}
+ // Close read transaction and exit.
if err := t.Rollback(); err != nil {
_ = f.Close()
return err