From 56c8795e70a49894011d1bfdf79c5c2b83d68a73 Mon Sep 17 00:00:00 2001 From: Ori Bruk Date: Fri, 25 Apr 2025 19:15:16 +0300 Subject: [PATCH] [#54] Fix patch logic Signed-off-by: Ori Bruk --- CHANGELOG.md | 25 +++++++ .../object/patch/PrmObjectPatch.java | 14 ++-- .../sdk/services/impl/ObjectClientImpl.java | 66 ++++++++++++------- pom.xml | 2 +- 4 files changed, 76 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 389b85b..e859051 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## [0.12.0] - 2025-04-24 + +### Fixed + +- Patch logic +- Patch payload requirements + +## [0.11.0] - 2025-04-23 + +### Added + +- Placement policy vectors + +## [0.10.0] - 2025-03-10 + +### Added + +- Auto deploy to forgejo + +## [0.9.0] - 2025-03-05 + +### Added + +- APE rule deserializer + ## [0.9.0] - 2025-03-05 ### Added diff --git a/client/src/main/java/info/frostfs/sdk/jdo/parameters/object/patch/PrmObjectPatch.java b/client/src/main/java/info/frostfs/sdk/jdo/parameters/object/patch/PrmObjectPatch.java index 9f93c9a..58849df 100644 --- a/client/src/main/java/info/frostfs/sdk/jdo/parameters/object/patch/PrmObjectPatch.java +++ b/client/src/main/java/info/frostfs/sdk/jdo/parameters/object/patch/PrmObjectPatch.java @@ -6,9 +6,7 @@ import info.frostfs.sdk.dto.object.patch.Address; import info.frostfs.sdk.dto.object.patch.Range; import info.frostfs.sdk.dto.session.SessionToken; import info.frostfs.sdk.jdo.parameters.session.SessionContext; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import java.io.InputStream; import java.util.List; @@ -21,12 +19,8 @@ public class PrmObjectPatch implements SessionContext { @NotNull private Address address; - @NotNull private Range range; - - @NotNull private InputStream payload; - private List newAttributes; private boolean replaceAttributes; private int maxChunkLength; @@ -39,4 +33,10 @@ public class PrmObjectPatch implements SessionContext { this.payload = payload; this.maxChunkLength = maxChunkLength; } + + public PrmObjectPatch(Address address, List newAttributes, boolean replaceAttributes) { + this.address = address; + this.newAttributes = newAttributes; + this.replaceAttributes = replaceAttributes; + } } diff --git a/client/src/main/java/info/frostfs/sdk/services/impl/ObjectClientImpl.java b/client/src/main/java/info/frostfs/sdk/services/impl/ObjectClientImpl.java index 46b2905..71741e8 100644 --- a/client/src/main/java/info/frostfs/sdk/services/impl/ObjectClientImpl.java +++ b/client/src/main/java/info/frostfs/sdk/services/impl/ObjectClientImpl.java @@ -231,21 +231,29 @@ public class ObjectClientImpl extends ContextAccessor implements ObjectClient { public ObjectId patchObject(PrmObjectPatch args, CallContext ctx) { validate(args); - var request = createInitPatchRequest(args); - var protoToken = RequestConstructor.createObjectTokenContext( - getOrCreateSession(args, ctx), - request.getBody().getAddress(), - frostfs.session.Types.ObjectSessionContext.Verb.PATCH, - getContext().getKey() - ); - - var currentPos = args.getRange().getOffset(); - var chunkSize = args.getMaxChunkLength(); - byte[] chunkBuffer = new byte[chunkSize]; - var service = deadLineAfter(objectServiceClient, ctx.getTimeout(), ctx.getTimeUnit()); PatchStreamer writer = new PatchStreamer(service); + var request = createInitPatchRequest(args, ctx); + writer.write(request.build()); + + if (nonNull(args.getPayload())) { + patchObjectPayload(request, args, writer); + } + + var response = writer.complete(); + + Verifier.checkResponse(response); + + return ObjectIdMapper.toModel(response.getBody().getObjectId()); + } + + private void patchObjectPayload(Service.PatchRequest.Builder request, PrmObjectPatch args, PatchStreamer writer) { + var currentPos = args.getRange().getOffset(); + + var chunkSize = args.getMaxChunkLength() > 0 ? args.getMaxChunkLength() : AppConst.OBJECT_CHUNK_SIZE; + byte[] chunkBuffer = new byte[chunkSize]; + var bytesCount = readNBytes(args.getPayload(), chunkBuffer, chunkSize); while (bytesCount > 0) { var range = Service.Range.newBuilder() @@ -253,25 +261,25 @@ public class ObjectClientImpl extends ContextAccessor implements ObjectClient { .setLength(bytesCount) .build(); - Service.PatchRequest.Body.Patch.newBuilder() + var patch = Service.PatchRequest.Body.Patch.newBuilder() .setChunk(ByteString.copyFrom(chunkBuffer, 0, bytesCount)) .setSourceRange(range) .build(); - currentPos += bytesCount; + var body = Service.PatchRequest.Body.newBuilder() + .setAddress(request.getBody().getAddress()) + .setPatch(patch) + .build(); + request.setBody(body); - RequestConstructor.addMetaHeader(request, args.getXHeaders(), protoToken); + RequestConstructor.addMetaHeader(request, args.getXHeaders(), request.getMetaHeader().getSessionToken()); sign(request, getContext().getKey()); writer.write(request.build()); + + currentPos += bytesCount; bytesCount = readNBytes(args.getPayload(), chunkBuffer, chunkSize); } - - var response = writer.complete(); - - Verifier.checkResponse(response); - - return ObjectIdMapper.toModel(response.getBody().getObjectId()); } private ObjectFrostFS getObject(Service.GetRequest request, CallContext ctx) { @@ -635,14 +643,26 @@ public class ObjectClientImpl extends ContextAccessor implements ObjectClient { return request.build(); } - private Service.PatchRequest.Builder createInitPatchRequest(PrmObjectPatch args) { + private Service.PatchRequest.Builder createInitPatchRequest(PrmObjectPatch args, CallContext ctx) { var address = AddressMapper.toGrpcMessage(args.getAddress()); var body = Service.PatchRequest.Body.newBuilder() .setAddress(address) .setReplaceAttributes(args.isReplaceAttributes()) .addAllNewAttributes(ObjectAttributeMapper.toGrpcMessages(args.getNewAttributes())) .build(); - return Service.PatchRequest.newBuilder() + var request = Service.PatchRequest.newBuilder() .setBody(body); + + var protoToken = RequestConstructor.createObjectTokenContext( + getOrCreateSession(args, ctx), + request.getBody().getAddress(), + frostfs.session.Types.ObjectSessionContext.Verb.PATCH, + getContext().getKey() + ); + + RequestConstructor.addMetaHeader(request, args.getXHeaders(), protoToken); + sign(request, getContext().getKey()); + + return request; } } diff --git a/pom.xml b/pom.xml index 40f8790..d8de384 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ - 0.11.0 + 0.12.0 11 11 -- 2.45.3