aboutsummaryrefslogtreecommitdiff
path: root/go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2014-09-04 19:26:31 -0700
committerChris Lu <chris.lu@gmail.com>2014-09-04 19:26:31 -0700
commit4be5ccd0c85b82f0faae2905dd51340b2d84f98b (patch)
tree63fe21d018e83991de72a8d27e075b08889b0195 /go
parent69343c5951a7e6a6e272393c1946c12d635b51b8 (diff)
downloadseaweedfs-4be5ccd0c85b82f0faae2905dd51340b2d84f98b.tar.xz
seaweedfs-4be5ccd0c85b82f0faae2905dd51340b2d84f98b.zip
resolve directory log file error
avoid possible race condition
Diffstat (limited to 'go')
-rw-r--r--go/filer/directory_in_map.go13
1 files changed, 11 insertions, 2 deletions
diff --git a/go/filer/directory_in_map.go b/go/filer/directory_in_map.go
index 9c2ecdf80..051ff31fe 100644
--- a/go/filer/directory_in_map.go
+++ b/go/filer/directory_in_map.go
@@ -9,8 +9,11 @@ import (
"path/filepath"
"strconv"
"strings"
+ "sync"
)
+var writeLock sync.Mutex //serialize changes to dir.log
+
type DirectoryEntryInMap struct {
Name string
Parent *DirectoryEntryInMap
@@ -26,9 +29,9 @@ type DirectoryManagerInMap struct {
}
func (dm *DirectoryManagerInMap) NewDirectoryEntryInMap(parent *DirectoryEntryInMap, name string) (d *DirectoryEntryInMap) {
+ writeLock.Lock()
+ defer writeLock.Unlock()
d = &DirectoryEntryInMap{Name: name, Parent: parent, SubDirectories: make(map[string]*DirectoryEntryInMap)}
- dm.max++
- d.Id = dm.max
parts := make([]string, 0)
for p := d; p != nil && p.Name != ""; p = p.Parent {
parts = append(parts, p.Name)
@@ -40,6 +43,8 @@ func (dm *DirectoryManagerInMap) NewDirectoryEntryInMap(parent *DirectoryEntryIn
for i := 0; i < n/2; i++ {
parts[i], parts[n-1-i] = parts[n-1-i], parts[i]
}
+ dm.max++
+ d.Id = dm.max
dm.log("add", "/"+strings.Join(parts, "/"), strconv.Itoa(int(d.Id)))
return d
}
@@ -193,6 +198,8 @@ func (dm *DirectoryManagerInMap) MakeDirectory(dirPath string) (DirectoryId, err
}
func (dm *DirectoryManagerInMap) MoveUnderDirectory(oldDirPath string, newParentDirPath string, newName string) error {
+ writeLock.Lock()
+ defer writeLock.Unlock()
oldDir, oe := dm.findDirectory(oldDirPath)
if oe != nil {
return oe
@@ -223,6 +230,8 @@ func (dm *DirectoryManagerInMap) ListDirectories(dirPath string) (dirNames []Dir
return dirNames, nil
}
func (dm *DirectoryManagerInMap) DeleteDirectory(dirPath string) error {
+ writeLock.Lock()
+ defer writeLock.Unlock()
if dirPath == "/" {
return fmt.Errorf("Can not delete %s", dirPath)
}