-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcrdt_ttl_test.go
More file actions
102 lines (86 loc) · 2.78 KB
/
Copy pathcrdt_ttl_test.go
File metadata and controls
102 lines (86 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package bmdb
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
// Test that CRDT replay does not resurrect keys that were already expired on disk
// when the DB is reopened. This mirrors the regression we fixed earlier.
func TestCRDTReplayDoesNotResurrectExpired(t *testing.T) {
opts := DefaultOptions
// enable debug logs to observe replay logging
opts.DebugLogs = true
runBMDBTest(t, &opts, func(t *testing.T, db *DB) {
bucket := "bucket-crdt"
txCreateBucket(t, db, DataStructureBTree, bucket, nil)
// key0 expires quickly; key1 persists
txPut(t, db, bucket, GetTestBytes(0), GetTestBytes(0), 1, nil, nil)
txPut(t, db, bucket, GetTestBytes(1), GetTestBytes(1), Persistent, nil, nil)
// ensure key0 expires
waitFor(t, func() bool {
err := db.View(func(tx *Tx) error {
_, err := tx.Get(bucket, GetTestBytes(0))
return err
})
return err == ErrKeyNotFound
}, 2*time.Second)
require.NoError(t, db.Close())
// reopen and ensure key0 is not resurrected by CRDT
var reopened *DB
waitFor(t, func() bool {
d, err := Open(opts)
if err != nil {
return false
}
err = d.View(func(tx *Tx) error {
_, err := tx.Get(bucket, GetTestBytes(0))
return err
})
if err == ErrKeyNotFound {
reopened = d
return true
}
_ = d.Close()
return false
}, 5*time.Second)
require.NotNil(t, reopened)
db = reopened
// key1 should still be present
txGet(t, db, bucket, GetTestBytes(1), GetTestBytes(1), nil)
})
}
// Basic CRDT/TTL interplay test ensuring CRDT replay does not conflict with
// TTL-driven deletes on open.
func TestCRDTAndTTLInterplay(t *testing.T) {
opts := DefaultOptions
opts.DebugLogs = true
runBMDBTest(t, &opts, func(t *testing.T, db *DB) {
bucket := "bucket-crdt-ttl"
txCreateBucket(t, db, DataStructureBTree, bucket, nil)
// Add several keys with different TTLs
txPut(t, db, bucket, GetTestBytes(0), GetTestBytes(0), 1, nil, nil)
txPut(t, db, bucket, GetTestBytes(1), GetTestBytes(1), 3, nil, nil)
txPut(t, db, bucket, GetTestBytes(2), GetTestBytes(2), Persistent, nil, nil)
// wait for key0 to expire but key1 still exists
waitFor(t, func() bool {
var got0, got1 error
_ = db.View(func(tx *Tx) error {
_, got0 = tx.Get(bucket, GetTestBytes(0))
return nil
})
_ = db.View(func(tx *Tx) error {
_, got1 = tx.Get(bucket, GetTestBytes(1))
return nil
})
return got0 == ErrKeyNotFound && got1 == nil
}, 3*time.Second)
// Close and reopen; ensure behavior persists and no resurrection
require.NoError(t, db.Close())
d2, err := Open(opts)
require.NoError(t, err)
defer d2.Close()
// key0 should still be gone; key1 may expire later
txGet(t, d2, bucket, GetTestBytes(0), nil, ErrKeyNotFound)
txGet(t, d2, bucket, GetTestBytes(2), GetTestBytes(2), nil)
})
}