Browse Source

volume: sync volume file right before compaction

fix https://github.com/chrislusf/seaweedfs/issues/1237
pull/1255/head
Chris Lu 5 years ago
parent
commit
81797a059a
  1. 1
      weed/storage/backend/backend.go
  2. 4
      weed/storage/backend/disk_file.go
  3. 4
      weed/storage/backend/memory_map/memory_map_backend.go
  4. 4
      weed/storage/backend/s3_backend/s3_backend.go
  5. 9
      weed/storage/volume_vacuum.go

1
weed/storage/backend/backend.go

@ -19,6 +19,7 @@ type BackendStorageFile interface {
io.Closer
GetStat() (datSize int64, modTime time.Time, err error)
Name() string
Sync() error
}
type BackendStorage interface {

4
weed/storage/backend/disk_file.go

@ -48,3 +48,7 @@ func (df *DiskFile) GetStat() (datSize int64, modTime time.Time, err error) {
func (df *DiskFile) Name() string {
return df.fullFilePath
}
func (df *DiskFile) Sync() error {
return df.File.Sync()
}

4
weed/storage/backend/memory_map/memory_map_backend.go

@ -58,3 +58,7 @@ func (mmf *MemoryMappedFile) GetStat() (datSize int64, modTime time.Time, err er
func (mmf *MemoryMappedFile) Name() string {
return mmf.mm.File.Name()
}
func (mm *MemoryMappedFile) Sync() error {
return nil
}

4
weed/storage/backend/s3_backend/s3_backend.go

@ -179,3 +179,7 @@ func (s3backendStorageFile S3BackendStorageFile) GetStat() (datSize int64, modTi
func (s3backendStorageFile S3BackendStorageFile) Name() string {
return s3backendStorageFile.key
}
func (s3backendStorageFile S3BackendStorageFile) Sync() error {
return nil
}

9
weed/storage/volume_vacuum.go

@ -53,6 +53,9 @@ func (v *Volume) Compact(preallocate int64, compactionBytePerSecond int64) error
v.lastCompactIndexOffset = v.IndexFileSize()
v.lastCompactRevision = v.SuperBlock.CompactionRevision
glog.V(3).Infof("creating copies for volume %d ,last offset %d...", v.Id, v.lastCompactIndexOffset)
if err := v.DataBackend.Sync(); err != nil {
glog.V(0).Infof("compact fail to sync volume %d", v.Id)
}
return v.copyDataAndGenerateIndexFile(filePath+".cpd", filePath+".cpx", preallocate, compactionBytePerSecond)
}
@ -73,6 +76,9 @@ func (v *Volume) Compact2(preallocate int64, compactionBytePerSecond int64) erro
v.lastCompactIndexOffset = v.IndexFileSize()
v.lastCompactRevision = v.SuperBlock.CompactionRevision
glog.V(3).Infof("creating copies for volume %d ...", v.Id)
if err := v.DataBackend.Sync(); err != nil {
glog.V(0).Infof("compact2 fail to sync volume %d", v.Id)
}
return copyDataBasedOnIndexFile(filePath+".dat", filePath+".idx", filePath+".cpd", filePath+".cpx", v.SuperBlock, v.Version(), preallocate, compactionBytePerSecond)
}
@ -93,6 +99,9 @@ func (v *Volume) CommitCompact() error {
glog.V(3).Infof("Got volume %d committing lock...", v.Id)
v.nm.Close()
if v.DataBackend != nil {
if err := v.DataBackend.Sync(); err != nil {
glog.V(0).Infof("fail to sync volume %d", v.Id)
}
if err := v.DataBackend.Close(); err != nil {
glog.V(0).Infof("fail to close volume %d", v.Id)
}

Loading…
Cancel
Save