mirror of
https://github.com/logos-storage/logos-storage-nim-cs-dist-tests.git
synced 2026-05-10 11:29:26 +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>
151 lines
5.1 KiB
C#
151 lines
5.1 KiB
C#
using LogosStorageClient;
|
|
using LogosStorageTests;
|
|
using NUnit.Framework;
|
|
using Utils;
|
|
|
|
namespace ExperimentalTests.DownloadConnectivityTests
|
|
{
|
|
/// <summary>
|
|
/// https://hackmd.io/rwPtPJ7KTw6cGjhN0zNYig
|
|
/// </summary>
|
|
[TestFixture]
|
|
public class DatalayerReliabilityTests : AutoBootstrapDistTest
|
|
{
|
|
[Test]
|
|
[Combinatorial]
|
|
public void SingleSetTest(
|
|
[Values(1000)] int fileSizeMb,
|
|
[Values(10, 20, 30)] int numDownloaders
|
|
)
|
|
{
|
|
var file = GenerateTestFile(fileSizeMb.MB());
|
|
var uploader = StartLogosStorage(n => n.WithName("uploader"));
|
|
var downloaders = StartLogosStorage(numDownloaders, n => n.WithName("downloader"));
|
|
|
|
var cid = uploader.UploadFile(file);
|
|
|
|
var downloadTasks = new List<Task>();
|
|
foreach (var dl in downloaders)
|
|
{
|
|
downloadTasks.Add(Task.Run(() =>
|
|
{
|
|
dl.DownloadContent(cid);
|
|
}));
|
|
}
|
|
|
|
Task.WaitAll(downloadTasks.ToArray());
|
|
|
|
Assert.That(downloadTasks.All(t => !t.IsFaulted));
|
|
}
|
|
|
|
public class TransferPlan
|
|
{
|
|
public IStorageNode Uploader { get; set; } = null!;
|
|
public ContentId Cid { get; set; } = null!;
|
|
public List<DownloaderPlan> Downloaders { get; } = new List<DownloaderPlan>();
|
|
}
|
|
|
|
public class DownloaderPlan
|
|
{
|
|
public IStorageNode Node { get; set; } = null!;
|
|
public List<TransferPlan> TransferPlans { get; } = new List<TransferPlan>();
|
|
}
|
|
|
|
public class AvailableDownloaders
|
|
{
|
|
private readonly List<DownloaderPlan> all = new List<DownloaderPlan>();
|
|
private readonly List<DownloaderPlan> available = new List<DownloaderPlan>();
|
|
private readonly int maxUsagePerDownloader;
|
|
private readonly int numDownloadersPerPlan;
|
|
|
|
public AvailableDownloaders(int maxUsagePerDownloader, int numDownloadersPerPlan)
|
|
{
|
|
this.maxUsagePerDownloader = maxUsagePerDownloader;
|
|
this.numDownloadersPerPlan = numDownloadersPerPlan;
|
|
}
|
|
|
|
public void Assign(TransferPlan plan)
|
|
{
|
|
while (plan.Downloaders.Count < numDownloadersPerPlan)
|
|
{
|
|
var open = available.Where(a => !plan.Downloaders.Contains(a)).ToArray();
|
|
if (!open.Any())
|
|
{
|
|
var dl = new DownloaderPlan();
|
|
all.Add(dl);
|
|
available.Add(dl);
|
|
}
|
|
else
|
|
{
|
|
var dl = RandomUtils.GetOneRandom(open);
|
|
dl.TransferPlans.Add(plan);
|
|
plan.Downloaders.Add(dl);
|
|
|
|
if (dl.TransferPlans.Count == maxUsagePerDownloader) available.Remove(dl);
|
|
}
|
|
}
|
|
}
|
|
|
|
public DownloaderPlan[] GetAll()
|
|
{
|
|
return all.ToArray();
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
[Combinatorial]
|
|
public void MultiSetTest(
|
|
[Values(1, 3, 5, 10)] int numDatasets,
|
|
[Values(1, 10, 100, 1000)] int fileSizeMb,
|
|
[Values(5, 10, 20, 30)] int numDownloadersPerDataset,
|
|
[Values(3, 5)] int maxDatasetsPerDownloader
|
|
)
|
|
{
|
|
var plans = new List<TransferPlan>();
|
|
var uploaders = StartLogosStorage(numDatasets, n => n.WithName("uploader"));
|
|
foreach (var n in uploaders)
|
|
{
|
|
plans.Add(new TransferPlan
|
|
{
|
|
Uploader = n,
|
|
Cid = n.UploadFile(GenerateTestFile(fileSizeMb.MB()))
|
|
});
|
|
}
|
|
|
|
Assert.That(plans.Count, Is.GreaterThan(0));
|
|
|
|
var available = new AvailableDownloaders(maxDatasetsPerDownloader, numDownloadersPerDataset);
|
|
foreach (var plan in plans)
|
|
{
|
|
available.Assign(plan);
|
|
}
|
|
var allDownloaderPlans = available.GetAll();
|
|
Assert.That(allDownloaderPlans.Length, Is.LessThan(100));
|
|
Log($"Using {allDownloaderPlans.Length} downloaders...");
|
|
var nodes = StartLogosStorage(allDownloaderPlans.Length, n => n.WithName("downloader"));
|
|
for (var i = 0; i < allDownloaderPlans.Length; i++)
|
|
{
|
|
allDownloaderPlans[i].Node = nodes[i];
|
|
}
|
|
|
|
var downloadTasks = new List<Task>();
|
|
foreach (var dlPlan in allDownloaderPlans)
|
|
{
|
|
downloadTasks.Add(Task.Run(() =>
|
|
{
|
|
var tf = dlPlan.TransferPlans.ToList();
|
|
while (tf.Count > 0)
|
|
{
|
|
var t = tf.PickOneRandom();
|
|
dlPlan.Node.DownloadContent(t.Cid);
|
|
}
|
|
}));
|
|
}
|
|
|
|
Task.WaitAll(downloadTasks.ToArray());
|
|
|
|
Assert.That(downloadTasks.All(t => !t.IsFaulted));
|
|
}
|
|
}
|
|
}
|