mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-19 04:50:54 +02:00
fix(chunk_cache): close data/index files on initialization error (#10057)
* fix(chunk_cache): close data/index files on initialization error * chunk_cache: assign outer err on the .dat open path The error-path defer keys off the function-level err, but the .dat OpenFile used := and shadowed it, so that path relied on nothing being open yet rather than the cleanup invariant. Assign the outer err so every error return is uniform. * chunk_cache: verify descriptor closure on POSIX, not just Windows os.Remove succeeds on open files on Linux/macOS, so the removal check only proved closure on Windows. Compare the open-fd count before and after the failed load; gate the removal check to Windows. --------- Co-authored-by: Contributor <contributor@example.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
co-authored by
Contributor
Chris Lu
parent
1e2412e502
commit
faa8c3963b
@@ -37,6 +37,18 @@ func LoadOrCreateChunkCacheVolume(fileName string, preallocate int64) (*ChunkCac
|
||||
}
|
||||
|
||||
var err error
|
||||
var indexFile *os.File
|
||||
|
||||
defer func() {
|
||||
if err != nil {
|
||||
if v.DataBackend != nil {
|
||||
v.DataBackend.Close()
|
||||
}
|
||||
if indexFile != nil {
|
||||
indexFile.Close()
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
if exists, canRead, canWrite, modTime, fileSize := util.CheckFile(v.fileName + ".dat"); exists {
|
||||
if !canRead {
|
||||
@@ -45,13 +57,13 @@ func LoadOrCreateChunkCacheVolume(fileName string, preallocate int64) (*ChunkCac
|
||||
if !canWrite {
|
||||
return nil, fmt.Errorf("cannot write cache file %s.dat", v.fileName)
|
||||
}
|
||||
if dataFile, err := os.OpenFile(v.fileName+".dat", os.O_RDWR|os.O_CREATE, 0644); err != nil {
|
||||
var dataFile *os.File
|
||||
if dataFile, err = os.OpenFile(v.fileName+".dat", os.O_RDWR|os.O_CREATE, 0644); err != nil {
|
||||
return nil, fmt.Errorf("cannot create cache file %s.dat: %v", v.fileName, err)
|
||||
} else {
|
||||
v.DataBackend = backend.NewDiskFile(dataFile)
|
||||
v.lastModTime = modTime
|
||||
v.fileSize = fileSize
|
||||
}
|
||||
v.DataBackend = backend.NewDiskFile(dataFile)
|
||||
v.lastModTime = modTime
|
||||
v.fileSize = fileSize
|
||||
} else {
|
||||
if v.DataBackend, err = backend.CreateVolumeFile(v.fileName+".dat", preallocate, 0); err != nil {
|
||||
return nil, fmt.Errorf("cannot create cache file %s.dat: %v", v.fileName, err)
|
||||
@@ -59,7 +71,6 @@ func LoadOrCreateChunkCacheVolume(fileName string, preallocate int64) (*ChunkCac
|
||||
v.lastModTime = time.Now()
|
||||
}
|
||||
|
||||
var indexFile *os.File
|
||||
if indexFile, err = os.OpenFile(v.fileName+".idx", os.O_RDWR|os.O_CREATE, 0644); err != nil {
|
||||
return nil, fmt.Errorf("cannot write cache index %s.idx: %v", v.fileName, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user