Delete internal/storage/fsync.go
This commit is contained in:
@@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2026 Safronov Grigorii
|
|
||||||
*
|
|
||||||
* Licensed under the CDDL, Version 1.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
*
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* https://opensource.org/licenses/CDDL-1.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Файл: internal/storage/fsync.go
|
|
||||||
// Назначение: Реальная синхронизация с диском (fsync) для WAL
|
|
||||||
|
|
||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"syscall"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RealFsync выполняет реальный fsync на файле
|
|
||||||
func RealFsync(file *os.File) error {
|
|
||||||
if file == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Вызываем системный fsync
|
|
||||||
return file.Sync()
|
|
||||||
}
|
|
||||||
|
|
||||||
// RealFsyncWithRetry выполняет fsync с повторными попытками
|
|
||||||
func RealFsyncWithRetry(file *os.File, maxRetries int, retryDelay time.Duration) error {
|
|
||||||
if file == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var lastErr error
|
|
||||||
for i := 0; i < maxRetries; i++ {
|
|
||||||
if err := RealFsync(file); err != nil {
|
|
||||||
lastErr = err
|
|
||||||
if i < maxRetries-1 {
|
|
||||||
time.Sleep(retryDelay)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return fmt.Errorf("fsync failed after %d attempts: %v", maxRetries, lastErr)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
// FsyncDir синхронизирует директорию (для гарантии, что создание файла записано на диск)
|
|
||||||
func FsyncDir(dirPath string) error {
|
|
||||||
dir, err := os.Open(dirPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer dir.Close()
|
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
// На Windows нет прямой поддержки fsync для директорий
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return dir.Sync()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FsyncDataOnly выполняет fsync только для данных (не метаданных)
|
|
||||||
func FsyncDataOnly(file *os.File) error {
|
|
||||||
if file == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fd := int(file.Fd())
|
|
||||||
_, _, err := syscall.Syscall(syscall.SYS_FSYNC, uintptr(fd), 0, 0)
|
|
||||||
if err != 0 {
|
|
||||||
return fmt.Errorf("fsync failed: %v", err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user