程序意外退出时关闭sqlite指针

This commit is contained in:
刘祥超
2022-03-14 11:47:34 +08:00
parent ce87fa25e7
commit d0b86af4ef
7 changed files with 72 additions and 13 deletions

View File

@@ -10,6 +10,7 @@ var (
ErrFileIsWriting = errors.New("the file is writing")
ErrInvalidRange = errors.New("invalid range")
ErrEntityTooLarge = errors.New("entity too large")
ErrWritingUnavaible = errors.New("writing unavailable")
)
// CapacityError 容量错误
@@ -31,7 +32,7 @@ func CanIgnoreErr(err error) bool {
if err == nil {
return true
}
if err == ErrFileIsWriting || err == ErrEntityTooLarge {
if err == ErrFileIsWriting || err == ErrEntityTooLarge || err == ErrWritingUnavaible {
return true
}
_, ok := err.(*CapacityError)

View File

@@ -7,6 +7,7 @@ import (
"fmt"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
"github.com/TeaOSLab/EdgeNode/internal/events"
"github.com/TeaOSLab/EdgeNode/internal/goman"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
@@ -314,6 +315,11 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool,
// OpenWriter 打开缓存文件等待写入
func (this *FileStorage) OpenWriter(key string, expiredAt int64, status int, size int64, maxSize int64, isPartial bool) (Writer, error) {
// 是否正在退出
if teaconst.IsQuiting {
return nil, ErrWritingUnavaible
}
// 是否已忽略
if this.ignoreKeys.Has(key) {
return nil, ErrEntityTooLarge
@@ -525,6 +531,11 @@ func (this *FileStorage) OpenWriter(key string, expiredAt int64, status int, siz
// AddToList 添加到List
func (this *FileStorage) AddToList(item *Item) {
// 是否正在退出
if teaconst.IsQuiting {
return
}
if this.memoryStorage != nil {
if item.Type == ItemTypeMemory {
this.memoryStorage.AddToList(item)
@@ -542,6 +553,11 @@ func (this *FileStorage) AddToList(item *Item) {
// Delete 删除某个键值对应的缓存
func (this *FileStorage) Delete(key string) error {
// 是否正在退出
if teaconst.IsQuiting {
return nil
}
this.locker.Lock()
defer this.locker.Unlock()
@@ -646,6 +662,11 @@ func (this *FileStorage) CleanAll() error {
// Purge 清理过期的缓存
func (this *FileStorage) Purge(keys []string, urlType string) error {
// 是否正在退出
if teaconst.IsQuiting {
return nil
}
this.locker.Lock()
defer this.locker.Unlock()

View File

@@ -15,7 +15,6 @@ var (
GlobalProductName = nodeconfigs.DefaultProductName
// Track
EnableDBStat = false
IsQuiting = false // 是否正在退出
EnableDBStat = false // 是否开启本地数据库统计
)

View File

@@ -7,4 +7,5 @@ const (
EventLoaded Event = "loaded" // first load
EventQuit Event = "quit" // quit node gracefully
EventReload Event = "reload" // reload config
EventTerminated Event = "terminated" // process terminated
)

View File

@@ -1,6 +1,7 @@
package events
import (
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
"sync"
)
@@ -59,6 +60,14 @@ func Remove(key interface{}) {
// Notify 通知事件
func Notify(event Event) {
// 特殊事件
switch event {
case EventQuit:
teaconst.IsQuiting = true
case EventTerminated:
teaconst.IsQuiting = true
}
locker.Lock()
m := eventsMap[event]
locker.Unlock()

View File

@@ -33,10 +33,12 @@ import (
"log"
"os"
"os/exec"
"os/signal"
"runtime"
"runtime/debug"
"sort"
"sync"
"syscall"
"time"
)
@@ -96,6 +98,9 @@ func (this *Node) Start() {
// 处理异常
this.handlePanic()
// 监听signal
this.listenSignals()
// 启动事件
events.Notify(events.EventStart)
@@ -593,6 +598,20 @@ func (this *Node) checkClusterConfig() error {
return nil
}
// 监听一些信号
func (this *Node) listenSignals() {
var queue = make(chan os.Signal, 8)
signal.Notify(queue, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL, syscall.SIGQUIT)
goman.New(func() {
for range queue {
events.Notify(events.EventTerminated)
time.Sleep(100 * time.Millisecond)
os.Exit(0)
return
}
})
}
// 监听本地sock
func (this *Node) listenSock() error {
// 检查是否在运行

View File

@@ -5,6 +5,8 @@ package dbs
import (
"context"
"database/sql"
"fmt"
"github.com/TeaOSLab/EdgeNode/internal/events"
)
type DB struct {
@@ -14,9 +16,15 @@ type DB struct {
}
func NewDB(rawDB *sql.DB) *DB {
return &DB{
var db = &DB{
rawDB: rawDB,
}
events.OnKey(events.EventTerminated, fmt.Sprintf("db_%p", db), func() {
_ = rawDB.Close()
})
return db
}
func (this *DB) EnableStat(b bool) {
@@ -65,5 +73,6 @@ func (this *DB) QueryRow(query string, args ...interface{}) *sql.Row {
}
func (this *DB) Close() error {
events.Remove(fmt.Sprintf("db_%p", this))
return this.rawDB.Close()
}