Ai
5 Star 6 Fork 4

zstackio/zstack-vyos

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
diskmon.go 1.31 KB
一键复制 编辑 原始数据 按行查看 历史
shixin.ruan 提交于 2024-07-08 14:31 +08:00 . [root]: use openeuler image for vpc
package utils
import (
"os"
"sync"
"syscall"
"time"
log "github.com/sirupsen/logrus"
)
var handlers = make([]func(error), 0)
func writeFile(fpath, content string) error {
defer os.Remove(fpath) // It's necessary.
fh, err := os.Create(fpath)
if err != nil {
return err
}
if _, err = fh.WriteString(content); err != nil {
fh.Close()
return err
}
return fh.Close()
}
func checkIoError(fpath string) error {
err := writeFile(fpath, time.Now().Format(time.RFC3339))
if err == nil {
return nil
}
// Only treat ENOSPC and EROFS as error
patherr, ok := err.(*os.PathError)
if ok && (patherr.Err == syscall.ENOSPC || patherr.Err == syscall.EROFS) {
return err
} else {
log.Debugf("disk error: %v", err)
}
return nil
}
func diskmon(fpath string, onFailure func(error), interval time.Duration) {
log.Debugf("start disk monitor: %s", fpath)
for {
if err := checkIoError(fpath); err != nil {
log.Debugf("disk error: %v", err)
for _, f := range handlers {
f(err)
}
onFailure(err)
}
log.Debugf("disk no error")
time.Sleep(interval)
}
}
func RegisterDiskFullHandler(f func(error)) {
handlers = append(handlers, f)
}
var once sync.Once
func StartDiskMon(fpath string, onFailure func(error), interval time.Duration) {
once.Do(func() {
go diskmon(fpath, onFailure, interval)
})
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zstackio/zstack-vyos.git
git@gitee.com:zstackio/zstack-vyos.git
zstackio
zstack-vyos
zstack-vyos
master

搜索帮助