From fc261d7dcd0b6109c866cda9f6b21426b1742ed1 Mon Sep 17 00:00:00 2001 From: "R.I.Pienaar" Date: Mon, 11 Oct 2021 13:02:30 +0200 Subject: [PATCH] ensure get returns a nil and key not found as per spec Signed-off-by: R.I.Pienaar --- js.go | 9 +++++++++ kv.go | 17 ++++++++++++++++- test/kv_test.go | 9 ++++----- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/js.go b/js.go index 361c15a6c..e61d92151 100644 --- a/js.go +++ b/js.go @@ -254,16 +254,25 @@ func (opt jsOptFn) configureJSContext(opts *jsOpts) error { // Domain changes the domain part of JetSteam API prefix. func Domain(domain string) JSOpt { + if domain == "" { + return APIPrefix("") + } + return APIPrefix(fmt.Sprintf(jsDomainT, domain)) } // APIPrefix changes the default prefix used for the JetStream API. func APIPrefix(pre string) JSOpt { return jsOptFn(func(js *jsOpts) error { + if pre == "" { + return nil + } + js.pre = pre if !strings.HasSuffix(js.pre, ".") { js.pre = js.pre + "." } + return nil }) } diff --git a/kv.go b/kv.go index cf5468bce..30ea14208 100644 --- a/kv.go +++ b/kv.go @@ -333,6 +333,18 @@ func keyValid(key string) bool { // Get returns the latest value for the key. func (kv *kvs) Get(key string) (KeyValueEntry, error) { + e, err := kv.get(key) + if err == ErrKeyDeleted { + return nil, ErrKeyNotFound + } + if err != nil { + return nil, err + } + + return e, nil +} + +func (kv *kvs) get(key string) (KeyValueEntry, error) { if !keyValid(key) { return nil, ErrInvalidKey } @@ -367,6 +379,7 @@ func (kv *kvs) Get(key string) (KeyValueEntry, error) { entry.op = KeyValuePurge return entry, ErrKeyDeleted } + } return entry, nil @@ -400,11 +413,13 @@ func (kv *kvs) Create(key string, value []byte) (revision uint64, err error) { if err == nil { return v, nil } + // TODO(dlc) - Since we have tombstones for DEL ops for watchers, this could be from that // so we need to double check. - if e, err := kv.Get(key); err == ErrKeyDeleted { + if e, err := kv.get(key); err == ErrKeyDeleted { return kv.Update(key, value, e.Revision()) } + return 0, err } diff --git a/test/kv_test.go b/test/kv_test.go index 01934ba48..f2f75bae5 100644 --- a/test/kv_test.go +++ b/test/kv_test.go @@ -60,7 +60,7 @@ func TestKeyValueBasics(t *testing.T) { err = kv.Delete("name") expectOk(t, err) _, err = kv.Get("name") - expectErr(t, err, nats.ErrKeyDeleted) + expectErr(t, err, nats.ErrKeyNotFound) r, err = kv.Create("name", []byte("derek")) expectOk(t, err) if r != 3 { @@ -284,10 +284,9 @@ func TestKeyValueDeleteVsPurge(t *testing.T) { expectOk(t, err) // Check marker e, err := kv.Get("name") - expectErr(t, err, nats.ErrKeyDeleted) - // Also make sure op is purge - if e.Operation() != nats.KeyValuePurge { - t.Fatalf("Expected a purge operation but got %v", e.Operation()) + expectErr(t, err, nats.ErrKeyNotFound) + if e != nil { + t.Fatalf("Expected a nil entry but got %v", e) } entries, err = kv.History("name") expectOk(t, err)