2020-10-06 18:41:41 -07:00
|
|
|
/*
|
2025-12-10 17:11:18 -05:00
|
|
|
* SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc.
|
2025-02-05 17:00:32 -05:00
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
2020-10-06 18:41:41 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package badger
|
|
|
|
|
|
|
|
|
|
import (
|
2023-02-21 08:06:07 +05:30
|
|
|
"os"
|
2020-10-06 18:41:41 -07:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestDiscardStats(t *testing.T) {
|
2023-02-21 08:06:07 +05:30
|
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
2020-10-06 18:41:41 -07:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer removeDir(dir)
|
|
|
|
|
|
|
|
|
|
opt := DefaultOptions(dir)
|
2021-02-04 18:38:20 -08:00
|
|
|
ds, err := InitDiscardStats(opt)
|
2020-10-06 18:41:41 -07:00
|
|
|
require.NoError(t, err)
|
2020-10-15 14:54:37 +05:30
|
|
|
require.Zero(t, ds.nextEmptySlot)
|
|
|
|
|
fid, _ := ds.MaxDiscard()
|
|
|
|
|
require.Zero(t, fid)
|
|
|
|
|
|
2020-10-06 18:41:41 -07:00
|
|
|
for i := uint32(0); i < 20; i++ {
|
|
|
|
|
require.Equal(t, int64(i*100), ds.Update(i, int64(i*100)))
|
|
|
|
|
}
|
2021-02-04 18:38:20 -08:00
|
|
|
ds.Iterate(func(id, val uint64) {
|
2020-10-06 18:41:41 -07:00
|
|
|
require.Equal(t, id*100, val)
|
|
|
|
|
})
|
|
|
|
|
for i := uint32(0); i < 10; i++ {
|
|
|
|
|
require.Equal(t, 0, int(ds.Update(i, -1)))
|
|
|
|
|
}
|
2021-02-04 18:38:20 -08:00
|
|
|
ds.Iterate(func(id, val uint64) {
|
2020-10-06 18:41:41 -07:00
|
|
|
if id < 10 {
|
|
|
|
|
require.Zero(t, val)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
require.Equal(t, int(id*100), int(val))
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-10-15 14:54:37 +05:30
|
|
|
|
|
|
|
|
func TestReloadDiscardStats(t *testing.T) {
|
2023-02-21 08:06:07 +05:30
|
|
|
dir, err := os.MkdirTemp("", "badger-test")
|
2020-10-15 14:54:37 +05:30
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer removeDir(dir)
|
|
|
|
|
|
|
|
|
|
opt := DefaultOptions(dir)
|
|
|
|
|
db, err := Open(opt)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
ds := db.vlog.discardStats
|
|
|
|
|
|
|
|
|
|
ds.Update(uint32(1), 1)
|
|
|
|
|
ds.Update(uint32(2), 1)
|
|
|
|
|
ds.Update(uint32(1), -1)
|
|
|
|
|
require.NoError(t, db.Close())
|
|
|
|
|
|
|
|
|
|
// Reopen the DB, discard stats should be same.
|
|
|
|
|
db2, err := Open(opt)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
ds2 := db2.vlog.discardStats
|
|
|
|
|
require.Zero(t, ds2.Update(uint32(1), 0))
|
|
|
|
|
require.Equal(t, 1, int(ds2.Update(uint32(2), 0)))
|
|
|
|
|
}
|