Browse Source

*: do not backup files still in use

Xiang Li 11 years ago
parent
commit
f538cba272
2 changed files with 16 additions and 2 deletions
  1. 1 1
      etcdctl/command/backup_command.go
  2. 15 1
      wal/wal.go

+ 1 - 1
etcdctl/command/backup_command.go

@@ -67,7 +67,7 @@ func handleBackup(c *cli.Context) {
 		}
 		}
 	}
 	}
 
 
-	w, err := wal.OpenAtIndex(srcWAL, index)
+	w, err := wal.OpenAtIndexUntilUsing(srcWAL, index)
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}

+ 15 - 1
wal/wal.go

@@ -21,6 +21,7 @@ import (
 	"fmt"
 	"fmt"
 	"hash/crc32"
 	"hash/crc32"
 	"io"
 	"io"
+	"log"
 	"os"
 	"os"
 	"path"
 	"path"
 	"reflect"
 	"reflect"
@@ -123,6 +124,14 @@ func Create(dirpath string, metadata []byte) (*WAL, error) {
 // index. The WAL cannot be appended to before reading out all of its
 // index. The WAL cannot be appended to before reading out all of its
 // previous records.
 // previous records.
 func OpenAtIndex(dirpath string, index uint64) (*WAL, error) {
 func OpenAtIndex(dirpath string, index uint64) (*WAL, error) {
+	return openAtIndex(dirpath, index, true)
+}
+
+func OpenAtIndexUntilUsing(dirpath string, index uint64) (*WAL, error) {
+	return openAtIndex(dirpath, index, false)
+}
+
+func openAtIndex(dirpath string, index uint64, all bool) (*WAL, error) {
 	names, err := fileutil.ReadDir(dirpath)
 	names, err := fileutil.ReadDir(dirpath)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -153,7 +162,12 @@ func OpenAtIndex(dirpath string, index uint64) (*WAL, error) {
 		}
 		}
 		err = l.TryLock()
 		err = l.TryLock()
 		if err != nil {
 		if err != nil {
-			return nil, err
+			if all {
+				return nil, err
+			} else {
+				log.Printf("wal: opened all the files until %s, since it is still in use by an etcd server", name)
+				break
+			}
 		}
 		}
 		rcs = append(rcs, f)
 		rcs = append(rcs, f)
 		ls = append(ls, l)
 		ls = append(ls, l)