程序意外退出时关闭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

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

View File

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

View File

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

View File

@@ -3,8 +3,9 @@ package events
type Event = string type Event = string
const ( const (
EventStart Event = "start" // start loading EventStart Event = "start" // start loading
EventLoaded Event = "loaded" // first load EventLoaded Event = "loaded" // first load
EventQuit Event = "quit" // quit node gracefully EventQuit Event = "quit" // quit node gracefully
EventReload Event = "reload" // reload config EventReload Event = "reload" // reload config
EventTerminated Event = "terminated" // process terminated
) )

View File

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

View File

@@ -33,10 +33,12 @@ import (
"log" "log"
"os" "os"
"os/exec" "os/exec"
"os/signal"
"runtime" "runtime"
"runtime/debug" "runtime/debug"
"sort" "sort"
"sync" "sync"
"syscall"
"time" "time"
) )
@@ -96,6 +98,9 @@ func (this *Node) Start() {
// 处理异常 // 处理异常
this.handlePanic() this.handlePanic()
// 监听signal
this.listenSignals()
// 启动事件 // 启动事件
events.Notify(events.EventStart) events.Notify(events.EventStart)
@@ -593,6 +598,20 @@ func (this *Node) checkClusterConfig() error {
return nil 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 // 监听本地sock
func (this *Node) listenSock() error { func (this *Node) listenSock() error {
// 检查是否在运行 // 检查是否在运行

View File

@@ -5,6 +5,8 @@ package dbs
import ( import (
"context" "context"
"database/sql" "database/sql"
"fmt"
"github.com/TeaOSLab/EdgeNode/internal/events"
) )
type DB struct { type DB struct {
@@ -14,9 +16,15 @@ type DB struct {
} }
func NewDB(rawDB *sql.DB) *DB { func NewDB(rawDB *sql.DB) *DB {
return &DB{ var db = &DB{
rawDB: rawDB, rawDB: rawDB,
} }
events.OnKey(events.EventTerminated, fmt.Sprintf("db_%p", db), func() {
_ = rawDB.Close()
})
return db
} }
func (this *DB) EnableStat(b bool) { 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 { func (this *DB) Close() error {
events.Remove(fmt.Sprintf("db_%p", this))
return this.rawDB.Close() return this.rawDB.Close()
} }