Skip to content

Commit

Permalink
Allow updating meta if new name exists but is deleted (#1053)
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrpio committed Sep 15, 2022
1 parent 225c557 commit 51ba8b3
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
10 changes: 5 additions & 5 deletions object.go
Expand Up @@ -861,13 +861,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)
Expand Down
18 changes: 15 additions & 3 deletions test/object_test.go
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 51ba8b3

Please sign in to comment.