From d0b86af4ef35a2fdf8b1ce92d22d1f1811499590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Mon, 14 Mar 2022 11:47:34 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=84=8F=E5=A4=96=E9=80=80?= =?UTF-8?q?=E5=87=BA=E6=97=B6=E5=85=B3=E9=97=ADsqlite=E6=8C=87=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/caches/errors.go | 11 ++++++----- internal/caches/storage_file.go | 21 +++++++++++++++++++++ internal/const/vars.go | 5 ++--- internal/events/events.go | 9 +++++---- internal/events/utils.go | 9 +++++++++ internal/nodes/node.go | 19 +++++++++++++++++++ internal/utils/dbs/db.go | 11 ++++++++++- 7 files changed, 72 insertions(+), 13 deletions(-) diff --git a/internal/caches/errors.go b/internal/caches/errors.go index 41f9c26..82363a3 100644 --- a/internal/caches/errors.go +++ b/internal/caches/errors.go @@ -6,10 +6,11 @@ import "errors" // 常用的几个错误 var ( - ErrNotFound = errors.New("cache not found") - ErrFileIsWriting = errors.New("the file is writing") - ErrInvalidRange = errors.New("invalid range") - ErrEntityTooLarge = errors.New("entity too large") + ErrNotFound = errors.New("cache not found") + 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) diff --git a/internal/caches/storage_file.go b/internal/caches/storage_file.go index 8b4ac60..60d279d 100644 --- a/internal/caches/storage_file.go +++ b/internal/caches/storage_file.go @@ -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() diff --git a/internal/const/vars.go b/internal/const/vars.go index bee5a9e..8f7a3d0 100644 --- a/internal/const/vars.go +++ b/internal/const/vars.go @@ -15,7 +15,6 @@ var ( GlobalProductName = nodeconfigs.DefaultProductName - // Track - - EnableDBStat = false + IsQuiting = false // 是否正在退出 + EnableDBStat = false // 是否开启本地数据库统计 ) diff --git a/internal/events/events.go b/internal/events/events.go index 166b027..0257ce3 100644 --- a/internal/events/events.go +++ b/internal/events/events.go @@ -3,8 +3,9 @@ package events type Event = string const ( - EventStart Event = "start" // start loading - EventLoaded Event = "loaded" // first load - EventQuit Event = "quit" // quit node gracefully - EventReload Event = "reload" // reload config + EventStart Event = "start" // start loading + EventLoaded Event = "loaded" // first load + EventQuit Event = "quit" // quit node gracefully + EventReload Event = "reload" // reload config + EventTerminated Event = "terminated" // process terminated ) diff --git a/internal/events/utils.go b/internal/events/utils.go index 45e2bd2..e0256a2 100644 --- a/internal/events/utils.go +++ b/internal/events/utils.go @@ -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() diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 487b136..58ebbcf 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -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 { // 检查是否在运行 diff --git a/internal/utils/dbs/db.go b/internal/utils/dbs/db.go index e7b6701..fed50cc 100644 --- a/internal/utils/dbs/db.go +++ b/internal/utils/dbs/db.go @@ -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() }