wait to read again if the volume is compacting

This commit is contained in:
Chris Lu 2019-01-05 19:52:17 -08:00
parent fe50224ea0
commit 9383c91eb1
3 changed files with 10 additions and 1 deletions

View file

@ -16,6 +16,7 @@ type Volume struct {
Collection string Collection string
dataFile *os.File dataFile *os.File
nm NeedleMapper nm NeedleMapper
compactingWg sync.WaitGroup
needleMapKind NeedleMapType needleMapKind NeedleMapType
readOnly bool readOnly bool

View file

@ -12,6 +12,8 @@ import (
. "github.com/chrislusf/seaweedfs/weed/storage/types" . "github.com/chrislusf/seaweedfs/weed/storage/types"
) )
var ErrorNotFound = errors.New("not found")
// isFileUnchanged checks whether this needle to write is same as last one. // isFileUnchanged checks whether this needle to write is same as last one.
// It requires serialized access in the same volume. // It requires serialized access in the same volume.
func (v *Volume) isFileUnchanged(n *Needle) bool { func (v *Volume) isFileUnchanged(n *Needle) bool {
@ -134,7 +136,11 @@ func (v *Volume) deleteNeedle(n *Needle) (uint32, error) {
func (v *Volume) readNeedle(n *Needle) (int, error) { func (v *Volume) readNeedle(n *Needle) (int, error) {
nv, ok := v.nm.Get(n.Id) nv, ok := v.nm.Get(n.Id)
if !ok || nv.Offset == 0 { if !ok || nv.Offset == 0 {
return -1, errors.New("Not Found") v.compactingWg.Wait()
nv, ok = v.nm.Get(n.Id)
if !ok || nv.Offset == 0 {
return -1, ErrorNotFound
}
} }
if nv.Size == TombstoneFileSize { if nv.Size == TombstoneFileSize {
return -1, errors.New("Already Deleted") return -1, errors.New("Already Deleted")

View file

@ -43,6 +43,8 @@ func (v *Volume) commitCompact() error {
v.dataFileAccessLock.Lock() v.dataFileAccessLock.Lock()
defer v.dataFileAccessLock.Unlock() defer v.dataFileAccessLock.Unlock()
glog.V(3).Infof("Got volume %d committing lock...", v.Id) glog.V(3).Infof("Got volume %d committing lock...", v.Id)
v.compactingWg.Add(1)
defer v.compactingWg.Done()
v.nm.Close() v.nm.Close()
if err := v.dataFile.Close(); err != nil { if err := v.dataFile.Close(); err != nil {
glog.V(0).Infof("fail to close volume %d", v.Id) glog.V(0).Infof("fail to close volume %d", v.Id)