Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIXED] Allow updating meta if new name exists but is deleted #1053

Merged
merged 1 commit into from Sep 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions object.go
Expand Up @@ -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)
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