WIP: Make Patch
method patch split-header #1697
5 changed files with 42 additions and 4 deletions
|
@ -846,6 +846,8 @@ type PatchObjectPrm struct {
|
||||||
|
|
||||||
ReplaceAttribute bool
|
ReplaceAttribute bool
|
||||||
|
|
||||||
|
NewSplitHeader *objectSDK.SplitHeader
|
||||||
|
|
||||||
PayloadPatches []PayloadPatch
|
PayloadPatches []PayloadPatch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -876,7 +878,11 @@ func Patch(ctx context.Context, prm PatchObjectPrm) (*PatchRes, error) {
|
||||||
return nil, fmt.Errorf("init payload reading: %w", err)
|
return nil, fmt.Errorf("init payload reading: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if patcher.PatchAttributes(ctx, prm.NewAttributes, prm.ReplaceAttribute) {
|
if patcher.PatchHeader(ctx, client.PatchHeaderPrm{
|
||||||
|
NewSplitHeader: prm.NewSplitHeader,
|
||||||
|
NewAttributes: prm.NewAttributes,
|
||||||
|
ReplaceAttributes: prm.ReplaceAttribute,
|
||||||
|
}) {
|
||||||
for _, pp := range prm.PayloadPatches {
|
for _, pp := range prm.PayloadPatches {
|
||||||
payloadFile, err := os.OpenFile(pp.PayloadPath, os.O_RDONLY, os.ModePerm)
|
payloadFile, err := os.OpenFile(pp.PayloadPath, os.O_RDONLY, os.ModePerm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package object
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -9,6 +10,7 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key"
|
||||||
commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common"
|
commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common"
|
||||||
|
objectV2 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/object"
|
||||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
|
@ -20,6 +22,7 @@ const (
|
||||||
replaceAttrsFlagName = "replace-attrs"
|
replaceAttrsFlagName = "replace-attrs"
|
||||||
rangeFlagName = "range"
|
rangeFlagName = "range"
|
||||||
payloadFlagName = "payload"
|
payloadFlagName = "payload"
|
||||||
|
splitHeaderFlagName = "split-header"
|
||||||
)
|
)
|
||||||
|
|
||||||
var objectPatchCmd = &cobra.Command{
|
var objectPatchCmd = &cobra.Command{
|
||||||
|
@ -50,6 +53,7 @@ func initObjectPatchCmd() {
|
||||||
flags.Bool(replaceAttrsFlagName, false, "Replace object attributes by new ones.")
|
flags.Bool(replaceAttrsFlagName, false, "Replace object attributes by new ones.")
|
||||||
flags.StringSlice(rangeFlagName, []string{}, "Range to which patch payload is applied. Format: offset:length")
|
flags.StringSlice(rangeFlagName, []string{}, "Range to which patch payload is applied. Format: offset:length")
|
||||||
flags.StringSlice(payloadFlagName, []string{}, "Path to file with patch payload.")
|
flags.StringSlice(payloadFlagName, []string{}, "Path to file with patch payload.")
|
||||||
|
flags.String(splitHeaderFlagName, "", "Path to binary or JSON-encoded split header")
|
||||||
}
|
}
|
||||||
|
|
||||||
func patch(cmd *cobra.Command, _ []string) {
|
func patch(cmd *cobra.Command, _ []string) {
|
||||||
|
@ -84,6 +88,8 @@ func patch(cmd *cobra.Command, _ []string) {
|
||||||
prm.NewAttributes = newAttrs
|
prm.NewAttributes = newAttrs
|
||||||
prm.ReplaceAttribute = replaceAttrs
|
prm.ReplaceAttribute = replaceAttrs
|
||||||
|
|
||||||
|
prm.NewSplitHeader = parseSplitHeaderBinaryOrJSON(cmd)
|
||||||
|
|
||||||
for i := range ranges {
|
for i := range ranges {
|
||||||
prm.PayloadPatches = append(prm.PayloadPatches, internalclient.PayloadPatch{
|
prm.PayloadPatches = append(prm.PayloadPatches, internalclient.PayloadPatch{
|
||||||
Range: ranges[i],
|
Range: ranges[i],
|
||||||
|
@ -149,3 +155,22 @@ func patchPayloadPaths(cmd *cobra.Command) []string {
|
||||||
v, _ := cmd.Flags().GetStringSlice(payloadFlagName)
|
v, _ := cmd.Flags().GetStringSlice(payloadFlagName)
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseSplitHeaderBinaryOrJSON(cmd *cobra.Command) *objectSDK.SplitHeader {
|
||||||
|
path, _ := cmd.Flags().GetString(splitHeaderFlagName)
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
commonCmd.ExitOnErr(cmd, "read file error: %w", err)
|
||||||
|
|
||||||
|
splitHdrV2 := new(objectV2.SplitHeader)
|
||||||
|
err = splitHdrV2.Unmarshal(data)
|
||||||
|
if err != nil {
|
||||||
|
err = splitHdrV2.UnmarshalJSON(data)
|
||||||
|
commonCmd.ExitOnErr(cmd, "unmarshal error: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return objectSDK.NewSplitHeaderFromV2(splitHdrV2)
|
||||||
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -2,6 +2,8 @@ module git.frostfs.info/TrueCloudLab/frostfs-node
|
||||||
|
|
||||||
go 1.22
|
go 1.22
|
||||||
|
|
||||||
|
replace git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20250204075528-d759a0980331 => git.frostfs.info/aarifullin/frostfs-sdk-go v0.0.0-20250324143057-e275ec3f8068
|
||||||
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
code.gitea.io/sdk/gitea v0.17.1
|
code.gitea.io/sdk/gitea v0.17.1
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-contract v0.21.0-rc.4
|
git.frostfs.info/TrueCloudLab/frostfs-contract v0.21.0-rc.4
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -8,8 +8,6 @@ git.frostfs.info/TrueCloudLab/frostfs-locode-db v0.4.1-0.20240710074952-65761deb
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-locode-db v0.4.1-0.20240710074952-65761deb5c0d/go.mod h1:7ZZq8iguY7qFsXajdHGmZd2AW4QbucyrJwhbsRfOfek=
|
git.frostfs.info/TrueCloudLab/frostfs-locode-db v0.4.1-0.20240710074952-65761deb5c0d/go.mod h1:7ZZq8iguY7qFsXajdHGmZd2AW4QbucyrJwhbsRfOfek=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20241112082307-f17779933e88 h1:9bvBDLApbbO5sXBKdODpE9tzy3HV99nXxkDWNn22rdI=
|
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20241112082307-f17779933e88 h1:9bvBDLApbbO5sXBKdODpE9tzy3HV99nXxkDWNn22rdI=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20241112082307-f17779933e88/go.mod h1:kbwB4v2o6RyOfCo9kEFeUDZIX3LKhmS0yXPrtvzkQ1g=
|
git.frostfs.info/TrueCloudLab/frostfs-observability v0.0.0-20241112082307-f17779933e88/go.mod h1:kbwB4v2o6RyOfCo9kEFeUDZIX3LKhmS0yXPrtvzkQ1g=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20250204075528-d759a0980331 h1:cyWAo/wwYc4gwCBPxKJRXXcWNwHhaEIMlGjvkRPoIEc=
|
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-sdk-go v0.0.0-20250204075528-d759a0980331/go.mod h1:qruvF6zaznX0RDPpfOk0AMcyy5XO8rm+s+wyj5nSDnI=
|
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1 h1:ccBRK21rFvY5R1WotI6LNoPlizk7qSvdfD8lNIRudVc=
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1 h1:ccBRK21rFvY5R1WotI6LNoPlizk7qSvdfD8lNIRudVc=
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1/go.mod h1:C1Ygde2n843yTZEQ0FP69jYiuaYV0kriLvP4zm8JuvM=
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1/go.mod h1:C1Ygde2n843yTZEQ0FP69jYiuaYV0kriLvP4zm8JuvM=
|
||||||
git.frostfs.info/TrueCloudLab/multinet v0.0.0-20241015075604-6cb0d80e0972 h1:/960fWeyn2AFHwQUwDsWB3sbP6lTEnFnMzLMM6tx6N8=
|
git.frostfs.info/TrueCloudLab/multinet v0.0.0-20241015075604-6cb0d80e0972 h1:/960fWeyn2AFHwQUwDsWB3sbP6lTEnFnMzLMM6tx6N8=
|
||||||
|
@ -24,6 +22,8 @@ git.frostfs.info/TrueCloudLab/tzhash v1.8.0 h1:UFMnUIk0Zh17m8rjGHJMqku2hCgaXDqjq
|
||||||
git.frostfs.info/TrueCloudLab/tzhash v1.8.0/go.mod h1:dhY+oy274hV8wGvGL4MwwMpdL3GYvaX1a8GQZQHvlF8=
|
git.frostfs.info/TrueCloudLab/tzhash v1.8.0/go.mod h1:dhY+oy274hV8wGvGL4MwwMpdL3GYvaX1a8GQZQHvlF8=
|
||||||
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02 h1:HeY8n27VyPRQe49l/fzyVMkWEB2fsLJYKp64pwA7tz4=
|
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02 h1:HeY8n27VyPRQe49l/fzyVMkWEB2fsLJYKp64pwA7tz4=
|
||||||
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02/go.mod h1:rQFJJdEOV7KbbMtQYR2lNfiZk+ONRDJSbMCTWxKt8Fw=
|
git.frostfs.info/TrueCloudLab/zapjournald v0.0.0-20240124114243-cb2e66427d02/go.mod h1:rQFJJdEOV7KbbMtQYR2lNfiZk+ONRDJSbMCTWxKt8Fw=
|
||||||
|
git.frostfs.info/aarifullin/frostfs-sdk-go v0.0.0-20250324143057-e275ec3f8068 h1:WZ7PmRQ1xLttnkYUX4G0t1I/MvDHJZv7rcto4qtSchM=
|
||||||
|
git.frostfs.info/aarifullin/frostfs-sdk-go v0.0.0-20250324143057-e275ec3f8068/go.mod h1:qruvF6zaznX0RDPpfOk0AMcyy5XO8rm+s+wyj5nSDnI=
|
||||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
github.com/VictoriaMetrics/easyproto v0.1.4 h1:r8cNvo8o6sR4QShBXQd1bKw/VVLSQma/V2KhTBPf+Sc=
|
github.com/VictoriaMetrics/easyproto v0.1.4 h1:r8cNvo8o6sR4QShBXQd1bKw/VVLSQma/V2KhTBPf+Sc=
|
||||||
github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710=
|
github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710=
|
||||||
|
|
|
@ -195,7 +195,12 @@ func (s *Streamer) Send(ctx context.Context, req *objectV2.PatchRequest) error {
|
||||||
patch.FromV2(req.GetBody())
|
patch.FromV2(req.GetBody())
|
||||||
|
|
||||||
if !s.nonFirstSend {
|
if !s.nonFirstSend {
|
||||||
err := s.patcher.ApplyAttributesPatch(ctx, patch.NewAttributes, patch.ReplaceAttributes)
|
err := s.patcher.ApplyHeaderPatch(ctx,
|
||||||
|
patcher.ApplyHeaderPatchPrm{
|
||||||
|
NewSplitHeader: patch.NewSplitHeader,
|
||||||
|
NewAttributes: patch.NewAttributes,
|
||||||
|
ReplaceAttributes: patch.ReplaceAttributes,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("patch attributes: %w", err)
|
return fmt.Errorf("patch attributes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue
Fix