diff --git a/CHANGELOG.md b/CHANGELOG.md index fbad1997..cc2f4ada 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Changelog for FrostFS Node - Pretty printer of basic ACL in the NeoFS CLI (#2259) - Adding of public key for nns group `group.frostfs` at init step (#130) - Iterating over just removed files by FSTree (#98) +- Parts of a locked object could not be removed anymore (#141) ### Removed ### Updated diff --git a/cmd/frostfs-cli/modules/object/lock.go b/cmd/frostfs-cli/modules/object/lock.go index 7f7da959..e6fbedd2 100644 --- a/cmd/frostfs-cli/modules/object/lock.go +++ b/cmd/frostfs-cli/modules/object/lock.go @@ -32,16 +32,35 @@ var objectLockCmd = &cobra.Command{ err := cnr.DecodeString(cidRaw) commonCmd.ExitOnErr(cmd, "Incorrect container arg: %v", err) + key := key.GetOrGenerate(cmd) + cli := internalclient.GetSDKClientByFlag(cmd, key, commonflags.RPC) + oidsRaw, _ := cmd.Flags().GetStringSlice(commonflags.OIDFlag) - lockList := make([]oid.ID, len(oidsRaw)) + lockList := make([]oid.ID, 0, len(oidsRaw)) + oidM := make(map[oid.ID]struct{}) - for i := range oidsRaw { - err = lockList[i].DecodeString(oidsRaw[i]) + for i, oidRaw := range oidsRaw { + var oID oid.ID + err = oID.DecodeString(oidRaw) commonCmd.ExitOnErr(cmd, fmt.Sprintf("Incorrect object arg #%d: %%v", i+1), err) - } - key := key.GetOrGenerate(cmd) + if _, ok := oidM[oID]; ok { + continue + } + + lockList = append(lockList, oID) + oidM[oID] = struct{}{} + + for _, relative := range collectObjectRelatives(cmd, cli, cnr, oID) { + if _, ok := oidM[relative]; ok { + continue + } + + lockList = append(lockList, relative) + oidM[relative] = struct{}{} + } + } var idOwner user.ID user.IDFromKey(&idOwner, key.PublicKey) @@ -81,7 +100,7 @@ var objectLockCmd = &cobra.Command{ obj.SetPayload(lock.Marshal()) var prm internalclient.PutObjectPrm - ReadOrOpenSession(cmd, &prm, key, cnr, nil) + ReadOrOpenSessionViaClient(cmd, &prm, cli, key, cnr, nil) Prepare(cmd, &prm) prm.SetHeader(obj)