optimizations

This commit is contained in:
Pavel Gross 2024-09-02 22:38:27 +03:00
parent 1a02ac2ae7
commit a74981dce8
95 changed files with 391 additions and 448 deletions

View file

@ -1,6 +1,4 @@
 using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Caching.Memory;
namespace FrostFS.SDK.ClientV2 namespace FrostFS.SDK.ClientV2
{ {

View file

@ -1,21 +1,21 @@
using FrostFS.Container; using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using FrostFS.Container;
using FrostFS.Netmap; using FrostFS.Netmap;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.ClientV2.Interfaces; using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Netmap;
using FrostFS.Session; using FrostFS.Session;
using Grpc.Core; using Grpc.Core;
using Grpc.Core.Interceptors; using Grpc.Core.Interceptors;
using Grpc.Net.Client; using Grpc.Net.Client;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Version = FrostFS.SDK.ModelsV2.Version;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -77,7 +77,7 @@ public class Client : IFrostFSClient
key: ecdsaKey, key: ecdsaKey,
owner: OwnerId.FromKey(ecdsaKey), owner: OwnerId.FromKey(ecdsaKey),
channel: InitGrpcChannel(settings.Value.Host, channelOptions), channel: InitGrpcChannel(settings.Value.Host, channelOptions),
version: new Version(2, 13)); version: new FrostFsVersion(2, 13));
ContainerServiceClient = containerService; ContainerServiceClient = containerService;
NetmapServiceClient = netmapService; NetmapServiceClient = netmapService;
@ -98,7 +98,7 @@ public class Client : IFrostFSClient
key: null, key: null,
owner: null, owner: null,
channel: channel, channel: channel,
version: new Version(2, 13)); version: new FrostFsVersion(2, 13));
// TODO: define timeout logic // TODO: define timeout logic
// CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20) }); // CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20) });
@ -119,7 +119,7 @@ public class Client : IFrostFSClient
key: ecdsaKey, key: ecdsaKey,
owner: OwnerId.FromKey(ecdsaKey), owner: OwnerId.FromKey(ecdsaKey),
channel: channel, channel: channel,
version: new Version(2, 13)); version: new FrostFsVersion(2, 13));
// TODO: define timeout logic // TODO: define timeout logic
CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20)}); CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20)});
@ -135,13 +135,13 @@ public class Client : IFrostFSClient
{ {
if (disposing && !isDisposed) if (disposing && !isDisposed)
{ {
ClientCtx.Dispose(); ClientCtx?.Dispose();
isDisposed = true; isDisposed = true;
} }
} }
#region ContainerImplementation #region ContainerImplementation
public Task<ModelsV2.Container> GetContainerAsync(PrmContainerGet args) public Task<FrostFsContainer> GetContainerAsync(PrmContainerGet args)
{ {
var service = GetContainerService(args); var service = GetContainerService(args);
return service.GetContainerAsync(args); return service.GetContainerAsync(args);
@ -175,7 +175,7 @@ public class Client : IFrostFSClient
return service.GetNetmapSnapshotAsync(args); return service.GetNetmapSnapshotAsync(args);
} }
public Task<ModelsV2.Netmap.NodeInfo> GetNodeInfoAsync(PrmNodeInfo? args) public Task<FrostFsNodeInfo> GetNodeInfoAsync(PrmNodeInfo? args)
{ {
args ??= new PrmNodeInfo(); args ??= new PrmNodeInfo();
var service = GetNetmapService(args); var service = GetNetmapService(args);
@ -229,12 +229,12 @@ public class Client : IFrostFSClient
#endregion #endregion
#region SessionImplementation #region SessionImplementation
public async Task<ModelsV2.SessionToken> CreateSessionAsync(PrmSessionCreate args) public async Task<FrostFsSessionToken> CreateSessionAsync(PrmSessionCreate args)
{ {
var session = await CreateSessionInternalAsync(args); var session = await CreateSessionInternalAsync(args);
var token = session.Serialize(); var token = session.Serialize();
return new ModelsV2.SessionToken(token); return new FrostFsSessionToken(token);
} }
internal Task<Session.SessionToken> CreateSessionInternalAsync(PrmSessionCreate args) internal Task<Session.SessionToken> CreateSessionInternalAsync(PrmSessionCreate args)

View file

@ -1,6 +1,8 @@
using FrostFS.SDK.Cryptography; using System.Security.Cryptography;
using FrostFS.SDK.Cryptography;
using Google.Protobuf; using Google.Protobuf;
using System.Security.Cryptography;
namespace FrostFS.SDK.ClientV2 namespace FrostFS.SDK.ClientV2
{ {

View file

@ -1,9 +1,8 @@
using FrostFS.SDK.ModelsV2;
using System; using System;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
public class ResponseException(ResponseStatus status) : Exception() public class ResponseException(FrostFsResponseStatus status) : Exception()
{ {
public ResponseStatus Status { get; set; } = status; public FrostFsResponseStatus Status { get; set; } = status;
} }

View file

@ -1,7 +1,7 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;
using FrostFS.SDK.ModelsV2;
using Grpc.Core; using Grpc.Core;
using Grpc.Core.Interceptors; using Grpc.Core.Interceptors;

View file

@ -1,9 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Netmap;
namespace FrostFS.SDK.ClientV2.Interfaces; namespace FrostFS.SDK.ClientV2.Interfaces;
public interface IFrostFSClient : IDisposable public interface IFrostFSClient : IDisposable
@ -11,17 +10,17 @@ public interface IFrostFSClient : IDisposable
#region Network #region Network
Task<NetmapSnapshot> GetNetmapSnapshotAsync(PrmNetmapSnapshot? args = null); Task<NetmapSnapshot> GetNetmapSnapshotAsync(PrmNetmapSnapshot? args = null);
Task<NodeInfo> GetNodeInfoAsync(PrmNodeInfo? args = null); Task<FrostFsNodeInfo> GetNodeInfoAsync(PrmNodeInfo? args = null);
Task<NetworkSettings> GetNetworkSettingsAsync(PrmNetworkSettings? args = null); Task<NetworkSettings> GetNetworkSettingsAsync(PrmNetworkSettings? args = null);
#endregion #endregion
#region Session #region Session
Task<SessionToken> CreateSessionAsync(PrmSessionCreate args); Task<FrostFsSessionToken> CreateSessionAsync(PrmSessionCreate args);
#endregion #endregion
#region Container #region Container
Task<ModelsV2.Container> GetContainerAsync(PrmContainerGet args); Task<FrostFsContainer> GetContainerAsync(PrmContainerGet args);
IAsyncEnumerable<ContainerId> ListContainersAsync(PrmContainerGetAll? args = null); IAsyncEnumerable<ContainerId> ListContainersAsync(PrmContainerGetAll? args = null);
@ -35,7 +34,7 @@ public interface IFrostFSClient : IDisposable
Task<FrostFsObject> GetObjectAsync(PrmObjectGet args); Task<FrostFsObject> GetObjectAsync(PrmObjectGet args);
Task<ObjectId> PutObjectAsync(PrmObjectPut putObjectParameters); Task<ObjectId> PutObjectAsync(PrmObjectPut args);
Task<ObjectId> PutSingleObjectAsync(PrmSingleObjectPut args); Task<ObjectId> PutSingleObjectAsync(PrmSingleObjectPut args);

View file

@ -1,16 +1,15 @@
using System; using System;
using Google.Protobuf;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2.Enums;
using Google.Protobuf;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
public static class ContainerMapper public static class ContainerMapper
{ {
public static Container.Container ToMessage(this ModelsV2.Container container) public static Container.Container ToMessage(this FrostFsContainer container)
{ {
return new Container.Container return new Container.Container
{ {
@ -20,14 +19,14 @@ public static class ContainerMapper
}; };
} }
public static ModelsV2.Container ToModel(this Container.Container container) public static FrostFsContainer ToModel(this Container.Container container)
{ {
if (!Enum.IsDefined(typeof(BasicAcl),(int)container.BasicAcl)) if (!Enum.IsDefined(typeof(BasicAcl),(int)container.BasicAcl))
throw new ArgumentException($"Unknown BasicACL rule. Value: '{container.BasicAcl}'."); throw new ArgumentException($"Unknown BasicACL rule. Value: '{container.BasicAcl}'.");
BasicAcl acl = (BasicAcl)container.BasicAcl; BasicAcl acl = (BasicAcl)container.BasicAcl;
return new ModelsV2.Container(acl, container.PlacementPolicy.ToModel()) return new FrostFsContainer(acl, container.PlacementPolicy.ToModel())
{ {
Nonce = container.Nonce.ToUuid(), Nonce = container.Nonce.ToUuid(),
Version = container.Version.ToModel() Version = container.Version.ToModel()

View file

@ -1,9 +1,11 @@
using System;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using Google.Protobuf; using Google.Protobuf;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using System;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;

View file

@ -1,4 +1,3 @@
using FrostFS.SDK.ModelsV2;
using FrostFS.Session; using FrostFS.Session;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;

View file

@ -1,6 +1,6 @@
using System.Linq; using System.Linq;
using FrostFS.Netmap; using FrostFS.Netmap;
using FrostFS.SDK.ModelsV2.Netmap;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;

View file

@ -1,30 +1,29 @@
using System; using System;
using System.Linq; using System.Linq;
using FrostFS.Netmap; using FrostFS.Netmap;
using FrostFS.SDK.ModelsV2.Enums;
using NodeInfo = FrostFS.SDK.ModelsV2.Netmap.NodeInfo;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
public static class NodeInfoMapper public static class NodeInfoMapper
{ {
public static NodeInfo ToModel(this LocalNodeInfoResponse.Types.Body node) public static FrostFsNodeInfo ToModel(this LocalNodeInfoResponse.Types.Body node)
{ {
return node.NodeInfo.ToModel(node.Version); return node.NodeInfo.ToModel(node.Version);
} }
public static NodeInfo ToModel(this FrostFS.Netmap.NodeInfo nodeInfo, Refs.Version version) public static FrostFsNodeInfo ToModel(this NodeInfo nodeInfo, Refs.Version version)
{ {
NodeState state = nodeInfo.State switch NodeState state = nodeInfo.State switch
{ {
FrostFS.Netmap.NodeInfo.Types.State.Unspecified => NodeState.Unspecified, NodeInfo.Types.State.Unspecified => NodeState.Unspecified,
FrostFS.Netmap.NodeInfo.Types.State.Online => NodeState.Online, NodeInfo.Types.State.Online => NodeState.Online,
FrostFS.Netmap.NodeInfo.Types.State.Offline => NodeState.Offline, NodeInfo.Types.State.Offline => NodeState.Offline,
FrostFS.Netmap.NodeInfo.Types.State.Maintenance => NodeState.Maintenance, NodeInfo.Types.State.Maintenance => NodeState.Maintenance,
_ => throw new ArgumentException($"Unknown NodeState. Value: '{nodeInfo.State}'.") _ => throw new ArgumentException($"Unknown NodeState. Value: '{nodeInfo.State}'.")
}; };
return new NodeInfo( return new FrostFsNodeInfo(
version: version.ToModel(), version: version.ToModel(),
state: state, state: state,
addresses: [.. nodeInfo.Addresses], addresses: [.. nodeInfo.Addresses],

View file

@ -1,11 +1,12 @@
using System.Linq; using System.Linq;
using FrostFS.Netmap; using FrostFS.Netmap;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
public static class PlacementPolicyMapper public static class PlacementPolicyMapper
{ {
public static PlacementPolicy ToMessage(this ModelsV2.Netmap.PlacementPolicy placementPolicy) public static PlacementPolicy ToMessage(this FrostFsPlacementPolicy placementPolicy)
{ {
var pp = new PlacementPolicy var pp = new PlacementPolicy
{ {
@ -23,9 +24,9 @@ public static class PlacementPolicyMapper
return pp; return pp;
} }
public static ModelsV2.Netmap.PlacementPolicy ToModel(this PlacementPolicy placementPolicy) public static FrostFsPlacementPolicy ToModel(this PlacementPolicy placementPolicy)
{ {
return new ModelsV2.Netmap.PlacementPolicy( return new FrostFsPlacementPolicy(
placementPolicy.Unique, placementPolicy.Unique,
placementPolicy.Replicas.Select(replica => replica.ToModel()).ToArray() placementPolicy.Replicas.Select(replica => replica.ToModel()).ToArray()
); );

View file

@ -4,7 +4,7 @@ namespace FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
public static class ReplicaMapper public static class ReplicaMapper
{ {
public static Replica ToMessage(this ModelsV2.Netmap.Replica replica) public static Replica ToMessage(this FrostFsReplica replica)
{ {
return new Replica return new Replica
{ {
@ -13,8 +13,8 @@ public static class ReplicaMapper
}; };
} }
public static ModelsV2.Netmap.Replica ToModel(this Replica replica) public static FrostFsReplica ToModel(this Replica replica)
{ {
return new ModelsV2.Netmap.Replica((int)replica.Count, replica.Selector); return new FrostFsReplica((int)replica.Count, replica.Selector);
} }
} }

View file

@ -1,5 +1,3 @@
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
internal static class ObjectMapper internal static class ObjectMapper

View file

@ -1,5 +1,4 @@
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;

View file

@ -1,7 +1,6 @@
using System; using System;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.ModelsV2;
using MatchType = FrostFS.Object.MatchType;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
@ -11,11 +10,11 @@ public static class ObjectFilterMapper
{ {
var objMatchTypeName = filter.MatchType switch var objMatchTypeName = filter.MatchType switch
{ {
ModelsV2.Enums.ObjectMatchType.Unspecified => MatchType.Unspecified, FrostFsObjectMatchType.Unspecified => MatchType.Unspecified,
ModelsV2.Enums.ObjectMatchType.Equals => MatchType.StringEqual, FrostFsObjectMatchType.Equals => MatchType.StringEqual,
ModelsV2.Enums.ObjectMatchType.NotEquals => MatchType.StringNotEqual, FrostFsObjectMatchType.NotEquals => MatchType.StringNotEqual,
ModelsV2.Enums.ObjectMatchType.KeyAbsent => MatchType.NotPresent, FrostFsObjectMatchType.KeyAbsent => MatchType.NotPresent,
ModelsV2.Enums.ObjectMatchType.StartsWith => MatchType.CommonPrefix, FrostFsObjectMatchType.StartsWith => MatchType.CommonPrefix,
_ => throw new ArgumentException($"Unknown MatchType. Value: '{filter.MatchType}'.") _ => throw new ArgumentException($"Unknown MatchType. Value: '{filter.MatchType}'.")
}; };

View file

@ -1,10 +1,8 @@
using System; using System;
using System.Linq; using System.Linq;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using Google.Protobuf;
using ObjectType = FrostFS.Object.ObjectType;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
@ -14,9 +12,9 @@ public static class ObjectHeaderMapper
{ {
var objTypeName = header.ObjectType switch var objTypeName = header.ObjectType switch
{ {
ModelsV2.Enums.ObjectType.Regular => ObjectType.Regular, FrostFsObjectType.Regular => ObjectType.Regular,
ModelsV2.Enums.ObjectType.Lock => ObjectType.Lock, FrostFsObjectType.Lock => ObjectType.Lock,
ModelsV2.Enums.ObjectType.Tombstone => ObjectType.Tombstone, FrostFsObjectType.Tombstone => ObjectType.Tombstone,
_ => throw new ArgumentException($"Unknown ObjectType. Value: '{header.ObjectType}'.") _ => throw new ArgumentException($"Unknown ObjectType. Value: '{header.ObjectType}'.")
}; };
@ -39,7 +37,7 @@ public static class ObjectHeaderMapper
{ {
head.Split = new Header.Types.Split head.Split = new Header.Types.Split
{ {
SplitId = split.SplitId != null ? ByteString.CopyFrom(split.SplitId.ToBinary()) : null SplitId = split!.SplitId != null ? split.SplitId.GetMessage() : null
}; };
} }
@ -50,9 +48,9 @@ public static class ObjectHeaderMapper
{ {
var objTypeName = header.ObjectType switch var objTypeName = header.ObjectType switch
{ {
ObjectType.Regular => ModelsV2.Enums.ObjectType.Regular, ObjectType.Regular => FrostFsObjectType.Regular,
ObjectType.Lock => ModelsV2.Enums.ObjectType.Lock, ObjectType.Lock => FrostFsObjectType.Lock,
ObjectType.Tombstone => ModelsV2.Enums.ObjectType.Tombstone, ObjectType.Tombstone => FrostFsObjectType.Tombstone,
_ => throw new ArgumentException($"Unknown ObjectType. Value: '{header.ObjectType}'.") _ => throw new ArgumentException($"Unknown ObjectType. Value: '{header.ObjectType}'.")
}; };

View file

@ -1,5 +1,5 @@
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.ModelsV2;
using Google.Protobuf; using Google.Protobuf;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;

View file

@ -1,9 +1,11 @@
using System;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using Google.Protobuf; using Google.Protobuf;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using System;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;

View file

@ -1,12 +1,12 @@
using System; using System;
using FrostFS.SDK.ModelsV2;
using Google.Protobuf; using Google.Protobuf;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
public static class SignatureMapper public static class SignatureMapper
{ {
public static Refs.Signature ToMessage(this Signature signature) public static Refs.Signature ToMessage(this FrostFsSignature signature)
{ {
var scheme = signature.Scheme switch var scheme = signature.Scheme switch
{ {

View file

@ -1,19 +1,18 @@
using System; using System;
using FrostFS.SDK.ModelsV2.Enums;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
public static class StatusMapper public static class StatusMapper
{ {
public static ModelsV2.ResponseStatus ToModel(this Status.Status status) public static FrostFsResponseStatus ToModel(this Status.Status status)
{ {
if (status is null) if (status is null)
return new ModelsV2.ResponseStatus(StatusCode.Success); return new FrostFsResponseStatus(FrostFsStatusCode.Success);
var codeName = Enum.GetName(typeof(FrostFsStatusCode), status.Code);
var codeName = Enum.GetName(typeof(StatusCode), status.Code);
return codeName is null return codeName is null
? throw new ArgumentException($"Unknown StatusCode. Value: '{status.Code}'.") ? throw new ArgumentException($"Unknown StatusCode. Value: '{status.Code}'.")
: new ModelsV2.ResponseStatus((StatusCode)Enum.Parse(typeof(StatusCode), codeName), status.Message); : new FrostFsResponseStatus((FrostFsStatusCode)status.Code, status.Message);
} }
} }

View file

@ -1,6 +1,7 @@
using System.Collections; using System.Collections;
using System.Threading; using System.Threading;
using Version = FrostFS.Refs.Version;
using FrostFS.Refs;
namespace FrostFS.SDK.ClientV2.Mappers.GRPC; namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
@ -10,7 +11,7 @@ public static class VersionMapper
private static readonly Hashtable _cacheModels = []; private static readonly Hashtable _cacheModels = [];
private static SpinLock _spinlock = new(); private static SpinLock _spinlock = new();
public static Version ToMessage(this ModelsV2.Version model) public static Version ToMessage(this FrostFsVersion model)
{ {
var key = model.Major << 16 + model.Minor; var key = model.Major << 16 + model.Minor;
@ -31,7 +32,7 @@ public static class VersionMapper
} }
catch (System.ArgumentException) catch (System.ArgumentException)
{ {
// ignore attempt to add duplicate error. // ignore attempt to add duplicate
} }
finally finally
{ {
@ -43,7 +44,7 @@ public static class VersionMapper
return (Version)_cacheMessages[key]; return (Version)_cacheMessages[key];
} }
public static ModelsV2.Version ToModel(this Version message) public static FrostFsVersion ToModel(this Version message)
{ {
var key = (int)message.Major << 16 + (int)message.Minor; var key = (int)message.Major << 16 + (int)message.Minor;
@ -53,14 +54,14 @@ public static class VersionMapper
try try
{ {
_spinlock.Enter(ref lockTaken); _spinlock.Enter(ref lockTaken);
var model = new ModelsV2.Version((int)message.Major, (int)message.Minor); var model = new FrostFsVersion((int)message.Major, (int)message.Minor);
_cacheModels.Add(key, model); _cacheModels.Add(key, model);
return model; return model;
} }
catch (System.ArgumentException) catch (System.ArgumentException)
{ {
// ignore attempt to add duplicate error. // ignore attempt to add duplicate
} }
finally finally
{ {
@ -69,6 +70,6 @@ public static class VersionMapper
} }
} }
return (ModelsV2.Version)_cacheModels[key]; return (FrostFsVersion)_cacheModels[key];
} }
} }

View file

@ -2,9 +2,11 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Threading; using System.Threading;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using Google.Protobuf; using Google.Protobuf;
using Grpc.Core.Interceptors; using Grpc.Core.Interceptors;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -13,13 +15,13 @@ public class Context()
{ {
private List<Interceptor>? interceptors; private List<Interceptor>? interceptors;
private ByteString publicKeyCache; private ByteString? publicKeyCache;
public ECDsa Key { get; set; } public ECDsa Key { get; set; }
public OwnerId OwnerId { get; set; } public OwnerId OwnerId { get; set; }
public ModelsV2.Version Version { get; set; } public FrostFsVersion Version { get; set; }
public CancellationToken CancellationToken { get; set; } = default; public CancellationToken CancellationToken { get; set; } = default;
@ -35,16 +37,13 @@ public class Context()
set { this.interceptors = value; } set { this.interceptors = value; }
} }
public ByteString PublicKeyCache public ByteString? GetPublicKeyCache()
{ {
get if (publicKeyCache == null && Key != null)
{ {
if (publicKeyCache == null) publicKeyCache = ByteString.CopyFrom(Key.PublicKey());
{
publicKeyCache = ByteString.CopyFrom(Key.PublicKey());
}
return publicKeyCache;
} }
return publicKeyCache;
} }
} }

View file

@ -1,5 +1,4 @@
using FrostFS.SDK.ModelsV2; using System.Security.Cryptography;
using System.Security.Cryptography;
namespace FrostFS.SDK.ClientV2.Parameters; namespace FrostFS.SDK.ClientV2.Parameters;

View file

@ -1,5 +1,3 @@
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2.Parameters; namespace FrostFS.SDK.ClientV2.Parameters;
public interface ISessionToken public interface ISessionToken
@ -10,5 +8,5 @@ public interface ISessionToken
/// member. The session has a limited validity period, and applies to a strictly defined set of operations. /// member. The session has a limited validity period, and applies to a strictly defined set of operations.
/// </summary> /// </summary>
/// <value>Instance of the session obtained from the server</value> /// <value>Instance of the session obtained from the server</value>
SessionToken? SessionToken { get; set; } FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,11 +1,8 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
using System.Security.Cryptography;
namespace FrostFS.SDK.ClientV2.Parameters; public sealed class PrmContainerCreate(FrostFsContainer container) : PrmBase, ISessionToken
public sealed class PrmContainerCreate(ModelsV2.Container container) : PrmBase, ISessionToken
{ {
public ModelsV2.Container Container { get; set; } = container; public FrostFsContainer Container { get; set; } = container;
/// <summary> /// <summary>
/// Since the container becomes available with some delay, it needs to poll the container status /// Since the container becomes available with some delay, it needs to poll the container status
@ -16,5 +13,5 @@ public sealed class PrmContainerCreate(ModelsV2.Container container) : PrmBase,
/// <summary> /// <summary>
/// Blank session token /// Blank session token
/// </summary> /// </summary>
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,6 +1,4 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmContainerDelete(ContainerId containerId) : PrmBase, ISessionToken public sealed class PrmContainerDelete(ContainerId containerId) : PrmBase, ISessionToken
{ {
@ -12,5 +10,5 @@ public sealed class PrmContainerDelete(ContainerId containerId) : PrmBase, ISess
/// <value>Rules for polling the result</value> /// <value>Rules for polling the result</value>
public PrmWait? WaitParams { get; set; } public PrmWait? WaitParams { get; set; }
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,6 +1,4 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmContainerGet(ContainerId containerId) : PrmBase public sealed class PrmContainerGet(ContainerId containerId) : PrmBase
{ {

View file

@ -1,6 +1,4 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmObjectDelete(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken public sealed class PrmObjectDelete(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken
{ {
@ -9,5 +7,5 @@ public sealed class PrmObjectDelete(ContainerId containerId, ObjectId objectId)
public ObjectId ObjectId { get; set; } = objectId; public ObjectId ObjectId { get; set; } = objectId;
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,6 +1,4 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmObjectGet(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken public sealed class PrmObjectGet(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken
{ {
@ -9,5 +7,5 @@ public sealed class PrmObjectGet(ContainerId containerId, ObjectId objectId) : P
public ObjectId ObjectId { get; set; } = objectId; public ObjectId ObjectId { get; set; } = objectId;
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,6 +1,4 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmObjectHeadGet(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken public sealed class PrmObjectHeadGet(ContainerId containerId, ObjectId objectId) : PrmBase, ISessionToken
{ {
@ -9,5 +7,5 @@ public sealed class PrmObjectHeadGet(ContainerId containerId, ObjectId objectId)
public ObjectId ObjectId { get; set; } = objectId; public ObjectId ObjectId { get; set; } = objectId;
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,5 +1,4 @@
using System.IO; using System.IO;
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2.Parameters; namespace FrostFS.SDK.ClientV2.Parameters;
@ -37,7 +36,7 @@ public sealed class PrmObjectPut : PrmBase, ISessionToken
public byte[]? CustomBuffer { get; set; } public byte[]? CustomBuffer { get; set; }
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
internal int MaxObjectSizeCache { get; set; } internal int MaxObjectSizeCache { get; set; }

View file

@ -1,5 +1,5 @@
using FrostFS.SDK.ModelsV2; using System.Collections.Generic;
using System.Collections.Generic;
namespace FrostFS.SDK.ClientV2.Parameters; namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmObjectSearch(ContainerId containerId, params IObjectFilter[] filters) : PrmBase, ISessionToken public sealed class PrmObjectSearch(ContainerId containerId, params IObjectFilter[] filters) : PrmBase, ISessionToken
@ -17,5 +17,5 @@ public sealed class PrmObjectSearch(ContainerId containerId, params IObjectFilte
public IEnumerable<IObjectFilter> Filters { get; set; } = filters; public IEnumerable<IObjectFilter> Filters { get; set; } = filters;
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,11 +1,9 @@
using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2.Parameters;
public sealed class PrmSingleObjectPut(FrostFsObject frostFsObject) : PrmBase, ISessionToken public sealed class PrmSingleObjectPut(FrostFsObject frostFsObject) : PrmBase, ISessionToken
{ {
public FrostFsObject FrostFsObject { get; set; } = frostFsObject; public FrostFsObject FrostFsObject { get; set; } = frostFsObject;
/// <inheritdoc /> /// <inheritdoc />
public SessionToken? SessionToken { get; set; } public FrostFsSessionToken? SessionToken { get; set; }
} }

View file

@ -1,4 +1,5 @@
using System; using System;
namespace FrostFS.SDK.ClientV2.Parameters; namespace FrostFS.SDK.ClientV2.Parameters;
public class PrmWait(TimeSpan timeout, TimeSpan pollInterval) public class PrmWait(TimeSpan timeout, TimeSpan pollInterval)

View file

@ -7,7 +7,6 @@ using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.Container; using FrostFS.Container;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.Session; using FrostFS.Session;
@ -23,7 +22,7 @@ internal class ContainerServiceProvider(ContainerService.ContainerServiceClient
return await sessions.GetOrCreateSession(args, ctx); return await sessions.GetOrCreateSession(args, ctx);
} }
internal async Task<ModelsV2.Container> GetContainerAsync(PrmContainerGet args) internal async Task<FrostFsContainer> GetContainerAsync(PrmContainerGet args)
{ {
GetRequest request = GetContainerRequest(args.ContainerId.ToMessage(), args.XHeaders, args.Context!); GetRequest request = GetContainerRequest(args.ContainerId.ToMessage(), args.XHeaders, args.Context!);
@ -40,9 +39,9 @@ internal class ContainerServiceProvider(ContainerService.ContainerServiceClient
var request = new ListRequest var request = new ListRequest
{ {
Body = new ListRequest.Types.Body Body = new ()
{ {
OwnerId = ctx.OwnerId.ToMessage() OwnerId = ctx.OwnerId.ToMessage()
} }
}; };
@ -81,9 +80,7 @@ internal class ContainerServiceProvider(ContainerService.ContainerServiceClient
null, null,
ContainerSessionContext.Types.Verb.Put, ContainerSessionContext.Types.Verb.Put,
ctx.Key, ctx.Key,
ctx.PublicKeyCache); ctx.GetPublicKeyCache());
var v = sessionToken.Body.OwnerId == grpcContainer.OwnerId;
request.AddMetaHeader(args.XHeaders, sessionToken); request.AddMetaHeader(args.XHeaders, sessionToken);
@ -116,7 +113,7 @@ internal class ContainerServiceProvider(ContainerService.ContainerServiceClient
request.Body.ContainerId, request.Body.ContainerId,
ContainerSessionContext.Types.Verb.Delete, ContainerSessionContext.Types.Verb.Delete,
ctx.Key, ctx.Key,
ctx.PublicKeyCache); ctx.GetPublicKeyCache());
request.AddMetaHeader(args.XHeaders, sessionToken); request.AddMetaHeader(args.XHeaders, sessionToken);
@ -193,7 +190,7 @@ internal class ContainerServiceProvider(ContainerService.ContainerServiceClient
if (DateTime.UtcNow >= deadLine) if (DateTime.UtcNow >= deadLine)
throw new TimeoutException(); throw new TimeoutException();
if (ex.Status.Code != ModelsV2.Enums.StatusCode.ContainerNotFound) if (ex.Status.Code != FrostFsStatusCode.ContainerNotFound)
throw; throw;
if (expect == WaitExpects.Removed) if (expect == WaitExpects.Removed)

View file

@ -1,14 +1,13 @@
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using FrostFS.Netmap; using FrostFS.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using NodeInfo = FrostFS.SDK.ModelsV2.Netmap.NodeInfo;
using FrostFS.SDK.ModelsV2.Netmap;
using static FrostFS.Netmap.NetworkConfig.Types;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using static FrostFS.Netmap.NetworkConfig.Types;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
internal class NetmapServiceProvider : ContextAccessor internal class NetmapServiceProvider : ContextAccessor
@ -40,7 +39,7 @@ internal class NetmapServiceProvider : ContextAccessor
return settings; return settings;
} }
internal async Task<NodeInfo> GetLocalNodeInfoAsync(PrmNodeInfo args) internal async Task<FrostFsNodeInfo> GetLocalNodeInfoAsync(PrmNodeInfo args)
{ {
var ctx = args.Context!; var ctx = args.Context!;
var request = new LocalNodeInfoRequest var request = new LocalNodeInfoRequest

View file

@ -1,19 +1,18 @@
using System; using System;
using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Google.Protobuf;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.ClientV2.Extensions;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.Session; using FrostFS.Session;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ClientV2.Extensions; using Google.Protobuf;
using FrostFS.SDK.ClientV2.Parameters;
using System.Buffers;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -210,7 +209,7 @@ internal class ObjectServiceProvider(ObjectService.ObjectServiceClient client, C
var ctx = args.Context!; var ctx = args.Context!;
var tokenRaw = await GetOrCreateSession(args, ctx); var tokenRaw = await GetOrCreateSession(args, ctx);
var token = new ModelsV2.SessionToken(tokenRaw.Serialize()); var token = new FrostFsSessionToken(tokenRaw.Serialize());
args.SessionToken = token; args.SessionToken = token;

View file

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.Session; using FrostFS.Session;

View file

@ -4,5 +4,3 @@ internal class ContextAccessor(ClientEnvironment context)
{ {
protected ClientEnvironment Context { get; set; } = context; protected ClientEnvironment Context { get; set; } = context;
} }

View file

@ -1,5 +1,5 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;

View file

@ -1,12 +1,12 @@
using FrostFS.SDK.ModelsV2;
using Grpc.Net.Client;
using System; using System;
using System.Security.Cryptography;
using System.Buffers; using System.Buffers;
using System.Security.Cryptography;
using Grpc.Net.Client;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
public class ClientEnvironment(Client client, ECDsa? key, OwnerId? owner, GrpcChannel channel, ModelsV2.Version version) : IDisposable public class ClientEnvironment(Client client, ECDsa? key, OwnerId? owner, GrpcChannel channel, FrostFsVersion version) : IDisposable
{ {
private ArrayPool<byte> _arrayPool; private ArrayPool<byte> _arrayPool;
@ -14,7 +14,7 @@ public class ClientEnvironment(Client client, ECDsa? key, OwnerId? owner, GrpcCh
internal GrpcChannel Channel { get; private set; } = channel; internal GrpcChannel Channel { get; private set; } = channel;
internal ModelsV2.Version Version { get; } = version; internal FrostFsVersion Version { get; } = version;
internal NetworkSettings? NetworkSettings { get; set; } internal NetworkSettings? NetworkSettings { get; set; }
@ -42,7 +42,7 @@ public class ClientEnvironment(Client client, ECDsa? key, OwnerId? owner, GrpcCh
{ {
if (disposing) if (disposing)
{ {
Channel.Dispose(); Channel?.Dispose();
} }
} }
} }

View file

@ -1,7 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2.Extensions; namespace FrostFS.SDK.ClientV2.Extensions;

View file

@ -4,7 +4,6 @@ using System.Threading.Tasks;
using Grpc.Core; using Grpc.Core;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.ModelsV2;
using System.Threading; using System.Threading;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -33,7 +32,7 @@ public class ObjectReader(AsyncServerStreamingCall<GetResponse> call) : IObjectR
}; };
} }
public async Task<byte[]?> ReadChunk(CancellationToken cancellationToken = default) public async Task<ReadOnlyMemory<byte>?> ReadChunk(CancellationToken cancellationToken = default)
{ {
if (!await Call.ResponseStream.MoveNext(cancellationToken)) if (!await Call.ResponseStream.MoveNext(cancellationToken))
return null; return null;
@ -44,14 +43,14 @@ public class ObjectReader(AsyncServerStreamingCall<GetResponse> call) : IObjectR
if (response.Body.ObjectPartCase != GetResponse.Types.Body.ObjectPartOneofCase.Chunk) if (response.Body.ObjectPartCase != GetResponse.Types.Body.ObjectPartOneofCase.Chunk)
throw new InvalidOperationException("unexpected message type"); throw new InvalidOperationException("unexpected message type");
return response.Body.Chunk.ToByteArray(); return response.Body.Chunk.Memory;
} }
public void Dispose() public void Dispose()
{ {
if (!disposed) if (!disposed)
{ {
Call.Dispose(); Call?.Dispose();
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
disposed = true; disposed = true;

View file

@ -30,6 +30,6 @@ internal class ObjectStreamer(AsyncClientStreamingCall<PutRequest, PutResponse>
public void Dispose() public void Dispose()
{ {
Call.Dispose(); Call?.Dispose();
} }
} }

View file

@ -6,7 +6,6 @@ using FrostFS.Object;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -47,18 +46,21 @@ internal class ObjectTools
obj.Signature = new Refs.Signature obj.Signature = new Refs.Signature
{ {
Key = ctx.PublicKeyCache, Key = ctx.GetPublicKeyCache(),
Sign = ByteString.CopyFrom(ctx.Key.SignData(obj.ObjectId.ToByteArray())), Sign = ByteString.CopyFrom(ctx.Key.SignData(obj.ObjectId.ToByteArray())),
}; };
return obj; return obj;
} }
internal static void SetSplitValues(Header grpcHeader, ModelsV2.Split split, Context ctx) internal static void SetSplitValues(Header grpcHeader, Split split, Context ctx)
{ {
if (split == null)
return;
grpcHeader.Split = new Header.Types.Split grpcHeader.Split = new Header.Types.Split
{ {
SplitId = split.SplitId != null ? ByteString.CopyFrom(split.SplitId.ToBinary()) : null SplitId = split.SplitId?.GetMessage()
}; };
if (split.Children != null && split.Children.Count != 0) if (split.Children != null && split.Children.Count != 0)
@ -72,7 +74,7 @@ internal class ObjectTools
grpcHeader.Split.ParentHeader = grpcParentHeader; grpcHeader.Split.ParentHeader = grpcParentHeader;
grpcHeader.Split.ParentSignature = new Refs.Signature grpcHeader.Split.ParentSignature = new Refs.Signature
{ {
Key = ctx.PublicKeyCache, Key = ctx.GetPublicKeyCache(),
Sign = ByteString.CopyFrom(ctx.Key.SignData(grpcHeader.Split.Parent.ToByteArray())), Sign = ByteString.CopyFrom(ctx.Key.SignData(grpcHeader.Split.Parent.ToByteArray())),
}; };

View file

@ -24,10 +24,8 @@ namespace System
public Index(int value, bool fromEnd = false) public Index(int value, bool fromEnd = false)
{ {
if (value < 0) if (value < 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative");
}
if (fromEnd) if (fromEnd)
_value = ~value; _value = ~value;
else else
@ -52,10 +50,8 @@ namespace System
public static Index FromStart(int value) public static Index FromStart(int value)
{ {
if (value < 0) if (value < 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative");
}
return new Index(value); return new Index(value);
} }
@ -65,10 +61,8 @@ namespace System
public static Index FromEnd(int value) public static Index FromEnd(int value)
{ {
if (value < 0) if (value < 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative"); throw new ArgumentOutOfRangeException(nameof(value), "value must be non-negative");
}
return new Index(~value); return new Index(~value);
} }
@ -77,14 +71,7 @@ namespace System
{ {
get get
{ {
if (_value < 0) return _value < 0 ? ~_value : _value;
{
return ~_value;
}
else
{
return _value;
}
} }
} }
@ -202,6 +189,7 @@ namespace System
{ {
int start; int start;
var startIndex = Start; var startIndex = Start;
if (startIndex.IsFromEnd) if (startIndex.IsFromEnd)
start = length - startIndex.Value; start = length - startIndex.Value;
else else
@ -209,16 +197,15 @@ namespace System
int end; int end;
var endIndex = End; var endIndex = End;
if (endIndex.IsFromEnd) if (endIndex.IsFromEnd)
end = length - endIndex.Value; end = length - endIndex.Value;
else else
end = endIndex.Value; end = endIndex.Value;
if ((uint)end > (uint)length || (uint)start > (uint)end) if ((uint)end > (uint)length || (uint)start > (uint)end)
{
throw new ArgumentOutOfRangeException(nameof(length)); throw new ArgumentOutOfRangeException(nameof(length));
}
return (start, end - start); return (start, end - start);
} }
} }
@ -234,10 +221,8 @@ namespace System.Runtime.CompilerServices
public static T[] GetSubArray<T>(T[] array, Range range) public static T[] GetSubArray<T>(T[] array, Range range)
{ {
if (array == null) if (array == null)
{
throw new ArgumentNullException(nameof(array)); throw new ArgumentNullException(nameof(array));
}
(int offset, int length) = range.GetOffsetAndLength(array.Length); (int offset, int length) = range.GetOffsetAndLength(array.Length);
if (default(T) != null || typeof(T[]) == array.GetType()) if (default(T) != null || typeof(T[]) == array.GetType())
@ -245,10 +230,8 @@ namespace System.Runtime.CompilerServices
// We know the type of the array to be exactly T[]. // We know the type of the array to be exactly T[].
if (length == 0) if (length == 0)
{
return []; return [];
}
var dest = new T[length]; var dest = new T[length];
Array.Copy(array, offset, dest, 0, length); Array.Copy(array, offset, dest, 0, length);
return dest; return dest;

View file

@ -5,7 +5,6 @@ using System.Security.Cryptography;
using FrostFS.Refs; using FrostFS.Refs;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ProtosV2.Interfaces; using FrostFS.SDK.ProtosV2.Interfaces;
using FrostFS.Session; using FrostFS.Session;

View file

@ -1,6 +1,11 @@
using System; using System;
using System.Security.Cryptography; using System.Security.Cryptography;
using FrostFS.Refs;
using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ProtosV2.Interfaces;
using FrostFS.Session;
using Google.Protobuf; using Google.Protobuf;
using Org.BouncyCastle.Asn1.Sec; using Org.BouncyCastle.Asn1.Sec;
@ -9,11 +14,6 @@ using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers; using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Math; using Org.BouncyCastle.Math;
using FrostFS.Refs;
using FrostFS.SDK.Cryptography;
using FrostFS.Session;
using FrostFS.SDK.ProtosV2.Interfaces;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
public static class RequestSigner public static class RequestSigner

View file

@ -1,13 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Grpc.Core;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.Refs; using FrostFS.Refs;
using System.Threading;
using Grpc.Core;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
@ -29,6 +29,6 @@ internal class SearchReader(AsyncServerStreamingCall<SearchResponse> call) : IDi
public void Dispose() public void Dispose()
{ {
Call.Dispose(); Call?.Dispose();
} }
} }

View file

@ -1,6 +1,12 @@
using System; using System;
using System.Security.Cryptography; using System.Security.Cryptography;
using FrostFS.Refs;
using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ProtosV2.Interfaces;
using FrostFS.Session;
using Google.Protobuf; using Google.Protobuf;
using Org.BouncyCastle.Asn1.Sec; using Org.BouncyCastle.Asn1.Sec;
@ -9,12 +15,6 @@ using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers; using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Math; using Org.BouncyCastle.Math;
using FrostFS.Refs;
using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography;
using FrostFS.Session;
using FrostFS.SDK.ProtosV2.Interfaces;
namespace FrostFS.SDK.ClientV2; namespace FrostFS.SDK.ClientV2;
public static class Verifier public static class Verifier

View file

@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class ClientSettings public class ClientSettings
{ {
@ -13,7 +13,7 @@ public class ClientSettings
public virtual void Validate() public virtual void Validate()
{ {
var errors = CheckFields(); var errors = CheckFields();
if (errors != null) if (errors != null)
ThrowException(errors); ThrowException(errors);
} }
@ -28,7 +28,7 @@ public class ClientSettings
} }
protected static void ThrowException(List<string> errors) protected static void ThrowException(List<string> errors)
{ {
StringBuilder messages = new(); StringBuilder messages = new();
foreach (var error in errors) foreach (var error in errors)
@ -48,7 +48,7 @@ public class SingleOwnerClientSettings : ClientSettings
{ {
var errors = CheckFields(); var errors = CheckFields();
if (errors != null) if (errors != null)
ThrowException(errors); ThrowException(errors);
} }
protected List<string>? CheckFields() protected List<string>? CheckFields()
@ -59,5 +59,5 @@ public class SingleOwnerClientSettings : ClientSettings
(errors ??= []).Add(string.Format(errorTemplate, nameof(Key))); (errors ??= []).Add(string.Format(errorTemplate, nameof(Key)));
return errors; return errors;
} }
} }

View file

@ -1,13 +0,0 @@
using System;
using FrostFS.SDK.ModelsV2.Enums;
using FrostFS.SDK.ModelsV2.Netmap;
namespace FrostFS.SDK.ModelsV2;
public class Container(BasicAcl basicAcl, PlacementPolicy placementPolicy)
{
public Guid Nonce { get; set; } = Guid.NewGuid();
public BasicAcl BasicAcl { get; set; } = basicAcl;
public PlacementPolicy PlacementPolicy { get; set; } = placementPolicy;
public Version? Version { get; set; }
}

View file

@ -1,4 +1,4 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class ContainerId(string id) public class ContainerId(string id)
{ {

View file

@ -0,0 +1,11 @@
using System;
namespace FrostFS.SDK;
public class FrostFsContainer(BasicAcl basicAcl, FrostFsPlacementPolicy placementPolicy)
{
public Guid Nonce { get; set; } = Guid.NewGuid();
public BasicAcl BasicAcl { get; set; } = basicAcl;
public FrostFsPlacementPolicy PlacementPolicy { get; set; } = placementPolicy;
public FrostFsVersion? Version { get; set; }
}

View file

@ -1,6 +1,6 @@
using System.ComponentModel; using System.ComponentModel;
namespace FrostFS.SDK.ModelsV2.Enums; namespace FrostFS.SDK;
public enum BasicAcl public enum BasicAcl
{ {

View file

@ -1,6 +1,6 @@
namespace FrostFS.SDK.ModelsV2.Enums; namespace FrostFS.SDK;
public enum ObjectMatchType public enum FrostFsObjectMatchType
{ {
Unspecified = 0, Unspecified = 0,
Equals = 1, Equals = 1,

View file

@ -0,0 +1,8 @@
namespace FrostFS.SDK;
public enum FrostFsObjectType
{
Regular = 0,
Tombstone = 1,
Lock = 3
}

View file

@ -1,6 +1,6 @@
namespace FrostFS.SDK.ModelsV2.Enums; namespace FrostFS.SDK;
public enum StatusCode public enum FrostFsStatusCode
{ {
Success = 0, Success = 0,
Internal = 1024, Internal = 1024,

View file

@ -1,4 +1,4 @@
namespace FrostFS.SDK.ModelsV2.Enums; namespace FrostFS.SDK;
public enum NodeState public enum NodeState
{ {

View file

@ -1,8 +0,0 @@
namespace FrostFS.SDK.ModelsV2.Enums;
public enum ObjectType
{
Regular = 0,
Tombstone = 1,
Lock = 3
}

View file

@ -1,7 +1,8 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public enum SignatureScheme { public enum SignatureScheme
{
EcdsaSha512, EcdsaSha512,
EcdsaRfc6979Sha256, EcdsaRfc6979Sha256,
EcdsaRfc6979Sha256WalletConnect EcdsaRfc6979Sha256WalletConnect
} }

View file

@ -1,7 +1,7 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class CallStatistics public class CallStatistics
{ {
public string? MethodName { get; set; } public string? MethodName { get; set; }
public long ElapsedMicroSeconds { get; set; } public long ElapsedMicroSeconds { get; set; }
} }

View file

@ -1,7 +1,7 @@
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using System; using System;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class CheckSum public class CheckSum
{ {

View file

@ -1,4 +1,4 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class Constants public class Constants
{ {

View file

@ -1,18 +1,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FrostFS.SDK.ModelsV2.Enums;
namespace FrostFS.SDK.ModelsV2.Netmap; namespace FrostFS.SDK;
public class NodeInfo( public class FrostFsNodeInfo(
Version version, FrostFsVersion version,
NodeState state, NodeState state,
IReadOnlyCollection<string> addresses, IReadOnlyCollection<string> addresses,
IReadOnlyDictionary<string, string> attributes, IReadOnlyDictionary<string, string> attributes,
ReadOnlyMemory<byte> publicKey) ReadOnlyMemory<byte> publicKey)
{ {
public NodeState State { get; private set; } = state; public NodeState State { get; private set; } = state;
public Version Version { get; private set; } = version; public FrostFsVersion Version { get; private set; } = version;
public IReadOnlyCollection<string> Addresses { get; private set; } = addresses; public IReadOnlyCollection<string> Addresses { get; private set; } = addresses;
public IReadOnlyDictionary<string, string> Attributes { get; private set; } = attributes; public IReadOnlyDictionary<string, string> Attributes { get; private set; } = attributes;
public ReadOnlyMemory<byte> PublicKey { get; private set; } = publicKey; public ReadOnlyMemory<byte> PublicKey { get; private set; } = publicKey;

View file

@ -1,16 +1,16 @@
using System; using System;
using System.Linq; using System.Linq;
namespace FrostFS.SDK.ModelsV2.Netmap; namespace FrostFS.SDK;
public class PlacementPolicy(bool unique, params Replica[] replicas) : IComparable<PlacementPolicy> public class FrostFsPlacementPolicy(bool unique, params FrostFsReplica[] replicas) : IComparable<FrostFsPlacementPolicy>
{ {
public Replica[] Replicas { get; private set; } = replicas; public FrostFsReplica[] Replicas { get; private set; } = replicas;
public bool Unique { get; private set; } = unique; public bool Unique { get; private set; } = unique;
public int CompareTo(PlacementPolicy other) public int CompareTo(FrostFsPlacementPolicy other)
{ {
var notEqual = other == null var notEqual = other == null
|| Unique != other.Unique || Unique != other.Unique
|| Replicas.Length != other.Replicas.Length; || Replicas.Length != other.Replicas.Length;

View file

@ -1,14 +1,14 @@
namespace FrostFS.SDK.ModelsV2.Netmap; namespace FrostFS.SDK;
public class Replica public class FrostFsReplica
{ {
public int Count { get; set; } public int Count { get; set; }
public string Selector { get; set; } public string Selector { get; set; }
public Replica(int count, string? selector = null) public FrostFsReplica(int count, string? selector = null)
{ {
selector ??= string.Empty; selector ??= string.Empty;
Count = count; Count = count;
Selector = selector; Selector = selector;
} }

View file

@ -1,11 +1,11 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class Version(int major, int minor) public class FrostFsVersion(int major, int minor)
{ {
public int Major { get; set; } = major; public int Major { get; set; } = major;
public int Minor { get; set; } = minor; public int Minor { get; set; } = minor;
public bool IsSupported(Version version) public bool IsSupported(FrostFsVersion version)
{ {
return Major == version.Major; return Major == version.Major;
} }

View file

@ -1,10 +1,10 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace FrostFS.SDK.ModelsV2.Netmap; namespace FrostFS.SDK;
public class NetmapSnapshot(ulong epoch, IReadOnlyList<NodeInfo> nodeInfoCollection) public class NetmapSnapshot(ulong epoch, IReadOnlyList<FrostFsNodeInfo> nodeInfoCollection)
{ {
public ulong Epoch { get; private set; } = epoch; public ulong Epoch { get; private set; } = epoch;
public IReadOnlyList<NodeInfo> NodeInfoCollection { get; private set; } = nodeInfoCollection; public IReadOnlyList<FrostFsNodeInfo> NodeInfoCollection { get; private set; } = nodeInfoCollection;
} }

View file

@ -1,7 +1,6 @@
using System; using System;
using FrostFS.SDK.ModelsV2.Enums;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class FrostFsObject public class FrostFsObject
{ {
@ -11,7 +10,7 @@ public class FrostFsObject
/// <param name="header"></param> <summary> /// <param name="header"></param> <summary>
public FrostFsObject(ObjectHeader header) public FrostFsObject(ObjectHeader header)
{ {
Header = header; Header = header;
} }
/// <summary> /// <summary>
@ -19,17 +18,17 @@ public class FrostFsObject
/// </summary> /// </summary>
/// <param name="container"></param> /// <param name="container"></param>
/// <param name="objectType"></param> /// <param name="objectType"></param>
public FrostFsObject(ContainerId container, ObjectType objectType = ObjectType.Regular) public FrostFsObject(ContainerId container, FrostFsObjectType objectType = FrostFsObjectType.Regular)
{ {
Header = new ObjectHeader(containerId: container, type: objectType); Header = new ObjectHeader(containerId: container, type: objectType);
} }
/// <summary> /// <summary>
/// Header contains metadata for the object /// Header contains metadata for the object
/// </summary> /// </summary>
/// <value></value> /// <value></value>
public ObjectHeader Header { get; set; } public ObjectHeader Header { get; set; }
/// <summary> /// <summary>
/// The value is calculated internally as a hash of ObjectHeader. Do not use pre-calculated value is the object has been changed. /// The value is calculated internally as a hash of ObjectHeader. Do not use pre-calculated value is the object has been changed.
/// </summary> /// </summary>
@ -50,7 +49,7 @@ public class FrostFsObject
/// </summary> /// </summary>
/// <value>Reader for received data</value> /// <value>Reader for received data</value>
public IObjectReader? ObjectReader { get; set; } public IObjectReader? ObjectReader { get; set; }
/// <summary> /// <summary>
/// Applied only for the last Object in chain in case of manual multipart uploading /// Applied only for the last Object in chain in case of manual multipart uploading
/// </summary> /// </summary>
@ -74,11 +73,11 @@ public class LargeObject(ContainerId container) : FrostFsObject(container)
public class LinkObject : FrostFsObject public class LinkObject : FrostFsObject
{ {
public LinkObject(ContainerId containerId, SplitId splitId, ObjectHeader largeObjectHeader) : base (containerId) public LinkObject(ContainerId containerId, SplitId splitId, ObjectHeader largeObjectHeader) : base(containerId)
{ {
Header!.Split = new Split(splitId) Header!.Split = new Split(splitId)
{ {
ParentHeader = largeObjectHeader ParentHeader = largeObjectHeader
}; };
} }
} }

View file

@ -2,9 +2,9 @@ using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public interface IObjectReader : IDisposable public interface IObjectReader : IDisposable
{ {
Task<byte[]?> ReadChunk(CancellationToken cancellationToken = default); Task<ReadOnlyMemory<byte>?> ReadChunk(CancellationToken cancellationToken = default);
} }

View file

@ -1,4 +1,4 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class ObjectAttribute(string key, string value) public class ObjectAttribute(string key, string value)
{ {

View file

@ -1,18 +1,16 @@
using FrostFS.SDK.ModelsV2.Enums; namespace FrostFS.SDK;
namespace FrostFS.SDK.ModelsV2;
public interface IObjectFilter public interface IObjectFilter
{ {
public ObjectMatchType MatchType { get; set; } public FrostFsObjectMatchType MatchType { get; set; }
public string Key { get; set; } public string Key { get; set; }
string? GetSerializedValue(); string? GetSerializedValue();
} }
public abstract class ObjectFilter<T>(ObjectMatchType matchType, string key, T value) : IObjectFilter public abstract class ObjectFilter<T>(FrostFsObjectMatchType matchType, string key, T value) : IObjectFilter
{ {
public ObjectMatchType MatchType { get; set; } = matchType; public FrostFsObjectMatchType MatchType { get; set; } = matchType;
public string Key { get; set; } = key; public string Key { get; set; } = key;
public T Value { get; set; } = value; public T Value { get; set; } = value;
@ -29,85 +27,85 @@ public abstract class ObjectFilter<T>(ObjectMatchType matchType, string key, T v
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="key">Attribute key</param> /// <param name="key">Attribute key</param>
/// <param name="value">Attribute value</param> /// <param name="value">Attribute value</param>
public class FilterByAttribute(ObjectMatchType matchType, string key, string value) : ObjectFilter<string>(matchType, key, value) { } public class FilterByAttribute(FrostFsObjectMatchType matchType, string key, string value) : ObjectFilter<string>(matchType, key, value) { }
/// <summary> /// <summary>
/// Creates filter to search by ObjectId /// Creates filter to search by ObjectId
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="objectId">ObjectId</param> /// <param name="objectId">ObjectId</param>
public class FilterByObjectId(ObjectMatchType matchType, ObjectId objectId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderObjectID, objectId) { } public class FilterByObjectId(FrostFsObjectMatchType matchType, ObjectId objectId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderObjectID, objectId) { }
/// <summary> /// <summary>
/// Creates filter to search by OwnerId /// Creates filter to search by OwnerId
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="ownerId">ObjectId</param> /// <param name="ownerId">ObjectId</param>
public class FilterByOwnerId(ObjectMatchType matchType, OwnerId ownerId) : ObjectFilter<OwnerId>(matchType, Constants.FilterHeaderOwnerID, ownerId) {} public class FilterByOwnerId(FrostFsObjectMatchType matchType, OwnerId ownerId) : ObjectFilter<OwnerId>(matchType, Constants.FilterHeaderOwnerID, ownerId) { }
/// <summary> /// <summary>
/// Creates filter to search by Version /// Creates filter to search by Version
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="version">Version</param> /// <param name="version">Version</param>
public class FilterByVersion(ObjectMatchType matchType, Version version) : ObjectFilter<Version>(matchType, Constants.FilterHeaderVersion, version) {} public class FilterByVersion(FrostFsObjectMatchType matchType, FrostFsVersion version) : ObjectFilter<FrostFsVersion>(matchType, Constants.FilterHeaderVersion, version) { }
/// <summary> /// <summary>
/// Creates filter to search by ContainerId /// Creates filter to search by ContainerId
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="containerId">ContainerId</param> /// <param name="containerId">ContainerId</param>
public class FilterByContainerId(ObjectMatchType matchType, ContainerId containerId) : ObjectFilter<ContainerId>(matchType, Constants.FilterHeaderContainerID, containerId) {} public class FilterByContainerId(FrostFsObjectMatchType matchType, ContainerId containerId) : ObjectFilter<ContainerId>(matchType, Constants.FilterHeaderContainerID, containerId) { }
/// <summary> /// <summary>
/// Creates filter to search by creation Epoch /// Creates filter to search by creation Epoch
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="epoch">Creation Epoch</param> /// <param name="epoch">Creation Epoch</param>
public class FilterByEpoch(ObjectMatchType matchType, ulong epoch) : ObjectFilter<ulong>(matchType, Constants.FilterHeaderCreationEpoch, epoch) {} public class FilterByEpoch(FrostFsObjectMatchType matchType, ulong epoch) : ObjectFilter<ulong>(matchType, Constants.FilterHeaderCreationEpoch, epoch) { }
/// <summary> /// <summary>
/// Creates filter to search by Payload Length /// Creates filter to search by Payload Length
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="payloadLength">Payload Length</param> /// <param name="payloadLength">Payload Length</param>
public class FilterByPayloadLength(ObjectMatchType matchType, ulong payloadLength) : ObjectFilter<ulong>(matchType, Constants.FilterHeaderPayloadLength, payloadLength) {} public class FilterByPayloadLength(FrostFsObjectMatchType matchType, ulong payloadLength) : ObjectFilter<ulong>(matchType, Constants.FilterHeaderPayloadLength, payloadLength) { }
/// <summary> /// <summary>
/// Creates filter to search by Payload Hash /// Creates filter to search by Payload Hash
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="payloadHash">Payload Hash</param> /// <param name="payloadHash">Payload Hash</param>
public class FilterByPayloadHash(ObjectMatchType matchType, CheckSum payloadHash) : ObjectFilter<CheckSum>(matchType, Constants.FilterHeaderPayloadHash, payloadHash) {} public class FilterByPayloadHash(FrostFsObjectMatchType matchType, CheckSum payloadHash) : ObjectFilter<CheckSum>(matchType, Constants.FilterHeaderPayloadHash, payloadHash) { }
/// <summary> /// <summary>
/// Creates filter to search by Parent /// Creates filter to search by Parent
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="parentId">Parent</param> /// <param name="parentId">Parent</param>
public class FilterByParent(ObjectMatchType matchType, ObjectId parentId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderParent, parentId) {} public class FilterByParent(FrostFsObjectMatchType matchType, ObjectId parentId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderParent, parentId) { }
/// <summary> /// <summary>
/// Creates filter to search by SplitId /// Creates filter to search by SplitId
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="splitId">SplitId</param> /// <param name="splitId">SplitId</param>
public class FilterBySplitId(ObjectMatchType matchType, SplitId splitId) : ObjectFilter<SplitId>(matchType, Constants.FilterHeaderSplitID, splitId) {} public class FilterBySplitId(FrostFsObjectMatchType matchType, SplitId splitId) : ObjectFilter<SplitId>(matchType, Constants.FilterHeaderSplitID, splitId) { }
/// <summary> /// <summary>
/// Creates filter to search by Payload Hash /// Creates filter to search by Payload Hash
/// </summary> /// </summary>
/// <param name="matchType">Match type</param> /// <param name="matchType">Match type</param>
/// <param name="ecParentId">Payload Hash</param> /// <param name="ecParentId">Payload Hash</param>
public class FilterByECParent(ObjectMatchType matchType, ObjectId ecParentId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderECParent, ecParentId) {} public class FilterByECParent(FrostFsObjectMatchType matchType, ObjectId ecParentId) : ObjectFilter<ObjectId>(matchType, Constants.FilterHeaderECParent, ecParentId) { }
/// <summary> /// <summary>
/// Creates filter to search Root objects /// Creates filter to search Root objects
/// </summary> /// </summary>
public class FilterByRootObject() : ObjectFilter<string>(ObjectMatchType.Unspecified, Constants.FilterHeaderRoot, string.Empty) {} public class FilterByRootObject() : ObjectFilter<string>(FrostFsObjectMatchType.Unspecified, Constants.FilterHeaderRoot, string.Empty) { }
/// <summary> /// <summary>
/// Creates filter to search objects that are physically stored on the server /// Creates filter to search objects that are physically stored on the server
/// </summary /// </summary
public class FilterByPhysicallyStored() : ObjectFilter<string>(ObjectMatchType.Unspecified, Constants.FilterHeaderPhy, string.Empty) {} public class FilterByPhysicallyStored() : ObjectFilter<string>(FrostFsObjectMatchType.Unspecified, Constants.FilterHeaderPhy, string.Empty) { }

View file

@ -1,11 +1,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using FrostFS.SDK.ModelsV2.Enums;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class ObjectHeader( public class ObjectHeader(
ContainerId containerId, ContainerId containerId,
ObjectType type = ObjectType.Regular, FrostFsObjectType type = FrostFsObjectType.Regular,
params ObjectAttribute[] attributes params ObjectAttribute[] attributes
) )
{ {
@ -19,9 +18,9 @@ public class ObjectHeader(
public byte[]? PayloadCheckSum { get; set; } public byte[]? PayloadCheckSum { get; set; }
public ObjectType ObjectType { get; set; } = type; public FrostFsObjectType ObjectType { get; set; } = type;
public Version? Version { get; set; } public FrostFsVersion? Version { get; set; }
public Split? Split { get; set; } public Split? Split { get; set; }
} }

View file

@ -2,7 +2,7 @@
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class ObjectId(string id) public class ObjectId(string id)
{ {
@ -12,7 +12,7 @@ public class ObjectId(string id)
{ {
if (hash.Length != Constants.Sha256HashLength) if (hash.Length != Constants.Sha256HashLength)
throw new FormatException("ObjectID must be a sha256 hash."); throw new FormatException("ObjectID must be a sha256 hash.");
return new ObjectId(Base58.Encode(hash)); return new ObjectId(Base58.Encode(hash));
} }

View file

@ -2,7 +2,7 @@ using System.Security.Cryptography;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class OwnerId(string id) public class OwnerId(string id)
{ {

View file

@ -1,30 +1,35 @@
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using Google.Protobuf;
using System; using System;
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class SplitId public class SplitId
{ {
private Guid id; private readonly Guid id;
ByteString? _message;
public SplitId() public SplitId()
{ {
this.id = Guid.NewGuid(); id = Guid.NewGuid();
} }
public SplitId(Guid guid) public SplitId(Guid guid)
{ {
this.id = guid; id = guid;
} }
private SplitId(byte[] binary) private SplitId(byte[] binary)
{ {
this.id = new Guid(binary); id = new Guid(binary);
} }
private SplitId(string str) private SplitId(string str)
{ {
this.id = new Guid(str); id = new Guid(str);
} }
public static SplitId CreateFromBinary(byte[] binaryData) public static SplitId CreateFromBinary(byte[] binaryData)
@ -35,18 +40,23 @@ public class SplitId
public static SplitId CreateFromString(string stringData) public static SplitId CreateFromString(string stringData)
{ {
return new SplitId(stringData); return new SplitId(stringData);
} }
public override string ToString() public override string ToString()
{ {
return this.id.ToString(); return id.ToString();
} }
public byte[]? ToBinary() public byte[]? ToBinary()
{ {
if (this.id == Guid.Empty) if (id == Guid.Empty)
return null; return null;
return this.id.ToBytes(); return id.ToBytes();
}
public ByteString? GetMessage()
{
return _message ??= ByteString.CopyFrom(ToBinary());
} }
} }

View file

@ -1,7 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace FrostFS.SDK;
namespace FrostFS.SDK.ModelsV2;
public class Split(SplitId splitId) public class Split(SplitId splitId)
{ {
@ -14,8 +13,8 @@ public class Split(SplitId splitId)
public ObjectId? Parent { get; set; } public ObjectId? Parent { get; set; }
public ObjectId? Previous { get; set; } public ObjectId? Previous { get; set; }
public Signature? ParentSignature { get; set; } public FrostFsSignature? ParentSignature { get; set; }
public ObjectHeader? ParentHeader { get; set; } public ObjectHeader? ParentHeader { get; set; }

View file

@ -0,0 +1,14 @@
namespace FrostFS.SDK;
public class FrostFsResponseStatus(FrostFsStatusCode code, string? message = null)
{
public FrostFsStatusCode Code { get; set; } = code;
public string Message { get; set; } = message ?? string.Empty;
public bool IsSuccess => Code == FrostFsStatusCode.Success;
public override string ToString()
{
return $"Response status: {Code}. Message: {Message}.";
}
}

View file

@ -0,0 +1,10 @@
namespace FrostFS.SDK;
public class FrostFsSignature
{
public byte[]? Key { get; set; }
public byte[]? Sign { get; set; }
public SignatureScheme Scheme { get; set; }
}

View file

@ -1,15 +1,15 @@
namespace FrostFS.SDK.ModelsV2; namespace FrostFS.SDK;
public class MetaHeader(Version version, int epoch, int ttl) public class MetaHeader(FrostFsVersion version, int epoch, int ttl)
{ {
public Version Version { get; set; } = version; public FrostFsVersion Version { get; set; } = version;
public int Epoch { get; set; } = epoch; public int Epoch { get; set; } = epoch;
public int Ttl { get; set; } = ttl; public int Ttl { get; set; } = ttl;
public static MetaHeader Default() public static MetaHeader Default()
{ {
return new MetaHeader( return new MetaHeader(
new Version( new FrostFsVersion(
major: 2, major: 2,
minor: 13 minor: 13
), ),

View file

@ -1,16 +0,0 @@
using FrostFS.SDK.ModelsV2.Enums;
namespace FrostFS.SDK.ModelsV2;
public class ResponseStatus(StatusCode code, string? message = null)
{
public StatusCode Code { get; set; } = code;
public string Message { get; set; } = message ?? string.Empty;
public bool IsSuccess => Code == StatusCode.Success;
public override string ToString()
{
return $"Response status: {Code}. Message: {Message}.";
}
}

View file

@ -1,8 +0,0 @@
namespace FrostFS.SDK.ModelsV2;
public class Signature
{
public byte[]? Key { get; set; }
public byte[]? Sign { get; set; }
public SignatureScheme Scheme { get; set; }
}

View file

@ -0,0 +1,6 @@
namespace FrostFS.SDK;
public class FrostFsSessionToken(byte[] token)
{
public byte[] Token { get; private set; } = token;
}

View file

@ -1,6 +0,0 @@
namespace FrostFS.SDK.ModelsV2;
public class SessionToken(byte[] token)
{
public byte[] Token { get; private set; } = token;
}

View file

@ -1,14 +1,11 @@
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using FrostFS.SDK.ModelsV2.Netmap;
using FrostFS.SDK.ModelsV2.Enums;
using Google.Protobuf; using Google.Protobuf;
using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Parameters;
namespace FrostFS.SDK.Tests; namespace FrostFS.SDK.Tests;
@ -29,8 +26,8 @@ public abstract class ContainerTestsBase
Mocker = new ContainerMocker(this.key) Mocker = new ContainerMocker(this.key)
{ {
PlacementPolicy = new PlacementPolicy(true, new Replica(1)), PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
Version = new ModelsV2.Version(2, 13), Version = new FrostFsVersion(2, 13),
ContainerGuid = Guid.NewGuid() ContainerGuid = Guid.NewGuid()
}; };
} }
@ -52,7 +49,7 @@ public class ContainerTest : ContainerTestsBase
[Fact] [Fact]
public async void CreateContainerTest() public async void CreateContainerTest()
{ {
var param = new PrmContainerCreate(new ModelsV2.Container(BasicAcl.PublicRW, Mocker.PlacementPolicy)); var param = new PrmContainerCreate(new FrostFsContainer(BasicAcl.PublicRW, Mocker.PlacementPolicy));
var result = await GetClient().CreateContainerAsync(param); var result = await GetClient().CreateContainerAsync(param);

View file

@ -3,7 +3,6 @@ using FrostFS.Session;
using Google.Protobuf; using Google.Protobuf;
using Grpc.Core; using Grpc.Core;
using FrostFS.SDK.ClientV2; using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;

View file

@ -3,8 +3,6 @@ using FrostFS.Container;
using Moq; using Moq;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2.Enums;
using FrostFS.SDK.ModelsV2.Netmap;
using FrostFS.Session; using FrostFS.Session;
using Google.Protobuf; using Google.Protobuf;
@ -19,18 +17,18 @@ public abstract class ServiceBase(string key)
{ {
public string StringKey { get; private set; } = key; public string StringKey { get; private set; } = key;
public ECDsa Key { get; private set; } = key.LoadWif(); public ECDsa Key { get; private set; } = key.LoadWif();
public ModelsV2.Version Version { get; set; } = DefaultVersion; public FrostFsVersion Version { get; set; } = DefaultVersion;
public BasicAcl Acl { get; set; } = DefaultAcl; public BasicAcl Acl { get; set; } = DefaultAcl;
public PlacementPolicy PlacementPolicy { get; set; } = DefaultPlacementPolicy; public FrostFsPlacementPolicy PlacementPolicy { get; set; } = DefaultPlacementPolicy;
public static ModelsV2.Version DefaultVersion { get; } = new(2, 13); public static FrostFsVersion DefaultVersion { get; } = new(2, 13);
public static BasicAcl DefaultAcl { get; } = BasicAcl.PublicRW; public static BasicAcl DefaultAcl { get; } = BasicAcl.PublicRW;
public static PlacementPolicy DefaultPlacementPolicy { get; } = new PlacementPolicy(true, new Replica(1)); public static FrostFsPlacementPolicy DefaultPlacementPolicy { get; } = new FrostFsPlacementPolicy(true, new FrostFsReplica(1));
public Metadata Metadata { get; protected set; } public Metadata Metadata { get; protected set; }
public DateTime? DateTime { get; protected set; } public DateTime? DateTime { get; protected set; }
public CancellationToken CancellationToken { get; protected set; }
public CancellationToken CancellationToken { get; protected set; }
public CancellationTokenSource CancellationTokenSource { get; protected set; } = new CancellationTokenSource(); public CancellationTokenSource CancellationTokenSource { get; protected set; } = new CancellationTokenSource();
public static Metadata ResponseMetaData => []; public static Metadata ResponseMetaData => [];

View file

@ -5,7 +5,6 @@ using Moq;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ClientV2; using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ModelsV2.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.Session; using FrostFS.Session;

View file

@ -2,7 +2,6 @@ using Google.Protobuf;
using Grpc.Core; using Grpc.Core;
using Moq; using Moq;
using FrostFS.SDK.ClientV2; using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ModelsV2;
using FrostFS.Object; using FrostFS.Object;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using System.Security.Cryptography; using System.Security.Cryptography;

View file

@ -3,10 +3,11 @@ using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ClientV2.Interfaces; using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Enums;
using Google.Protobuf; using Google.Protobuf;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Security.Cryptography; using System.Security.Cryptography;
namespace FrostFS.SDK.Tests; namespace FrostFS.SDK.Tests;
@ -17,7 +18,7 @@ public abstract class NetworkTestsBase
protected IOptions<SingleOwnerClientSettings> Settings { get; set; } protected IOptions<SingleOwnerClientSettings> Settings { get; set; }
protected ModelsV2.Version Version { get; set; } = new ModelsV2.Version(2, 13); protected FrostFsVersion Version { get; set; } = new FrostFsVersion(2, 13);
protected ECDsa ECDsaKey { get; set; } protected ECDsa ECDsaKey { get; set; }
protected OwnerId OwnerId { get; set; } protected OwnerId OwnerId { get; set; }

View file

@ -4,11 +4,11 @@ using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Enums;
using FrostFS.SDK.ModelsV2.Netmap;
using Google.Protobuf; using Google.Protobuf;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
@ -38,16 +38,16 @@ public abstract class ObjectTestsBase
Mocker = new ObjectMocker(key) Mocker = new ObjectMocker(key)
{ {
PlacementPolicy = new PlacementPolicy(true, new Replica(1)), PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
Version = new ModelsV2.Version(2, 13), Version = new FrostFsVersion(2, 13),
ContainerGuid = Guid.NewGuid() ContainerGuid = Guid.NewGuid()
}; };
ContainerId = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes())); ContainerId = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
Mocker.ObjectHeader = new(ContainerId, ModelsV2.Enums.ObjectType.Regular, [new ObjectAttribute("k", "v")]) Mocker.ObjectHeader = new(ContainerId, FrostFsObjectType.Regular, [new ObjectAttribute("k", "v")])
{ {
Version = new ModelsV2.Version(2, 13), Version = new FrostFsVersion(2, 13),
OwnerId = OwnerId.FromKey(ecdsaKey) OwnerId = OwnerId.FromKey(ecdsaKey)
}; };
} }
@ -76,7 +76,7 @@ public class ObjectTest : ObjectTestsBase
var ctx = new Context { var ctx = new Context {
Key = ecdsaKey, Key = ecdsaKey,
OwnerId = OwnerId.FromKey(ecdsaKey), OwnerId = OwnerId.FromKey(ecdsaKey),
Version = new ModelsV2.Version(2, 13) }; Version = new FrostFsVersion(2, 13) };
var objectId = client.CalculateObjectId(Mocker.ObjectHeader!, ctx); var objectId = client.CalculateObjectId(Mocker.ObjectHeader!, ctx);
@ -256,7 +256,7 @@ public class ObjectTest : ObjectTestsBase
Assert.Equal(Mocker.HeadResponse!.PayloadLength, response.PayloadLength); Assert.Equal(Mocker.HeadResponse!.PayloadLength, response.PayloadLength);
Assert.Equal(ObjectType.Regular, response.ObjectType); Assert.Equal(FrostFsObjectType.Regular, response.ObjectType);
Assert.Single(response.Attributes); Assert.Single(response.Attributes);

View file

@ -4,9 +4,9 @@ using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap; using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Parameters; using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Netmap;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Security.Cryptography; using System.Security.Cryptography;
namespace FrostFS.SDK.Tests; namespace FrostFS.SDK.Tests;
@ -35,8 +35,8 @@ public abstract class SessionTestsBase
Mocker = new SessionMocker(this.key) Mocker = new SessionMocker(this.key)
{ {
PlacementPolicy = new PlacementPolicy(true, new Replica(1)), PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
Version = new ModelsV2.Version(2, 13) Version = new FrostFsVersion(2, 13)
}; };
} }

View file

@ -1,9 +1,6 @@
using System.Security.Cryptography; using System.Security.Cryptography;
using FrostFS.SDK.ClientV2; using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ClientV2.Interfaces; using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Enums;
using FrostFS.SDK.ModelsV2.Netmap;
using FrostFS.SDK.Cryptography; using FrostFS.SDK.Cryptography;
using Grpc.Core; using Grpc.Core;
@ -26,7 +23,7 @@ public abstract class SmokeTestsBase
protected OwnerId OwnerId { get; } protected OwnerId OwnerId { get; }
protected ModelsV2.Version Version { get; } protected FrostFsVersion Version { get; }
protected Context Ctx { get; } protected Context Ctx { get; }
@ -34,7 +31,7 @@ public abstract class SmokeTestsBase
{ {
Key = key.LoadWif(); Key = key.LoadWif();
OwnerId = OwnerId.FromKey(Key); OwnerId = OwnerId.FromKey(Key);
Version = new ModelsV2.Version(2, 13); Version = new FrostFsVersion(2, 13);
Ctx = new Context { Key = Key, OwnerId = OwnerId, Version = Version }; Ctx = new Context { Key = Key, OwnerId = OwnerId, Version = Version };
} }
@ -134,7 +131,7 @@ public class SmokeTests : SmokeTestsBase
var token = await client.CreateSessionAsync(new PrmSessionCreate(int.MaxValue)); var token = await client.CreateSessionAsync(new PrmSessionCreate(int.MaxValue));
var createContainerParam = new PrmContainerCreate( var createContainerParam = new PrmContainerCreate(
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1)))); new FrostFsContainer(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))));
createContainerParam.XHeaders.Add("key1", "value1"); createContainerParam.XHeaders.Add("key1", "value1");
@ -146,7 +143,7 @@ public class SmokeTests : SmokeTestsBase
{ {
Header = new ObjectHeader( Header = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular, type: FrostFsObjectType.Regular,
new ObjectAttribute("fileName", "test")), new ObjectAttribute("fileName", "test")),
Payload = new MemoryStream(bytes), Payload = new MemoryStream(bytes),
ClientCut = false, ClientCut = false,
@ -160,10 +157,10 @@ public class SmokeTests : SmokeTestsBase
var downloadedBytes = new byte[@object.Header.PayloadLength]; var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes); MemoryStream ms = new(downloadedBytes);
byte[]? chunk = null; ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null) while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{ {
ms.Write(chunk); ms.Write(chunk.Value.Span);
} }
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes)); Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
@ -179,7 +176,7 @@ public class SmokeTests : SmokeTestsBase
await Cleanup(client); await Cleanup(client);
var createContainerParam = new PrmContainerCreate( var createContainerParam = new PrmContainerCreate(
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1)))) new FrostFsContainer(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
{ {
WaitParams = lightWait WaitParams = lightWait
}; };
@ -190,7 +187,7 @@ public class SmokeTests : SmokeTestsBase
var ParentHeader = new ObjectHeader( var ParentHeader = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular) type: FrostFsObjectType.Regular)
{ {
PayloadLength = 3 PayloadLength = 3
}; };
@ -199,7 +196,7 @@ public class SmokeTests : SmokeTestsBase
{ {
Header = new ObjectHeader( Header = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular, type: FrostFsObjectType.Regular,
new ObjectAttribute("fileName", "test")) new ObjectAttribute("fileName", "test"))
{ {
Split = new Split(), Split = new Split(),
@ -216,25 +213,25 @@ public class SmokeTests : SmokeTestsBase
var networkInfo = await client.GetNetmapSnapshotAsync(); var networkInfo = await client.GetNetmapSnapshotAsync();
await CheckFilter(client, containerId, new FilterByContainerId(ObjectMatchType.Equals, containerId)); await CheckFilter(client, containerId, new FilterByContainerId(FrostFsObjectMatchType.Equals, containerId));
await CheckFilter(client, containerId, new FilterByOwnerId(ObjectMatchType.Equals, OwnerId.FromKey(ecdsaKey))); await CheckFilter(client, containerId, new FilterByOwnerId(FrostFsObjectMatchType.Equals, OwnerId.FromKey(ecdsaKey)));
await CheckFilter(client, containerId, new FilterBySplitId(ObjectMatchType.Equals, param.Header.Split.SplitId)); await CheckFilter(client, containerId, new FilterBySplitId(FrostFsObjectMatchType.Equals, param.Header.Split.SplitId));
await CheckFilter(client, containerId, new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test")); await CheckFilter(client, containerId, new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test"));
await CheckFilter(client, containerId, new FilterByObjectId(ObjectMatchType.Equals, objectId)); await CheckFilter(client, containerId, new FilterByObjectId(FrostFsObjectMatchType.Equals, objectId));
await CheckFilter(client, containerId, new FilterByVersion(ObjectMatchType.Equals, networkInfo.NodeInfoCollection[0].Version)); await CheckFilter(client, containerId, new FilterByVersion(FrostFsObjectMatchType.Equals, networkInfo.NodeInfoCollection[0].Version));
await CheckFilter(client, containerId, new FilterByEpoch(ObjectMatchType.Equals, networkInfo.Epoch)); await CheckFilter(client, containerId, new FilterByEpoch(FrostFsObjectMatchType.Equals, networkInfo.Epoch));
await CheckFilter(client, containerId, new FilterByPayloadLength(ObjectMatchType.Equals, 3)); await CheckFilter(client, containerId, new FilterByPayloadLength(FrostFsObjectMatchType.Equals, 3));
var checkSum = CheckSum.CreateCheckSum(bytes); var checkSum = CheckSum.CreateCheckSum(bytes);
await CheckFilter(client, containerId, new FilterByPayloadHash(ObjectMatchType.Equals, checkSum)); await CheckFilter(client, containerId, new FilterByPayloadHash(FrostFsObjectMatchType.Equals, checkSum));
await CheckFilter(client, containerId, new FilterByPhysicallyStored()); await CheckFilter(client, containerId, new FilterByPhysicallyStored());
} }
@ -276,7 +273,7 @@ public class SmokeTests : SmokeTestsBase
}; };
var createContainerParam = new PrmContainerCreate( var createContainerParam = new PrmContainerCreate(
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1)))) new FrostFsContainer(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
{ {
Context = ctx Context = ctx
}; };
@ -293,7 +290,7 @@ public class SmokeTests : SmokeTestsBase
{ {
Header = new ObjectHeader( Header = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular, type: FrostFsObjectType.Regular,
new ObjectAttribute("fileName", "test")), new ObjectAttribute("fileName", "test")),
Payload = new MemoryStream(bytes), Payload = new MemoryStream(bytes),
ClientCut = false, ClientCut = false,
@ -305,7 +302,7 @@ public class SmokeTests : SmokeTestsBase
var objectId = await client.PutObjectAsync(param); var objectId = await client.PutObjectAsync(param);
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test"); var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
bool hasObject = false; bool hasObject = false;
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter] })) await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter] }))
@ -326,10 +323,10 @@ public class SmokeTests : SmokeTestsBase
var downloadedBytes = new byte[@object.Header.PayloadLength]; var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes); MemoryStream ms = new(downloadedBytes);
byte[]? chunk = null; ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null) while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{ {
ms.Write(chunk); ms.Write(chunk.Value.Span);
} }
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes)); Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
@ -361,7 +358,7 @@ public class SmokeTests : SmokeTestsBase
}; };
var createContainerParam = new PrmContainerCreate( var createContainerParam = new PrmContainerCreate(
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1)))) new FrostFsContainer(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
{ {
Context = ctx Context = ctx
}; };
@ -377,7 +374,7 @@ public class SmokeTests : SmokeTestsBase
{ {
Header = new ObjectHeader( Header = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular, type: FrostFsObjectType.Regular,
new ObjectAttribute("fileName", "test")), new ObjectAttribute("fileName", "test")),
Payload = new MemoryStream(bytes), Payload = new MemoryStream(bytes),
ClientCut = false, ClientCut = false,
@ -390,7 +387,7 @@ public class SmokeTests : SmokeTestsBase
var objectId = await client.PutObjectAsync(param); var objectId = await client.PutObjectAsync(param);
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test"); var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
bool hasObject = false; bool hasObject = false;
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter], SessionToken = token })) await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter], SessionToken = token }))
@ -411,10 +408,10 @@ public class SmokeTests : SmokeTestsBase
var downloadedBytes = new byte[@object.Header.PayloadLength]; var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes); MemoryStream ms = new(downloadedBytes);
byte[]? chunk = null; ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null) while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{ {
ms.Write(chunk); ms.Write(chunk.Value.Span);
} }
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes)); Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
@ -440,7 +437,7 @@ public class SmokeTests : SmokeTestsBase
await Cleanup(client); await Cleanup(client);
var createContainerParam = new PrmContainerCreate(new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1)))) var createContainerParam = new PrmContainerCreate(new FrostFsContainer(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
{ {
WaitParams = lightWait WaitParams = lightWait
}; };
@ -463,7 +460,7 @@ public class SmokeTests : SmokeTestsBase
{ {
Header = new ObjectHeader( Header = new ObjectHeader(
containerId: containerId, containerId: containerId,
type: ModelsV2.Enums.ObjectType.Regular, type: FrostFsObjectType.Regular,
new ObjectAttribute("fileName", "test")), new ObjectAttribute("fileName", "test")),
Payload = new MemoryStream(bytes), Payload = new MemoryStream(bytes),
ClientCut = true ClientCut = true
@ -471,7 +468,7 @@ public class SmokeTests : SmokeTestsBase
var objectId = await client.PutObjectAsync(param); var objectId = await client.PutObjectAsync(param);
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test"); var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
bool hasObject = false; bool hasObject = false;
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId, filter))) await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId, filter)))
@ -492,10 +489,10 @@ public class SmokeTests : SmokeTestsBase
var downloadedBytes = new byte[@object.Header.PayloadLength]; var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes); MemoryStream ms = new(downloadedBytes);
byte[]? chunk = null; ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null) while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{ {
ms.Write(chunk); ms.Write(chunk.Value.Span);
} }
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes)); Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));