Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions manager/state/raft/raft_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"golang.org/x/net/context"

"github.com/Sirupsen/logrus"
"github.com/coreos/etcd/pkg/fileutil"
"github.com/coreos/etcd/wal"
"github.com/docker/swarmkit/api"
cautils "github.com/docker/swarmkit/ca/testutils"
Expand Down Expand Up @@ -319,10 +320,8 @@ func TestRaftLeaderLeave(t *testing.T) {
raftutils.WaitForCluster(t, clockSource, newCluster)

// Node1's state should be cleared
_, err = os.Stat(filepath.Join(nodes[1].StateDir, "snap-v3-encrypted"))
require.True(t, os.IsNotExist(err))
_, err = os.Stat(filepath.Join(nodes[1].StateDir, "wal-v3-encrypted"))
require.True(t, os.IsNotExist(err))
require.False(t, fileutil.Exist(filepath.Join(nodes[1].StateDir, "snap-v3-encrypted")))
require.False(t, fileutil.Exist(filepath.Join(nodes[1].StateDir, "wal-v3-encrypted")))
require.Equal(t, raft.EncryptionKeys{}, nodes[1].KeyRotator.GetKeys())

// Leader should not be 1
Expand Down
11 changes: 6 additions & 5 deletions manager/state/raft/storage/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,13 @@ func (e *EncryptedRaftLogger) BootstrapNew(metadata []byte) error {
encrypter, decrypter := encryption.Defaults(e.EncryptionKey)
walFactory := NewWALFactory(encrypter, decrypter)

for _, dirpath := range []string{e.walDir(), e.snapDir()} {
for _, dirpath := range []string{filepath.Dir(e.walDir()), e.snapDir()} {
if err := os.MkdirAll(dirpath, 0700); err != nil {
return errors.Wrapf(err, "failed to create %s", dirpath)
}
}
var err error
// the wal directory must not already exist upon creation
e.wal, err = walFactory.Create(e.walDir(), metadata)
if err != nil {
return errors.Wrap(err, "failed to create WAL")
Expand Down Expand Up @@ -373,17 +374,17 @@ func (e *EncryptedRaftLogger) Clear(ctx context.Context) error {
if err != nil {
return err
}
err = os.Rename(e.walDir(), newWALDir)
if err != nil {
os.RemoveAll(newWALDir)
if err = os.Rename(e.walDir(), newWALDir); err != nil {
return err
}

newSnapDir, err := ioutil.TempDir(e.StateDir, "snap.")
if err != nil {
return err
}
err = os.Rename(e.snapDir(), newSnapDir)
if err != nil {
os.RemoveAll(newSnapDir)
if err := os.Rename(e.snapDir(), newSnapDir); err != nil {
return err
}

Expand Down
4 changes: 1 addition & 3 deletions manager/state/raft/storage/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,7 @@ func TestMigrateToV3EncryptedForm(t *testing.T) {
writeDataTo := func(suffix string, snapshot raftpb.Snapshot, walFactory WALFactory, snapFactory SnapFactory) []raftpb.Entry {
snapDir := filepath.Join(tempdir, "snap"+suffix)
walDir := filepath.Join(tempdir, "wal"+suffix)
for _, dirpath := range []string{snapDir, walDir} {
require.NoError(t, os.MkdirAll(dirpath, 0755))
}
require.NoError(t, os.MkdirAll(snapDir, 0755))
require.NoError(t, snapFactory.New(snapDir).SaveSnap(snapshot))

_, entries, _ := makeWALData(snapshot.Metadata.Index, snapshot.Metadata.Term)
Expand Down
18 changes: 10 additions & 8 deletions manager/state/raft/storage/walwrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"sort"
"strings"

"github.com/coreos/etcd/pkg/fileutil"
"github.com/coreos/etcd/raft/raftpb"
"github.com/coreos/etcd/wal"
"github.com/coreos/etcd/wal/walpb"
Expand Down Expand Up @@ -204,16 +203,16 @@ func MigrateWALs(ctx context.Context, oldDir, newDir string, oldFactory, newFact
}
oldReader.Close()

if err := os.MkdirAll(filepath.Dir(newDir), 0700); err != nil {
return errors.Wrap(err, "could not create parent directory")
}

// keep temporary wal directory so WAL initialization appears atomic
tmpdirpath := filepath.Clean(newDir) + ".tmp"
if fileutil.Exist(tmpdirpath) {
if err := os.RemoveAll(tmpdirpath); err != nil {
return errors.Wrap(err, "could not remove temporary WAL directory")
}
}
if err := fileutil.CreateDirAll(tmpdirpath); err != nil {
return errors.Wrap(err, "could not create temporary WAL directory")
if err := os.RemoveAll(tmpdirpath); err != nil {
return errors.Wrap(err, "could not remove temporary WAL directory")
}
defer os.RemoveAll(tmpdirpath)

tmpWAL, err := newFactory.Create(tmpdirpath, waldata.Metadata)
if err != nil {
Expand All @@ -228,6 +227,9 @@ func MigrateWALs(ctx context.Context, oldDir, newDir string, oldFactory, newFact
if err := tmpWAL.Save(waldata.HardState, waldata.Entries); err != nil {
return errors.Wrap(err, "could not migrate WALs to temporary directory")
}
if err := tmpWAL.Close(); err != nil {
return err
}

return os.Rename(tmpdirpath, newDir)
}
Expand Down
8 changes: 7 additions & 1 deletion manager/state/raft/storage/walwrap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ func makeWALData(index uint64, term uint64) ([]byte, []raftpb.Entry, walpb.Snaps
func createWithWAL(t *testing.T, w WALFactory, metadata []byte, startSnap walpb.Snapshot, entries []raftpb.Entry) string {
walDir, err := ioutil.TempDir("", "waltests")
require.NoError(t, err)
require.NoError(t, os.RemoveAll(walDir))

walWriter, err := w.Create(walDir, metadata)
require.NoError(t, err)
Expand Down Expand Up @@ -162,6 +163,7 @@ func TestSaveEncryptionFails(t *testing.T) {

tempdir, err := ioutil.TempDir("", "waltests")
require.NoError(t, err)
os.RemoveAll(tempdir)
defer os.RemoveAll(tempdir)

// fail encrypting one of the entries, but not the first one
Expand Down Expand Up @@ -195,7 +197,11 @@ func TestCreateOpenInvalidDirFails(t *testing.T) {
_, err := c.Create("/not/existing/directory", []byte("metadata"))
require.Error(t, err)

_, err = c.Open("/not/existing/directory", walpb.Snapshot{})
tempDir, err := ioutil.TempDir("", "test-migrate")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

_, err = c.Open(tempDir, walpb.Snapshot{}) // invalid because no WAL file
require.Error(t, err)
}

Expand Down