Skip to content

Commit 71c7ae9

Browse files
weiihannpnowosie
andauthored
Fix upper bound issue in CalculatePrefixSize (#2223)
* check for unknown KV, fix upper bound bug * minor chore * remove upperbound option * Revert "remove upperbound option" This reverts commit e4b412b. * Update db/pebble/db.go Co-authored-by: Pawel Nowosielski <[email protected]> Signed-off-by: Ng Wei Han <[email protected]> * fix --------- Signed-off-by: Ng Wei Han <[email protected]> Co-authored-by: Pawel Nowosielski <[email protected]>
1 parent c4d10f9 commit 71c7ae9

File tree

3 files changed

+45
-9
lines changed

3 files changed

+45
-9
lines changed

cmd/juno/dbcmd.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,10 @@ func dbSize(cmd *cobra.Command, args []string) error {
204204
items [][]string
205205
)
206206

207-
for _, b := range db.BucketValues() {
207+
buckets := db.BucketValues()
208+
for _, b := range buckets {
208209
fmt.Fprintf(cmd.OutOrStdout(), "Calculating size of %s, remaining buckets: %d\n", b, len(db.BucketValues())-int(b)-1)
209-
bucketItem, err := pebble.CalculatePrefixSize(cmd.Context(), pebbleDB.(*pebble.DB), []byte{byte(b)})
210+
bucketItem, err := pebble.CalculatePrefixSize(cmd.Context(), pebbleDB.(*pebble.DB), []byte{byte(b)}, true)
210211
if err != nil {
211212
return err
212213
}
@@ -229,6 +230,20 @@ func dbSize(cmd *cobra.Command, args []string) error {
229230
}
230231
}
231232

233+
// check if there is any data left in the db
234+
lastBucket := buckets[len(buckets)-1]
235+
fmt.Fprintln(cmd.OutOrStdout(), "Calculating remaining data in the db")
236+
lastBucketItem, err := pebble.CalculatePrefixSize(cmd.Context(), pebbleDB.(*pebble.DB), []byte{byte(lastBucket + 1)}, false)
237+
if err != nil {
238+
return err
239+
}
240+
241+
if lastBucketItem.Count > 0 {
242+
items = append(items, []string{"Unknown", lastBucketItem.Size.String(), fmt.Sprintf("%d", lastBucketItem.Count)})
243+
totalSize += lastBucketItem.Size
244+
totalCount += lastBucketItem.Count
245+
}
246+
232247
table := tablewriter.NewWriter(os.Stdout)
233248
table.SetHeader([]string{"Bucket", "Size", "Count"})
234249
table.AppendBulk(items)

db/pebble/db.go

+24-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
// minCache is the minimum amount of memory in megabytes to allocate to pebble read and write caching.
1818
// This is also pebble's default value.
1919
minCacheSizeMB = 8
20+
maxByte = ^byte(0)
2021
)
2122

2223
var (
@@ -128,17 +129,21 @@ func (i *Item) add(size utils.DataSize) {
128129
i.Size += size
129130
}
130131

131-
func CalculatePrefixSize(ctx context.Context, pDB *DB, prefix []byte) (*Item, error) {
132+
func CalculatePrefixSize(ctx context.Context, pDB *DB, prefix []byte, withUpperBound bool) (*Item, error) {
132133
var (
133134
err error
134135
v []byte
135136

136137
item = &Item{}
137138
)
138139

139-
const upperBoundofPrefix = 0xff
140140
pebbleDB := pDB.Impl().(*pebble.DB)
141-
it, err := pebbleDB.NewIter(&pebble.IterOptions{LowerBound: prefix, UpperBound: append(prefix, upperBoundofPrefix)})
141+
iterOpt := &pebble.IterOptions{LowerBound: prefix}
142+
if withUpperBound {
143+
iterOpt.UpperBound = upperBound(prefix)
144+
}
145+
146+
it, err := pebbleDB.NewIter(iterOpt)
142147
if err != nil {
143148
// No need to call utils.RunAndWrapOnError() since iterator couldn't be created
144149
return nil, err
@@ -158,3 +163,19 @@ func CalculatePrefixSize(ctx context.Context, pDB *DB, prefix []byte) (*Item, er
158163

159164
return item, utils.RunAndWrapOnError(it.Close, err)
160165
}
166+
167+
func upperBound(prefix []byte) []byte {
168+
var ub []byte
169+
170+
for i := len(prefix) - 1; i >= 0; i-- {
171+
if prefix[i] == maxByte {
172+
continue
173+
}
174+
ub = make([]byte, i+1)
175+
copy(ub, prefix)
176+
ub[i]++
177+
return ub
178+
}
179+
180+
return nil
181+
}

db/pebble/db_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ func TestCalculatePrefixSize(t *testing.T) {
424424
t.Run("empty db", func(t *testing.T) {
425425
testDB := pebble.NewMemTest(t).(*pebble.DB)
426426

427-
s, err := pebble.CalculatePrefixSize(context.Background(), testDB, []byte("0"))
427+
s, err := pebble.CalculatePrefixSize(context.Background(), testDB, []byte("0"), true)
428428
require.NoError(t, err)
429429
assert.Zero(t, s.Count)
430430
assert.Zero(t, s.Size)
@@ -435,7 +435,7 @@ func TestCalculatePrefixSize(t *testing.T) {
435435
require.NoError(t, testDB.Update(func(txn db.Transaction) error {
436436
return txn.Set(append([]byte("0"), []byte("randomKey")...), []byte("someValue"))
437437
}))
438-
s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), []byte("1"))
438+
s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), []byte("1"), true)
439439
require.NoError(t, err)
440440
assert.Zero(t, s.Count)
441441
assert.Zero(t, s.Size)
@@ -455,7 +455,7 @@ func TestCalculatePrefixSize(t *testing.T) {
455455
return txn.Set(k3, v3)
456456
}))
457457

458-
s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), p)
458+
s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), p, true)
459459
require.NoError(t, err)
460460
assert.Equal(t, uint(3), s.Count)
461461
assert.Equal(t, utils.DataSize(expectedSize), s.Size)
@@ -464,7 +464,7 @@ func TestCalculatePrefixSize(t *testing.T) {
464464
ctx, cancel := context.WithCancel(context.Background())
465465
cancel()
466466

467-
s, err := pebble.CalculatePrefixSize(ctx, testDB.(*pebble.DB), p)
467+
s, err := pebble.CalculatePrefixSize(ctx, testDB.(*pebble.DB), p, true)
468468
assert.EqualError(t, err, context.Canceled.Error())
469469
assert.Zero(t, s.Count)
470470
assert.Zero(t, s.Size)

0 commit comments

Comments
 (0)