From 8cacbcc8e9f993f5398f64ffc2e2086438dd3514 Mon Sep 17 00:00:00 2001 From: Ivan Pchelintsev Date: Wed, 22 May 2024 10:32:07 +0300 Subject: [PATCH] [#1] Return iterator from ListContainersAsync and SearchObjectsAsync Signed-off-by: Ivan Pchelintsev --- .../Interfaces/IFrostFSClient.cs | 4 ++-- .../Services/Container.cs | 11 +++++---- src/FrostFS.SDK.ClientV2/Services/Object.cs | 24 ++++++++++--------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs b/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs index 43bc42d..395d40a 100644 --- a/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs +++ b/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs @@ -5,7 +5,7 @@ namespace FrostFS.SDK.ClientV2.Interfaces; public interface IFrostFSClient { Task GetContainerAsync(ContainerId containerId); - Task ListContainersAsync(); + IAsyncEnumerable ListContainersAsync(); Task CreateContainerAsync(ModelsV2.Container container); Task DeleteContainerAsync(ContainerId containerId); Task GetObjectHeadAsync(ContainerId containerId, ObjectId objectId); @@ -13,5 +13,5 @@ public interface IFrostFSClient Task PutObjectAsync(ObjectHeader header, Stream payload); Task PutObjectAsync(ObjectHeader header, byte[] payload); Task DeleteObjectAsync(ContainerId containerId, ObjectId objectId); - Task SearchObjectAsync(ContainerId cid, params ObjectFilter[] filters); + IAsyncEnumerable SearchObjectsAsync(ContainerId cid, params ObjectFilter[] filters); } \ No newline at end of file diff --git a/src/FrostFS.SDK.ClientV2/Services/Container.cs b/src/FrostFS.SDK.ClientV2/Services/Container.cs index fbd29a7..0a685f3 100644 --- a/src/FrostFS.SDK.ClientV2/Services/Container.cs +++ b/src/FrostFS.SDK.ClientV2/Services/Container.cs @@ -21,8 +21,7 @@ public partial class Client return response.Body.Container.ToModel(); } - //TODO: Return iterator - public async Task ListContainersAsync() + public async IAsyncEnumerable ListContainersAsync() { var request = new ListRequest { @@ -34,9 +33,10 @@ public partial class Client request.AddMetaHeader(); request.Sign(_key); var response = await _containerServiceClient.ListAsync(request); - return response.Body.ContainerIds.Select( - cid => ContainerId.FromHash(cid.Value.ToByteArray()) - ).ToArray(); + foreach (var cid in response.Body.ContainerIds) + { + yield return ContainerId.FromHash(cid.Value.ToByteArray()); + } } public async Task CreateContainerAsync(ModelsV2.Container container) @@ -55,6 +55,7 @@ public partial class Client request.AddMetaHeader(); request.Sign(_key); var response = await _containerServiceClient.PutAsync(request); + RequestVerifier.ProcessResponse(response); return ContainerId.FromHash(response.Body.ContainerId.Value.ToByteArray()); } diff --git a/src/FrostFS.SDK.ClientV2/Services/Object.cs b/src/FrostFS.SDK.ClientV2/Services/Object.cs index 8dbbe8a..7192632 100644 --- a/src/FrostFS.SDK.ClientV2/Services/Object.cs +++ b/src/FrostFS.SDK.ClientV2/Services/Object.cs @@ -179,8 +179,7 @@ public partial class Client await _objectServiceClient.DeleteAsync(request); } - //TODO: Return iterator - public async Task SearchObjectAsync(ContainerId cid, params ObjectFilter[] filters) + public async IAsyncEnumerable SearchObjectsAsync(ContainerId cid, params ObjectFilter[] filters) { var request = new SearchRequest { @@ -199,25 +198,28 @@ public partial class Client ; request.AddMetaHeader(); request.Sign(_key); - var ids = await SearchObject(request); - return ids.Select(oid => ObjectId.FromHash(oid.Value.ToByteArray())).ToArray(); + var objectsIds = SearchObjects(request); + await foreach (var oid in objectsIds) + { + yield return ObjectId.FromHash(oid.Value.ToByteArray()); + } } - private async Task> SearchObject(SearchRequest request) + private async IAsyncEnumerable SearchObjects(SearchRequest request) { - var objectsIds = new List { }; - using var stream = SearchObjectInit(request); + using var stream = SearchObjectsInit(request); var ids = await stream.Read(); while (ids is not null) { - objectsIds.AddRange(ids); + foreach (var oid in ids) + { + yield return oid; + } ids = await stream.Read(); } - - return objectsIds; } - private SearchReader SearchObjectInit(SearchRequest initRequest) + private SearchReader SearchObjectsInit(SearchRequest initRequest) { if (initRequest is null) {