mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-19 20:40:26 +08:00
优化缓存错误相关代码
This commit is contained in:
@@ -34,16 +34,14 @@ func CanIgnoreErr(err error) bool {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if err == ErrFileIsWriting ||
|
if errors.Is(err, ErrFileIsWriting) ||
|
||||||
err == ErrEntityTooLarge ||
|
errors.Is(err, ErrEntityTooLarge) ||
|
||||||
err == ErrWritingUnavailable ||
|
errors.Is(err, ErrWritingUnavailable) ||
|
||||||
err == ErrWritingQueueFull ||
|
errors.Is(err, ErrWritingQueueFull) ||
|
||||||
err == ErrServerIsBusy {
|
errors.Is(err, ErrServerIsBusy) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
_, ok := err.(*CapacityError)
|
|
||||||
if ok {
|
var capacityErr *CapacityError
|
||||||
return true
|
return errors.As(err, &capacityErr)
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,24 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
package caches
|
package caches_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/TeaOSLab/EdgeNode/internal/caches"
|
||||||
"github.com/iwind/TeaGo/assert"
|
"github.com/iwind/TeaGo/assert"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCanIgnoreErr(t *testing.T) {
|
func TestCanIgnoreErr(t *testing.T) {
|
||||||
a := assert.NewAssertion(t)
|
var a = assert.NewAssertion(t)
|
||||||
|
|
||||||
a.IsTrue(CanIgnoreErr(ErrFileIsWriting))
|
a.IsTrue(caches.CanIgnoreErr(caches.ErrFileIsWriting))
|
||||||
a.IsTrue(CanIgnoreErr(NewCapacityError("over capcity")))
|
a.IsTrue(caches.CanIgnoreErr(fmt.Errorf("error: %w", caches.ErrFileIsWriting)))
|
||||||
a.IsFalse(CanIgnoreErr(ErrNotFound))
|
a.IsTrue(errors.Is(fmt.Errorf("error: %w", caches.ErrFileIsWriting), caches.ErrFileIsWriting))
|
||||||
|
a.IsTrue(errors.Is(caches.ErrFileIsWriting, caches.ErrFileIsWriting))
|
||||||
|
a.IsTrue(caches.CanIgnoreErr(caches.NewCapacityError("over capacity")))
|
||||||
|
a.IsTrue(caches.CanIgnoreErr(fmt.Errorf("error: %w", caches.NewCapacityError("over capacity"))))
|
||||||
|
a.IsFalse(caches.CanIgnoreErr(caches.ErrNotFound))
|
||||||
|
a.IsFalse(caches.CanIgnoreErr(errors.New("test error")))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -464,7 +464,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
|
|||||||
_, ok := sharedWritingFileKeyMap[key]
|
_, ok := sharedWritingFileKeyMap[key]
|
||||||
if ok {
|
if ok {
|
||||||
sharedWritingFileKeyLocker.Unlock()
|
sharedWritingFileKeyLocker.Unlock()
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w(001)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !isFlushing && !fsutils.WriteReady() {
|
if !isFlushing && !fsutils.WriteReady() {
|
||||||
@@ -505,7 +505,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
|
|||||||
// 检查两次写入缓存的时间是否过于相近,分片内容不受此限制
|
// 检查两次写入缓存的时间是否过于相近,分片内容不受此限制
|
||||||
if err == nil && !isPartial && time.Since(stat.ModTime()) <= 1*time.Second {
|
if err == nil && !isPartial && time.Since(stat.ModTime()) <= 1*time.Second {
|
||||||
// 防止并发连续写入
|
// 防止并发连续写入
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w(002)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构造文件名
|
// 构造文件名
|
||||||
@@ -606,7 +606,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
|
|||||||
err = syscall.Flock(int(writer.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
err = syscall.Flock(int(writer.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
removeOnFailure = false
|
removeOnFailure = false
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w (003)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
|
|
||||||
var metaBodySize int64 = -1
|
var metaBodySize int64 = -1
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ func TestFileStorage_Concurrent_Open_DifferentFile(t *testing.T) {
|
|||||||
|
|
||||||
writer, err := storage.OpenWriter("abc"+strconv.Itoa(i), time.Now().Unix()+3600, 200, -1, -1, -1, false)
|
writer, err := storage.OpenWriter("abc"+strconv.Itoa(i), time.Now().Unix()+3600, 200, -1, -1, -1, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != ErrFileIsWriting {
|
if errors.Is(err, ErrFileIsWriting) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -289,7 +289,7 @@ func TestFileStorage_Concurrent_Open_SameFile(t *testing.T) {
|
|||||||
|
|
||||||
writer, err := storage.OpenWriter("abc"+strconv.Itoa(0), time.Now().Unix()+3600, 200, -1, -1, -1, false)
|
writer, err := storage.OpenWriter("abc"+strconv.Itoa(0), time.Now().Unix()+3600, 200, -1, -1, -1, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != ErrFileIsWriting {
|
if errors.Is(err, ErrFileIsWriting) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package caches
|
package caches
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
@@ -161,7 +162,7 @@ func (this *MemoryStorage) OpenWriter(key string, expiredAt int64, status int, h
|
|||||||
|
|
||||||
// TODO 内存缓存暂时不支持分块内容存储
|
// TODO 内存缓存暂时不支持分块内容存储
|
||||||
if isPartial {
|
if isPartial {
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w (004)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
return this.openWriter(key, expiredAt, status, headerSize, bodySize, maxSize, true)
|
return this.openWriter(key, expiredAt, status, headerSize, bodySize, maxSize, true)
|
||||||
}
|
}
|
||||||
@@ -187,7 +188,7 @@ func (this *MemoryStorage) openWriter(key string, expiresAt int64, status int, h
|
|||||||
var isWriting = false
|
var isWriting = false
|
||||||
_, ok := this.writingKeyMap[key]
|
_, ok := this.writingKeyMap[key]
|
||||||
if ok {
|
if ok {
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w (005)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
this.writingKeyMap[key] = zero.New()
|
this.writingKeyMap[key] = zero.New()
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -208,7 +209,7 @@ func (this *MemoryStorage) openWriter(key string, expiresAt int64, status int, h
|
|||||||
_ = this.list.Remove(hashString)
|
_ = this.list.Remove(hashString)
|
||||||
item = nil
|
item = nil
|
||||||
} else {
|
} else {
|
||||||
return nil, ErrFileIsWriting
|
return nil, fmt.Errorf("%w (006)", ErrFileIsWriting)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user