v1.5.1 增强程序稳定性
This commit is contained in:
@@ -25,8 +25,10 @@ func (this *IPItemEncoder[T]) EncodeField(value T, fieldName string) ([]byte, er
|
||||
switch fieldName {
|
||||
case "expiresAt":
|
||||
var expiresAt = any(value).(*pb.IPItem).ExpiredAt
|
||||
if expiresAt < 0 || expiresAt > int64(math.MaxUint32) {
|
||||
if expiresAt < 0 {
|
||||
expiresAt = 0
|
||||
} else if expiresAt > int64(math.MaxUint32) {
|
||||
expiresAt = int64(math.MaxUint32)
|
||||
}
|
||||
var b = make([]byte, 4)
|
||||
binary.BigEndian.PutUint32(b, uint32(expiresAt))
|
||||
|
||||
94
EdgeNode/internal/iplibrary/ip_list_migrate.go
Normal file
94
EdgeNode/internal/iplibrary/ip_list_migrate.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||
"os"
|
||||
)
|
||||
|
||||
func MigrateSQLiteIPListToKV(sqlitePath string) error {
|
||||
_, err := os.Stat(sqlitePath)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
remotelogs.Println("IP_LIST_DB", "migrating sqlite data to kvstore ...")
|
||||
|
||||
src, err := NewSQLiteIPList()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = src.Close()
|
||||
}()
|
||||
|
||||
dst, err := NewKVIPList()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = dst.Close()
|
||||
}()
|
||||
|
||||
err = dst.ipTable.DB().Truncate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var offset int64
|
||||
const size int64 = 1000
|
||||
for {
|
||||
items, goNext, readErr := src.ReadItems(offset, size)
|
||||
if readErr != nil {
|
||||
return readErr
|
||||
}
|
||||
|
||||
for _, item := range items {
|
||||
addErr := dst.AddItem(item)
|
||||
if addErr != nil {
|
||||
return addErr
|
||||
}
|
||||
}
|
||||
|
||||
if !goNext {
|
||||
break
|
||||
}
|
||||
offset += size
|
||||
}
|
||||
|
||||
version, err := src.ReadMaxVersion()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if version > 0 {
|
||||
err = dst.UpdateMaxVersion(version)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = dst.Flush()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = removeSQLiteFiles(sqlitePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
remotelogs.Println("IP_LIST_DB", "migrated sqlite data to kvstore")
|
||||
return nil
|
||||
}
|
||||
|
||||
func removeSQLiteFiles(path string) error {
|
||||
for _, filename := range []string{path, path + "-shm", path + "-wal"} {
|
||||
err := os.Remove(filename)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -117,11 +117,16 @@ func (this *IPListManager) Init() {
|
||||
// 检查sqlite文件是否存在,以便决定使用sqlite还是kv
|
||||
var sqlitePath = Tea.Root + "/data/ip_list.db"
|
||||
_, sqliteErr := os.Stat(sqlitePath)
|
||||
|
||||
var db IPListDB
|
||||
var err error
|
||||
if sqliteErr == nil || !teaconst.EnableKVCacheStore {
|
||||
db, err = NewSQLiteIPList()
|
||||
if sqliteErr == nil {
|
||||
err = MigrateSQLiteIPListToKV(sqlitePath)
|
||||
if err != nil {
|
||||
remotelogs.Error("IP_LIST_MANAGER", "migrate sqlite data failed: "+err.Error())
|
||||
db, err = NewSQLiteIPList()
|
||||
} else {
|
||||
db, err = NewKVIPList()
|
||||
}
|
||||
} else {
|
||||
db, err = NewKVIPList()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user