Skip to content

Commit 011850e

Browse files
authored
Merge pull request #152 from anyproto/GO-5827-mark-space-as-deleted
GO-5827 mark space deletion
2 parents 276b9ac + a25c14c commit 011850e

File tree

8 files changed

+85
-6
lines changed

8 files changed

+85
-6
lines changed

deletelog/deletelog.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,18 @@ func (d *deleteLog) checkLog(ctx context.Context) (err error) {
8282
var ok bool
8383
for _, rec := range recs {
8484
if rec.Status == coordinatorproto.DeletionLogRecordStatus_Remove && rec.FileGroup != "" {
85-
ok, err = d.index.SpaceDelete(ctx, index.Key{
85+
key := index.Key{
8686
GroupId: rec.FileGroup,
8787
SpaceId: rec.SpaceId,
88-
})
89-
if err != nil && !errors.Is(err, redis.Nil) {
88+
}
89+
ok, err = d.index.SpaceDelete(ctx, key)
90+
if err != nil && !errors.Is(err, redis.Nil) && !errors.Is(err, index.ErrSpaceIsDeleted) {
9091
return
9192
}
9293
handledCount++
94+
if _, err = d.index.MarkSpaceAsDeleted(ctx, key); err != nil {
95+
return
96+
}
9397
if ok {
9498
deletedCount++
9599
}

deletelog/deletelog_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@ func TestDeleteLog_checkLog(t *testing.T) {
4747
FileGroup: "f2",
4848
},
4949
}, nil)
50-
fx.index.EXPECT().SpaceDelete(ctx, index.Key{
50+
key := index.Key{
5151
GroupId: "f2",
5252
SpaceId: "s2",
53-
})
53+
}
54+
fx.index.EXPECT().SpaceDelete(ctx, key)
55+
fx.index.EXPECT().MarkSpaceAsDeleted(ctx, key)
5456
require.NoError(t, fx.checkLog(ctx))
5557
lastId, err := fx.redis.Get(ctx, lastKey).Result()
5658
require.NoError(t, err)

etc/any-sync-filenode.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,4 @@ network:
6969
networkStorePath: .
7070
networkUpdateIntervalSec: 600
7171
defaultLimit: 1073741824
72+
persistTtl: 300

index/delete.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,18 @@ func (ri *redisIndex) spaceDelete(ctx context.Context, key Key, entry groupSpace
5858
}
5959
return true, nil
6060
}
61+
62+
func (ri *redisIndex) MarkSpaceAsDeleted(ctx context.Context, key Key) (ok bool, err error) {
63+
exists, release, err := ri.AcquireKey(ctx, DelKey(key))
64+
if err != nil {
65+
return
66+
}
67+
defer release()
68+
if !exists {
69+
if err = ri.cl.Set(ctx, DelKey(key), 1, 0).Err(); err != nil {
70+
return
71+
}
72+
return true, nil
73+
}
74+
return false, nil
75+
}

index/delete_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,15 @@ func TestRedisIndex_SpaceDelete(t *testing.T) {
6464
require.NoError(t, err)
6565
assert.False(t, ok)
6666
}
67+
68+
func TestRedisIndex_MarkSpaceAsDeleted(t *testing.T) {
69+
fx := newFixture(t)
70+
defer fx.Finish(t)
71+
key := newRandKey()
72+
ok, err := fx.MarkSpaceAsDeleted(ctx, key)
73+
require.NoError(t, err)
74+
assert.True(t, ok)
75+
76+
err = fx.FileBind(ctx, key, "file", &CidEntries{})
77+
assert.ErrorIs(t, err, ErrSpaceIsDeleted)
78+
}

index/index.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ const CName = "filenode.index"
2929
var log = logger.NewNamed(CName)
3030

3131
var (
32-
ErrCidsNotExist = errors.New("cids not exist")
32+
ErrCidsNotExist = errors.New("cids not exist")
33+
ErrSpaceIsDeleted = errors.New("space is deleted")
3334
)
3435

3536
type Index interface {
@@ -63,6 +64,7 @@ type Index interface {
6364
Check(ctx context.Context, key Key, doFix bool) (checkResults []CheckResult, err error)
6465

6566
SpaceDelete(ctx context.Context, key Key) (ok bool, err error)
67+
MarkSpaceAsDeleted(ctx context.Context, key Key) (ok bool, err error)
6668
app.ComponentRunnable
6769
}
6870

@@ -297,4 +299,9 @@ func FileKey(fileId string) string {
297299
return "f:" + fileId
298300
}
299301

302+
func DelKey(k Key) string {
303+
hash := strconv.FormatUint(uint64(xxhash.ChecksumString32(k.GroupId)), 36)
304+
return "d:" + k.SpaceId + ".{" + hash + "}"
305+
}
306+
300307
const infoKey = "info"

index/loader.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,29 @@ func (ri *redisIndex) AcquireSpace(ctx context.Context, key Key) (entry groupSpa
8686
return
8787
}
8888

89+
if !sExists {
90+
// check if space marked as deleted
91+
var (
92+
delKey = DelKey(key)
93+
delRelease func()
94+
delExists bool
95+
)
96+
if delExists, delRelease, err = ri.AcquireKey(ctx, delKey); err != nil {
97+
gRelease()
98+
sRelease()
99+
return
100+
}
101+
if delExists {
102+
gRelease()
103+
sRelease()
104+
delRelease()
105+
err = ErrSpaceIsDeleted
106+
return
107+
} else {
108+
delRelease()
109+
}
110+
}
111+
89112
if entry.space, err = ri.getSpaceEntry(ctx, key); err != nil {
90113
gRelease()
91114
sRelease()

index/mock_index/mock_index.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)