diff options
| author | Chris Lu <chris.lu@gmail.com> | 2014-09-04 19:26:31 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2014-09-04 19:26:31 -0700 |
| commit | 4be5ccd0c85b82f0faae2905dd51340b2d84f98b (patch) | |
| tree | 63fe21d018e83991de72a8d27e075b08889b0195 | |
| parent | 69343c5951a7e6a6e272393c1946c12d635b51b8 (diff) | |
| download | seaweedfs-4be5ccd0c85b82f0faae2905dd51340b2d84f98b.tar.xz seaweedfs-4be5ccd0c85b82f0faae2905dd51340b2d84f98b.zip | |
resolve directory log file error
avoid possible race condition
| -rw-r--r-- | go/filer/directory_in_map.go | 13 |
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) } |
