mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
fix(util): refactor audit log remove
Signed-off-by: NaturalSelect <huangzhibin1@oppo.com>
This commit is contained in:
parent
bc5dd77fbd
commit
605371c336
@ -19,7 +19,6 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
@ -33,6 +32,7 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/cubefs/cubefs/util/fileutil"
|
||||
"github.com/cubefs/cubefs/util/log"
|
||||
)
|
||||
|
||||
@ -569,35 +569,52 @@ func (a *Audit) newWriterSize(size int) error {
|
||||
}
|
||||
|
||||
func (a *Audit) removeLogFile() {
|
||||
fs := syscall.Statfs_t{}
|
||||
if err := syscall.Statfs(a.logDir, &fs); err != nil {
|
||||
log.LogErrorf("Get fs stat failed, err: %v", err)
|
||||
dentries, err := fileutil.ReadDir(a.logDir)
|
||||
if err != nil {
|
||||
log.LogErrorf("[removeLogFile] ReadDir failed, logDir: %s, err: %v", a.logDir, err)
|
||||
return
|
||||
}
|
||||
|
||||
oldLogs := make([]string, 0)
|
||||
for _, dentry := range dentries {
|
||||
if strings.HasPrefix(dentry, Audit_Module) && strings.HasSuffix(dentry, ShiftedExtension) {
|
||||
oldLogs = append(oldLogs, dentry)
|
||||
}
|
||||
}
|
||||
|
||||
if len(oldLogs) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
fs, err := fileutil.Statfs(a.logDir)
|
||||
if err != nil {
|
||||
log.LogErrorf("[removeLogFile] Get fs stat failed, err: %v", err)
|
||||
return
|
||||
}
|
||||
diskSpaceLeft := int64(fs.Bavail * uint64(fs.Bsize))
|
||||
diskSpaceLeft -= DefaultHeadRoom * 1024 * 1024
|
||||
|
||||
fInfos, err := ioutil.ReadDir(a.logDir)
|
||||
if err != nil {
|
||||
log.LogErrorf("ReadDir failed, logDir: %s, err: %v", a.logDir, err)
|
||||
return
|
||||
}
|
||||
var needDelFiles ShiftedFile
|
||||
for _, info := range fInfos {
|
||||
if a.shouldDelete(info, diskSpaceLeft, Audit_Module) {
|
||||
needDelFiles = append(needDelFiles, info)
|
||||
sort.Slice(oldLogs, func(i, j int) bool {
|
||||
return oldLogs[i] < oldLogs[j]
|
||||
})
|
||||
|
||||
for len(oldLogs) != 0 && diskSpaceLeft < DefaultHeadRoom*1024*1024 {
|
||||
oldestFile := path.Join(a.logDir, oldLogs[0])
|
||||
fileInfo, err := os.Stat(oldestFile)
|
||||
if err != nil {
|
||||
log.LogErrorf("[removeLogFile] failed to stat file(%v), err(%v)", oldestFile, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
sort.Sort(needDelFiles)
|
||||
for _, info := range needDelFiles {
|
||||
if err = os.Remove(path.Join(a.logDir, info.Name())); err != nil {
|
||||
log.LogErrorf("Remove log file failed, logFileName: %s, err: %v", info.Name(), err)
|
||||
continue
|
||||
if !a.shouldDelete(fileInfo, diskSpaceLeft, Audit_Module) {
|
||||
log.LogDebugf("[removeLogFile] cannot delete oldest file(%v)", oldestFile)
|
||||
return
|
||||
}
|
||||
diskSpaceLeft += info.Size()
|
||||
if diskSpaceLeft > 0 && time.Since(info.ModTime()) < MaxReservedDays {
|
||||
break
|
||||
if err = os.Remove(oldestFile); err != nil && !os.IsNotExist(err) {
|
||||
log.LogErrorf("[removeLogFile] failed to remove file(%v), err(%v)", oldestFile, err)
|
||||
return
|
||||
}
|
||||
oldLogs = oldLogs[1:]
|
||||
stat := fileutil.ConvertStat(fileInfo)
|
||||
diskSpaceLeft += stat.Blocks * fileutil.StatBlockSize
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -19,8 +19,6 @@ import (
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/cubefs/cubefs/util/log"
|
||||
)
|
||||
|
||||
type Object struct {
|
||||
@ -169,11 +167,9 @@ func (cp *ConnectPool) autoRelease() {
|
||||
pools = append(pools, pool)
|
||||
}
|
||||
cp.RUnlock()
|
||||
begin := time.Now()
|
||||
for _, pool := range pools {
|
||||
pool.autoRelease()
|
||||
}
|
||||
log.LogInfof("[autoRelease] release conn pool cnt(%v) using time(%v)", len(pools), time.Since(begin))
|
||||
timer.Reset(time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,15 +15,32 @@
|
||||
package fileutil
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
const StatBlockSize = 512
|
||||
|
||||
func Stat(name string) (stat *syscall.Stat_t, err error) {
|
||||
info, err := os.Stat(name)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
stat = ConvertStat(info)
|
||||
return
|
||||
}
|
||||
|
||||
func ConvertStat(info fs.FileInfo) (stat *syscall.Stat_t) {
|
||||
stat = info.Sys().(*syscall.Stat_t)
|
||||
return
|
||||
}
|
||||
|
||||
func GetFilePhysicalSize(name string) (size int64, err error) {
|
||||
stat, err := Stat(name)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
size = stat.Blocks * StatBlockSize
|
||||
return
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@ package fileutil_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
"github.com/cubefs/cubefs/util/fileutil"
|
||||
@ -30,3 +31,17 @@ func TestStat(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, 0, ino)
|
||||
}
|
||||
|
||||
const blkSize = 4096
|
||||
|
||||
func TestGetFilePhyscialSize(t *testing.T) {
|
||||
dir, err := os.MkdirTemp("", "")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(dir)
|
||||
tmpFile := path.Join(dir, "tmp")
|
||||
err = os.WriteFile(tmpFile, []byte("Hello World"), 0o755)
|
||||
require.NoError(t, err)
|
||||
size, err := fileutil.GetFilePhysicalSize(tmpFile)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, blkSize, size)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user