aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-12-29 20:19:51 -0800
committerChris Lu <chris.lu@gmail.com>2019-12-29 20:19:51 -0800
commit09043c8e5a3b43add589344d28d4f57e90c83f70 (patch)
treeb89bad02094cc7131bc2c9f64df13e15f9de9914
parent509f314350ee937afade184ed2e775b19aab0301 (diff)
downloadseaweedfs-09043c8e5a3b43add589344d28d4f57e90c83f70.tar.xz
seaweedfs-09043c8e5a3b43add589344d28d4f57e90c83f70.zip
fs: synchronized meta file writing
fix https://github.com/chrislusf/seaweedfs/issues/1175
-rw-r--r--weed/shell/command_fs_meta_save.go27
1 files changed, 20 insertions, 7 deletions
diff --git a/weed/shell/command_fs_meta_save.go b/weed/shell/command_fs_meta_save.go
index 4ff00c64b..ed070350f 100644
--- a/weed/shell/command_fs_meta_save.go
+++ b/weed/shell/command_fs_meta_save.go
@@ -74,6 +74,19 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io.
}
defer dst.Close()
+ var wg sync.WaitGroup
+ wg.Add(1)
+ outputChan := make(chan []byte, 1024)
+ go func() {
+ sizeBuf := make([]byte, 4)
+ for b := range outputChan {
+ util.Uint32toBytes(sizeBuf, uint32(len(b)))
+ dst.Write(sizeBuf)
+ dst.Write(b)
+ }
+ wg.Done()
+ }()
+
var dirCount, fileCount uint64
err = doTraverseBFS(ctx, writer, commandEnv.getFilerClient(filerServer, filerPort), filer2.FullPath(path), func(parentPath filer2.FullPath, entry *filer_pb.Entry) {
@@ -89,11 +102,7 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io.
return
}
- sizeBuf := make([]byte, 4)
- util.Uint32toBytes(sizeBuf, uint32(len(bytes)))
-
- dst.Write(sizeBuf)
- dst.Write(bytes)
+ outputChan <- bytes
if entry.IsDirectory {
atomic.AddUint64(&dirCount, 1)
@@ -107,9 +116,13 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io.
})
+ close(outputChan)
+
+ wg.Wait()
+
if err == nil {
- fmt.Fprintf(writer, "\ntotal %d directories, %d files", dirCount, fileCount)
- fmt.Fprintf(writer, "\nmeta data for http://%s:%d%s is saved to %s\n", filerServer, filerPort, path, fileName)
+ fmt.Fprintf(writer, "total %d directories, %d files\n", dirCount, fileCount)
+ fmt.Fprintf(writer, "meta data for http://%s:%d%s is saved to %s\n", filerServer, filerPort, path, fileName)
}
return err