mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
resolve directory log file error
avoid possible race condition
This commit is contained in:
parent
69343c5951
commit
4be5ccd0c8
|
@ -9,8 +9,11 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var writeLock sync.Mutex //serialize changes to dir.log
|
||||||
|
|
||||||
type DirectoryEntryInMap struct {
|
type DirectoryEntryInMap struct {
|
||||||
Name string
|
Name string
|
||||||
Parent *DirectoryEntryInMap
|
Parent *DirectoryEntryInMap
|
||||||
|
@ -26,9 +29,9 @@ type DirectoryManagerInMap struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dm *DirectoryManagerInMap) NewDirectoryEntryInMap(parent *DirectoryEntryInMap, name string) (d *DirectoryEntryInMap) {
|
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)}
|
d = &DirectoryEntryInMap{Name: name, Parent: parent, SubDirectories: make(map[string]*DirectoryEntryInMap)}
|
||||||
dm.max++
|
|
||||||
d.Id = dm.max
|
|
||||||
parts := make([]string, 0)
|
parts := make([]string, 0)
|
||||||
for p := d; p != nil && p.Name != ""; p = p.Parent {
|
for p := d; p != nil && p.Name != ""; p = p.Parent {
|
||||||
parts = append(parts, p.Name)
|
parts = append(parts, p.Name)
|
||||||
|
@ -40,6 +43,8 @@ func (dm *DirectoryManagerInMap) NewDirectoryEntryInMap(parent *DirectoryEntryIn
|
||||||
for i := 0; i < n/2; i++ {
|
for i := 0; i < n/2; i++ {
|
||||||
parts[i], parts[n-1-i] = parts[n-1-i], parts[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)))
|
dm.log("add", "/"+strings.Join(parts, "/"), strconv.Itoa(int(d.Id)))
|
||||||
return d
|
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 {
|
func (dm *DirectoryManagerInMap) MoveUnderDirectory(oldDirPath string, newParentDirPath string, newName string) error {
|
||||||
|
writeLock.Lock()
|
||||||
|
defer writeLock.Unlock()
|
||||||
oldDir, oe := dm.findDirectory(oldDirPath)
|
oldDir, oe := dm.findDirectory(oldDirPath)
|
||||||
if oe != nil {
|
if oe != nil {
|
||||||
return oe
|
return oe
|
||||||
|
@ -223,6 +230,8 @@ func (dm *DirectoryManagerInMap) ListDirectories(dirPath string) (dirNames []Dir
|
||||||
return dirNames, nil
|
return dirNames, nil
|
||||||
}
|
}
|
||||||
func (dm *DirectoryManagerInMap) DeleteDirectory(dirPath string) error {
|
func (dm *DirectoryManagerInMap) DeleteDirectory(dirPath string) error {
|
||||||
|
writeLock.Lock()
|
||||||
|
defer writeLock.Unlock()
|
||||||
if dirPath == "/" {
|
if dirPath == "/" {
|
||||||
return fmt.Errorf("Can not delete %s", dirPath)
|
return fmt.Errorf("Can not delete %s", dirPath)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue