feature: remove unsafe code in client/daemon/storage (#258)

Signed-off-by: Jim Ma <majinjing3@gmail.com>
This commit is contained in:
Jim Ma 2021-05-25 14:12:57 +08:00 committed by Gaius
parent a777c8882c
commit a033e5f5be
No known key found for this signature in database
GPG Key ID: 8B4E5D1290FA2FFB
3 changed files with 10 additions and 12 deletions

View File

@ -26,7 +26,6 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
"unsafe"
"d7y.io/dragonfly/v2/client/clientutil" "d7y.io/dragonfly/v2/client/clientutil"
"d7y.io/dragonfly/v2/pkg/dferrors" "d7y.io/dragonfly/v2/pkg/dferrors"
@ -47,14 +46,14 @@ type localTaskStore struct {
metadataFilePath string metadataFilePath string
expireTime time.Duration expireTime time.Duration
lastAccess *time.Time lastAccess int64
reclaimMarked bool reclaimMarked bool
gcCallback func(CommonTaskRequest) gcCallback func(CommonTaskRequest)
} }
func (t *localTaskStore) touch() { func (t *localTaskStore) touch() {
access := time.Now() access := time.Now().UnixNano()
atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(&t.lastAccess)), unsafe.Pointer(&access)) atomic.SwapInt64(&t.lastAccess, access)
} }
func (t *localTaskStore) WritePiece(ctx context.Context, req *WritePieceRequest) (int64, error) { func (t *localTaskStore) WritePiece(ctx context.Context, req *WritePieceRequest) (int64, error) {
@ -246,7 +245,8 @@ func (t *localTaskStore) GetPieces(ctx context.Context, req *base.PieceTaskReque
} }
func (t *localTaskStore) CanReclaim() bool { func (t *localTaskStore) CanReclaim() bool {
return t.lastAccess.Add(t.expireTime).Before(time.Now()) access := time.Unix(0, t.lastAccess)
return access.Add(t.expireTime).Before(time.Now())
} }
// MarkReclaim will try to invoke gcCallback (normal leave peer task) // MarkReclaim will try to invoke gcCallback (normal leave peer task)

View File

@ -164,8 +164,7 @@ func TestLocalTaskStore_PutAndGetPiece_Simple(t *testing.T) {
} }
// clean up test data // clean up test data
access := time.Now().Add(-1 * time.Hour) ts.(*localTaskStore).lastAccess = time.Now().Add(-1 * time.Hour).UnixNano()
ts.(*localTaskStore).lastAccess = &access
ok = ts.(Reclaimer).CanReclaim() ok = ts.(Reclaimer).CanReclaim()
assert.True(ok, "task should gc") assert.True(ok, "task should gc")
err = ts.(Reclaimer).Reclaim() err = ts.(Reclaimer).Reclaim()
@ -201,7 +200,7 @@ func TestLocalTaskStore_StoreTaskData_Simple(t *testing.T) {
RWMutex: &sync.RWMutex{}, RWMutex: &sync.RWMutex{},
dataDir: test.DataDir, dataDir: test.DataDir,
metadataFile: matadata, metadataFile: matadata,
lastAccess: &time.Time{}, lastAccess: time.Now().UnixNano(),
} }
err = ts.Store(context.Background(), &StoreRequest{ err = ts.Store(context.Background(), &StoreRequest{
CommonTaskRequest: CommonTaskRequest{ CommonTaskRequest: CommonTaskRequest{
@ -339,8 +338,7 @@ func TestLocalTaskStore_PutAndGetPiece_Advance(t *testing.T) {
} }
// clean up test data // clean up test data
access := time.Now().Add(-1 * time.Hour) ts.(*localTaskStore).lastAccess = time.Now().Add(-1 * time.Hour).UnixNano()
ts.(*localTaskStore).lastAccess = &access
ok = ts.(Reclaimer).CanReclaim() ok = ts.(Reclaimer).CanReclaim()
assert.True(ok, "task should gc") assert.True(ok, "task should gc")
err = ts.(Reclaimer).Reclaim() err = ts.(Reclaimer).Reclaim()

View File

@ -483,13 +483,13 @@ func (s *storageManager) TryGC() (bool, error) {
return true return true
}) })
sort.SliceStable(tasks, func(i, j int) bool { sort.SliceStable(tasks, func(i, j int) bool {
return tasks[i].lastAccess.Before(*tasks[j].lastAccess) return tasks[i].lastAccess < tasks[j].lastAccess
}) })
for _, task := range tasks { for _, task := range tasks {
task.MarkReclaim() task.MarkReclaim()
markedTasks = append(markedTasks, PeerTaskMetaData{task.PeerID, task.TaskID}) markedTasks = append(markedTasks, PeerTaskMetaData{task.PeerID, task.TaskID})
logger.Infof("quota threshold reached, mark task %s/%s reclaimed, last access: %s, size: %s", logger.Infof("quota threshold reached, mark task %s/%s reclaimed, last access: %s, size: %s",
task.TaskID, task.PeerID, task.lastAccess.Format(time.RFC3339Nano), task.TaskID, task.PeerID, time.Unix(0, task.lastAccess).Format(time.RFC3339Nano),
units.BytesSize(float64(task.ContentLength))) units.BytesSize(float64(task.ContentLength)))
totalNotMarkedSize -= task.ContentLength totalNotMarkedSize -= task.ContentLength
if totalNotMarkedSize < int64(s.storeOption.DiskGCThreshold) { if totalNotMarkedSize < int64(s.storeOption.DiskGCThreshold) {