mirror of
https://github.com/logos-storage/logos-storage-nim-cs-dist-tests.git
synced 2026-05-07 09:59:28 +00:00
* ci(docker): build dist-tests images * Update to .net 10, kubernetes client 18.0.13 Kubernetes client 18.0.13 is compatible with Kubernetes 1.34.x. The Kubernetes version is selected automatically by kubeadm in docker desktop (v1.34.1). See https://github.com/kubernetes-client/csharp#version-compatibility for a compatibility table. * Updates to support Kubernetes upgrade * bump openapi.yaml to match openapi.yaml in the logos-storage-nim docker image * bump doc to .net 10 * bump docker to .net 10 * Build image with latest tag always Always build an image with a latest tag (as well as a sha commit hash) when there's a push to master * docker image tag as "latest" only when pushing to master * Update docker image to install doctl * Remove doctl install kubeconfig is now created and uses a plain bearer token instead of using doctl as a credential mgr * Rename and remove all instances of Codex * Further remove CodexNetDeployer as it is no longer needed --------- Co-authored-by: Adam Uhlíř <adam@uhlir.dev>
69 lines
2.2 KiB
C#
69 lines
2.2 KiB
C#
using System.Numerics;
|
|
using Utils;
|
|
using YamlDotNet.Core.Tokens;
|
|
|
|
namespace StoragePlugin.OverwatchSupport
|
|
{
|
|
public class KademliaPositionFinder
|
|
{
|
|
public StorageNodeIdentity[] DeterminePositions(StorageNodeIdentity[] identities)
|
|
{
|
|
var zero = identities.First();
|
|
var distances = CalculateDistances(zero, identities);
|
|
|
|
var maxDistance = distances.Values.Max();
|
|
CalculateNormalizedPositions(distances, maxDistance);
|
|
|
|
return identities;
|
|
}
|
|
|
|
private Dictionary<StorageNodeIdentity, BigInteger> CalculateDistances(StorageNodeIdentity zero, StorageNodeIdentity[] identities)
|
|
{
|
|
var result = new Dictionary<StorageNodeIdentity, BigInteger>();
|
|
foreach (var id in identities.Skip(1))
|
|
{
|
|
result.Add(id, GetDistance(zero.NodeId, id.NodeId));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private BigInteger GetDistance(string id1, string id2)
|
|
{
|
|
var one = BigInteger.Parse(id1, System.Globalization.NumberStyles.HexNumber).ToByteArray();
|
|
var two = BigInteger.Parse(id2, System.Globalization.NumberStyles.HexNumber).ToByteArray();
|
|
|
|
var x = Xor(one, two);
|
|
return new BigInteger(x, isUnsigned: true);
|
|
}
|
|
|
|
private byte[] Xor(byte[] one, byte[] two)
|
|
{
|
|
if (one.Length != two.Length) throw new Exception("Not equal length");
|
|
|
|
var result = new byte[one.Length];
|
|
for (int i = 0; i < one.Length; i++)
|
|
{
|
|
uint a = one[i];
|
|
uint b = two[i];
|
|
uint c = (a ^ b);
|
|
result[i] = (byte)c;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private void CalculateNormalizedPositions(Dictionary<StorageNodeIdentity, BigInteger> distances, BigInteger maxDistance)
|
|
{
|
|
foreach (var pair in distances)
|
|
{
|
|
pair.Key.KademliaNormalizedPosition = DeterminePosition(pair.Value, maxDistance);
|
|
}
|
|
}
|
|
|
|
private float DeterminePosition(BigInteger value, BigInteger maxDistance)
|
|
{
|
|
var f = (value * 10000) / maxDistance;
|
|
return ((float)f) / 10000.0f;
|
|
}
|
|
}
|
|
}
|