diff --git a/object.go b/object.go index 11376fa0a..9af5b3645 100644 --- a/object.go +++ b/object.go @@ -829,13 +829,13 @@ func (obs *obs) UpdateMeta(name string, meta *ObjectMeta) error { // If there was an error that was not ErrObjectNotFound, error. // sff - Is there a better go way to do this? 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 6d8f09cdb..f19d3f316 100644 --- a/test/object_test.go +++ b/test/object_test.go @@ -351,6 +351,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" @@ -383,15 +385,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) } + // Change meta name to existing object's name + newmeta := &nats.ObjectMeta{Name: "C"} + + err = obs.UpdateMeta("B", newmeta) + expectErr(t, err, nats.ErrObjectAlreadyExists) + + err = obs.Delete("C") + expectOk(t, err) + err = obs.UpdateMeta("B", newmeta) + expectOk(t, err) + // delete the object to test updating against a deleted object - err = obs.Delete("B") + err = obs.Delete("C") expectOk(t, err) - err = obs.UpdateMeta("B", meta) + err = obs.UpdateMeta("C", meta) expectErr(t, err) err = obs.UpdateMeta("X", meta)