[#39] Client: add memory usage optimizations
All checks were successful
DCO / DCO (pull_request) Successful in 24s
lint-build / dotnet8.0 (pull_request) Successful in 41s
lint-build / dotnet8.0 (push) Successful in 55s

Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
Pavel Gross 2025-03-07 15:29:45 +03:00
parent d6fe034453
commit 32a7e64538
14 changed files with 120 additions and 92 deletions

View file

@ -77,68 +77,53 @@ public class ObjectTest : ObjectTestsBase
var singleObjects = Mocker.PutSingleRequests.ToArray();
Assert.NotNull(Mocker.ClientStreamWriter?.Messages);
var streamObjects = Mocker.ClientStreamWriter.Messages.ToArray();
Assert.Single(singleObjects);
var objects = Mocker.PutSingleRequests.Select(o => o.Body.Object).ToArray();
Assert.Equal(11, streamObjects.Length);
Assert.Equal(4, objects.Length);
var bodies = streamObjects.Select(o => ((Object.PutRequest)o).Body).ToArray();
// linked object
Assert.Equal(0, objects[3].Payload.Length);
Assert.Equal(3, bodies.Count(b => b.Init != null));
Assert.Equal(5, bodies.Count(b => b.Chunk.Length == 1024));
// PART1
Assert.Equal(blockSize, objects[0].Payload.Length);
Assert.True(bytes.AsMemory(0, blockSize).ToArray().SequenceEqual(objects[0].Payload));
Assert.NotNull(objects[0].Header.Split.SplitId);
Assert.Null(objects[0].Header.Split.Previous);
Assert.True(objects[0].Header.Attributes.Count == 0);
Assert.Null(objects[0].Header.Split.Parent);
Assert.Equal(596, ((Object.PutRequest)streamObjects[10]).Body.Chunk.Length);
// PART2
Assert.Equal(blockSize, objects[1].Payload.Length);
Assert.True(bytes.AsMemory(blockSize, blockSize).ToArray().SequenceEqual(objects[1].Payload));
var linkObject = singleObjects[0].Body.Object;
var header1 = bodies[0].Init.Header;
var header2 = bodies[4].Init.Header;
var header3 = bodies[8].Init.Header;
var payload1 = bodies[1].Chunk
.Concat(bodies[2].Chunk)
.Concat(bodies[3].Chunk)
.ToArray();
var payload2 = bodies[5].Chunk
.Concat(bodies[6].Chunk)
.Concat(bodies[7].Chunk)
.ToArray();
var payload3 = bodies[9].Chunk
.Concat(bodies[10].Chunk)
.ToArray();
Assert.NotNull(header1.Split.SplitId);
Assert.Null(header1.Split.Previous);
Assert.Equal(SHA256.HashData(bytes.AsMemory().Slice(0, blockSize).ToArray()), SHA256.HashData(payload1));
Assert.True(header1.Attributes.Count == 0);
Assert.Equal(header1.Split.SplitId, header2.Split.SplitId);
Assert.Equal(objIds.ElementAt(0), header2.Split.Previous.Value);
Assert.Equal(SHA256.HashData(bytes.AsMemory().Slice(blockSize, blockSize).ToArray()), SHA256.HashData(payload2));
Assert.True(header2.Attributes.Count == 0);
Assert.Equal(objects[0].Header.Split.SplitId, objects[1].Header.Split.SplitId);
Assert.True(objects[1].Header.Attributes.Count == 0);
Assert.Null(objects[1].Header.Split.Parent);
// last part
Assert.NotNull(header3.Split.Parent);
Assert.NotNull(header3.Split.ParentHeader);
Assert.NotNull(header3.Split.ParentSignature);
Assert.Equal(header2.Split.SplitId, header3.Split.SplitId);
Assert.Equal(SHA256.HashData(bytes.AsMemory().Slice(fileLength - fileLength % blockSize, fileLength % blockSize).ToArray()), SHA256.HashData(payload3));
Assert.True(header3.Attributes.Count == 0);
Assert.Equal(bytes.Length % blockSize, objects[2].Payload.Length);
Assert.True(bytes.AsMemory(2*blockSize).ToArray().SequenceEqual(objects[2].Payload));
//link object
Assert.Equal(header3.Split.Parent, linkObject.Header.Split.Parent);
Assert.Equal(header3.Split.ParentHeader, linkObject.Header.Split.ParentHeader);
Assert.Equal(header3.Split.SplitId, linkObject.Header.Split.SplitId);
Assert.Equal(0, (int)linkObject.Header.PayloadLength);
Assert.True(header3.Attributes.Count == 0);
Assert.NotNull(objects[3].Header.Split.Parent);
Assert.NotNull(objects[3].Header.Split.ParentHeader);
Assert.NotNull(objects[3].Header.Split.ParentSignature);
Assert.Equal(objects[2].Header.Split.SplitId, objects[3].Header.Split.SplitId);
Assert.True(objects[2].Header.Attributes.Count == 0);
Assert.Single(linkObject.Header.Split.ParentHeader.Attributes);
Assert.Equal("k", linkObject.Header.Split.ParentHeader.Attributes[0].Key);
Assert.Equal("v", linkObject.Header.Split.ParentHeader.Attributes[0].Value);
// link object
Assert.Equal(objects[2].Header.Split.Parent, objects[3].Header.Split.Parent);
Assert.Equal(objects[2].Header.Split.ParentHeader, objects[3].Header.Split.ParentHeader);
Assert.Equal(objects[2].Header.Split.SplitId, objects[3].Header.Split.SplitId);
Assert.Equal(0, (int)objects[3].Header.PayloadLength);
Assert.True(objects[3].Header.Attributes.Count == 0);
var modelObjId = FrostFsObjectId.FromHash(linkObject.Header.Split.Parent.Value.ToByteArray());
Assert.Single(objects[3].Header.Split.ParentHeader.Attributes);
Assert.Equal("k", objects[3].Header.Split.ParentHeader.Attributes[0].Key);
Assert.Equal("v", objects[3].Header.Split.ParentHeader.Attributes[0].Value);
var modelObjId = FrostFsObjectId.FromHash(objects[3].Header.Split.Parent.Value.ToByteArray());
Assert.Equal(result.Value, modelObjId.ToString());
}