Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit f2e68b4

Browse files
committed
chain: define "extractSpecificTimeKey"
Signed-off-by: Gyuho Lee <[email protected]>
1 parent d0cfc38 commit f2e68b4

File tree

2 files changed

+46
-14
lines changed

2 files changed

+46
-14
lines changed

chain/storage.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,6 @@ func PrefixValueKey(rprefix ids.ShortID, key []byte) (k []byte) {
9696
return k
9797
}
9898

99-
// [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawPrefix]
100-
func specificTimeKey(p byte, t int64, rprefix ids.ShortID) (k []byte) {
101-
k = make([]byte, 2+8+1+shortIDLen)
102-
k[0] = p
103-
k[1] = parser.Delimiter
104-
binary.LittleEndian.PutUint64(k[2:], uint64(t))
105-
k[2+8] = parser.Delimiter
106-
copy(k[2+8+1:], rprefix[:])
107-
return k
108-
}
109-
11099
// [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter]
111100
func RangeTimeKey(p byte, t int64) (k []byte) {
112101
k = make([]byte, 2+8+1)
@@ -127,6 +116,31 @@ func PrefixPruningKey(expired int64, rprefix ids.ShortID) (k []byte) {
127116
return specificTimeKey(pruningPrefix, expired, rprefix)
128117
}
129118

119+
const specificTimeKeyLen = 2 + 8 + 1 + shortIDLen
120+
121+
// [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawPrefix]
122+
func specificTimeKey(p byte, t int64, rprefix ids.ShortID) (k []byte) {
123+
k = make([]byte, specificTimeKeyLen)
124+
k[0] = p
125+
k[1] = parser.Delimiter
126+
binary.LittleEndian.PutUint64(k[2:], uint64(t))
127+
k[2+8] = parser.Delimiter
128+
copy(k[2+8+1:], rprefix[:])
129+
return k
130+
}
131+
132+
var ErrInvalidKeyFormat = errors.New("invalid key format")
133+
134+
// extracts expiry/pruning timstamp and raw prefix
135+
func extractSpecificTimeKey(k []byte) (timestamp int64, rprefix ids.ShortID, err error) {
136+
if len(k) != specificTimeKeyLen {
137+
return -1, ids.ShortEmpty, ErrInvalidKeyFormat
138+
}
139+
timestamp = int64(binary.LittleEndian.Uint64(k[2 : 2+8]))
140+
rprefix, err = ids.ToShortID(k[2+8+1:])
141+
return timestamp, rprefix, err
142+
}
143+
130144
func GetPrefixInfo(db database.KeyValueReader, prefix []byte) (*PrefixInfo, bool, error) {
131145
// TODO: add caching (will need some expiry when keys cleared)
132146
// [infoPrefix] + [delimiter] + [prefix]
@@ -215,8 +229,7 @@ func ExpireNext(db database.Database, parent int64, current int64) (err error) {
215229
if err := db.Delete(k); err != nil {
216230
return err
217231
}
218-
expired := int64(binary.LittleEndian.Uint64(curKey[2 : 2+8]))
219-
rpfx, err := ids.ToShortID(curKey[2+8+1:])
232+
expired, rpfx, err := extractSpecificTimeKey(curKey)
220233
if err != nil {
221234
return err
222235
}
@@ -246,7 +259,7 @@ func PruneNext(db database.Database, limit int) (err error) {
246259
if bytes.Compare(curKey, endKey) > 0 { // curKey > endKey; end search
247260
break
248261
}
249-
rpfx, err := ids.ToShortID(curKey[2+8+1:])
262+
_, rpfx, err := extractSpecificTimeKey(curKey)
250263
if err != nil {
251264
return err
252265
}

chain/storage_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,22 @@ func TestRange(t *testing.T) {
277277
}
278278
}
279279
}
280+
281+
func TestSpecificTimeKey(t *testing.T) {
282+
rpfx0 := ids.ShortID{'k'}
283+
k := PrefixExpiryKey(100, rpfx0)
284+
ts, rpfx, err := extractSpecificTimeKey(k)
285+
if err != nil {
286+
t.Fatal(err)
287+
}
288+
if ts != 100 {
289+
t.Fatalf("unexpected timestamp %d, expected 100", ts)
290+
}
291+
if rpfx != rpfx0 {
292+
t.Fatalf("unexpected rawPrefix %v, expected %v", rpfx, rpfx0)
293+
}
294+
295+
if _, _, err = extractSpecificTimeKey(k[:10]); !errors.Is(err, ErrInvalidKeyFormat) {
296+
t.Fatalf("unexpected error %v, expected %v", err, ErrInvalidKeyFormat)
297+
}
298+
}

0 commit comments

Comments
 (0)