From f5090dd2ac07b4dc64268b0a8e71e82d8f398e14 Mon Sep 17 00:00:00 2001 From: Piotr Piotrowski Date: Wed, 24 Aug 2022 13:30:10 +0200 Subject: [PATCH] Allow updating meta if new name exists but is deleted --- object.go | 10 +++++----- test/object_test.go | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/object.go b/object.go index a9a93b77e..cc54cac35 100644 --- a/object.go +++ b/object.go @@ -857,13 +857,13 @@ func (obs *obs) UpdateMeta(name string, meta *ObjectMeta) error { // If the new name is different from the old, and it exists, error // If there was an error that was not ErrObjectNotFound, error. if name != meta.Name { - _, err = obs.GetInfo(meta.Name) - if err != ErrObjectNotFound { - if err == nil { - return ErrObjectAlreadyExists - } + existingInfo, err := obs.GetInfo(meta.Name) + if err != nil && !errors.Is(err, ErrObjectNotFound) { return err } + if err == nil && !existingInfo.Deleted { + return ErrObjectAlreadyExists + } } // Update Meta prevents update of ObjectMetaOptions (Link, ChunkSize) diff --git a/test/object_test.go b/test/object_test.go index 5baa861ec..3d2cb6f5a 100644 --- a/test/object_test.go +++ b/test/object_test.go @@ -391,6 +391,8 @@ func TestObjectMetadata(t *testing.T) { // Simple with no Meta. _, err = obs.PutString("A", "AAA") expectOk(t, err) + _, err = obs.PutString("C", "CCC") + expectOk(t, err) meta := &nats.ObjectMeta{Name: "A"} meta.Description = "descA" @@ -423,15 +425,25 @@ func TestObjectMetadata(t *testing.T) { info, err = obs.GetInfo("B") expectOk(t, err) - if info.Name != "B" || info.Description != "descB" || info.Headers == nil || info.Headers.Get("color") != "red" { t.Fatalf("Update failed: %+v", info) } - // delete the object to test updating against a deleted object - err = obs.Delete("B") + // Change meta name to existing object's name + meta = &nats.ObjectMeta{Name: "C"} + + err = obs.UpdateMeta("B", meta) + expectErr(t, err, nats.ErrObjectAlreadyExists) + + err = obs.Delete("C") expectOk(t, err) err = obs.UpdateMeta("B", meta) + expectOk(t, err) + + // delete the object to test updating against a deleted object + err = obs.Delete("C") + expectOk(t, err) + err = obs.UpdateMeta("C", meta) expectErr(t, err, nats.ErrUpdateMetaDeleted) err = obs.UpdateMeta("X", meta)