diff --git a/pkg/tinykv/tinykv.go b/pkg/tinykv/tinykv.go index da716c23..cd4ff99a 100644 --- a/pkg/tinykv/tinykv.go +++ b/pkg/tinykv/tinykv.go @@ -57,6 +57,7 @@ type entry[T any] struct { // KV is a registry for values (like/is a concurrent map) with timeout and sliding timeout type KV[T any] interface { + Delete(k string) Get(k string) (v T, ok bool) Keys() (keys []string) Values() (values []T) @@ -104,6 +105,13 @@ func (kv *store[T]) Stop() { kv.stopOnce.Do(func() { close(kv.stop) }) } +// Delete deletes an entry +func (kv *store[T]) Delete(k string) { + kv.mx.Lock() + defer kv.mx.Unlock() + delete(kv.kv, k) +} + func (kv *store[T]) Get(k string) (T, bool) { var zero T kv.mx.Lock() diff --git a/pkg/tinykv/tinykv_test.go b/pkg/tinykv/tinykv_test.go index 7b193153..caf495a5 100644 --- a/pkg/tinykv/tinykv_test.go +++ b/pkg/tinykv/tinykv_test.go @@ -201,6 +201,25 @@ func Test03(t *testing.T) { assert.WithinDuration(putAt, putAt.Add(<-elapsed), time.Millisecond*60) } +func Test04(t *testing.T) { + assert := assert.New(t) + kv := New( + time.Millisecond*10, + func(k string, v interface{}) { + t.Fatal(k, v) + }) + + err := kv.Put("1", 1, time.Millisecond*10000) + assert.NoError(err) + <-time.After(time.Millisecond * 50) + kv.Delete("1") + kv.Delete("1") + + <-time.After(time.Millisecond * 100) + _, ok := kv.Get("1") + assert.False(ok) +} + func Test05(t *testing.T) { assert := assert.New(t) N := 10000