diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-03-19 23:54:52 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-03-19 23:54:52 -0700 |
| commit | 81797a059acc5c601281a06ccc3c041815c7df74 (patch) | |
| tree | e5b0d0db9fd88ff2e2adef450c51832a30a45a94 | |
| parent | 709f231e23d2ad40e2094a906d50fefad31423be (diff) | |
| download | seaweedfs-81797a059acc5c601281a06ccc3c041815c7df74.tar.xz seaweedfs-81797a059acc5c601281a06ccc3c041815c7df74.zip | |
volume: sync volume file right before compaction
fix https://github.com/chrislusf/seaweedfs/issues/1237
| -rw-r--r-- | weed/storage/backend/backend.go | 1 | ||||
| -rw-r--r-- | weed/storage/backend/disk_file.go | 4 | ||||
| -rw-r--r-- | weed/storage/backend/memory_map/memory_map_backend.go | 4 | ||||
| -rw-r--r-- | weed/storage/backend/s3_backend/s3_backend.go | 4 | ||||
| -rw-r--r-- | weed/storage/volume_vacuum.go | 9 |
5 files changed, 22 insertions, 0 deletions
diff --git a/weed/storage/backend/backend.go b/weed/storage/backend/backend.go index 6941ca5a1..daab29621 100644 --- a/weed/storage/backend/backend.go +++ b/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 { diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go index c4b3caffb..2b04c8df2 100644 --- a/weed/storage/backend/disk_file.go +++ b/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() +} diff --git a/weed/storage/backend/memory_map/memory_map_backend.go b/weed/storage/backend/memory_map/memory_map_backend.go index 03e7308d0..44ef4d3e1 100644 --- a/weed/storage/backend/memory_map/memory_map_backend.go +++ b/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 +} diff --git a/weed/storage/backend/s3_backend/s3_backend.go b/weed/storage/backend/s3_backend/s3_backend.go index e08fef8a4..4706c9334 100644 --- a/weed/storage/backend/s3_backend/s3_backend.go +++ b/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 +} diff --git a/weed/storage/volume_vacuum.go b/weed/storage/volume_vacuum.go index 669d5dd6c..cec7badec 100644 --- a/weed/storage/volume_vacuum.go +++ b/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) } |
