diff --git a/ProjectPlugins/CodexClient/CodexTypes.cs b/ProjectPlugins/CodexClient/CodexTypes.cs index f9a0d9d2..12e7c92c 100644 --- a/ProjectPlugins/CodexClient/CodexTypes.cs +++ b/ProjectPlugins/CodexClient/CodexTypes.cs @@ -66,7 +66,7 @@ namespace CodexClient public class Manifest { public string RootHash { get; set; } = string.Empty; - public ByteSize OriginalBytes { get; set; } = ByteSize.Zero; + public ByteSize DatasetSize { get; set; } = ByteSize.Zero; public ByteSize BlockSize { get; set; } = ByteSize.Zero; public bool Protected { get; set; } } diff --git a/ProjectPlugins/CodexClient/Mapper.cs b/ProjectPlugins/CodexClient/Mapper.cs index 35f872ef..69d586f8 100644 --- a/ProjectPlugins/CodexClient/Mapper.cs +++ b/ProjectPlugins/CodexClient/Mapper.cs @@ -208,7 +208,7 @@ namespace CodexClient return new Manifest { BlockSize = new ByteSize(Convert.ToInt64(manifest.BlockSize)), - OriginalBytes = new ByteSize(Convert.ToInt64(manifest.DatasetSize)), + DatasetSize = new ByteSize(Convert.ToInt64(manifest.DatasetSize)), RootHash = manifest.TreeCid, Protected = manifest.Protected }; diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs index 1ac64325..638cb9a7 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs @@ -96,8 +96,23 @@ namespace CodexContractsPlugin.Marketplace public partial class MarketplaceConfig : IMarketplaceConfigInput { - public int MaxNumberOfSlashes => this.Collateral.MaxNumberOfSlashes; - public TimeSpan PeriodDuration => TimeSpan.FromSeconds(this.Proofs.Period); + public int MaxNumberOfSlashes + { + get + { + if (Collateral == null) return -1; + return Collateral.MaxNumberOfSlashes; + } + } + + public TimeSpan PeriodDuration + { + get + { + if (Proofs == null) return TimeSpan.MinValue; + return TimeSpan.FromSeconds(this.Proofs.Period); + } + } } } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. diff --git a/Tests/CodexReleaseTests/DataTests/LocalFilesTest.cs b/Tests/CodexReleaseTests/DataTests/LocalFilesTest.cs index 4069aa49..8a69c834 100644 --- a/Tests/CodexReleaseTests/DataTests/LocalFilesTest.cs +++ b/Tests/CodexReleaseTests/DataTests/LocalFilesTest.cs @@ -33,9 +33,9 @@ namespace CodexReleaseTests.DataTests var local2 = localFiles.Content.Single(f => f.Cid == cid2); Assert.That(local1.Manifest.Protected, Is.False); - Assert.That(local1.Manifest.OriginalBytes, Is.EqualTo(size1)); + Assert.That(local1.Manifest.DatasetSize, Is.EqualTo(size1)); Assert.That(local2.Manifest.Protected, Is.False); - Assert.That(local2.Manifest.OriginalBytes, Is.EqualTo(size2)); + Assert.That(local2.Manifest.DatasetSize, Is.EqualTo(size2)); } } } diff --git a/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs b/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs index c55b3f8f..f1fcc84c 100644 --- a/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs +++ b/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs @@ -27,7 +27,7 @@ namespace CodexReleaseTests.DataTests Assert.That(spaceDiff, Is.LessThan(64.KB().SizeInBytes)); Assert.That(localDataset.Cid, Is.EqualTo(cid)); - Assert.That(localDataset.Manifest.OriginalBytes.SizeInBytes, Is.EqualTo(file.GetFilesize().SizeInBytes)); + Assert.That(localDataset.Manifest.DatasetSize.SizeInBytes, Is.EqualTo(file.GetFilesize().SizeInBytes)); } } } diff --git a/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs b/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs index d53d16dc..93b89f19 100644 --- a/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs +++ b/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs @@ -22,7 +22,7 @@ namespace CodexReleaseTests.DataTests var localDataset = downloader.DownloadStreamlessWait(cid, size); Assert.That(localDataset.Cid, Is.EqualTo(cid)); - Assert.That(localDataset.Manifest.OriginalBytes.SizeInBytes, Is.EqualTo(file.GetFilesize().SizeInBytes)); + Assert.That(localDataset.Manifest.DatasetSize.SizeInBytes, Is.EqualTo(file.GetFilesize().SizeInBytes)); // Stop the uploader node and verify that the downloader has the data. uploader.Stop(waitTillStopped: true); diff --git a/Tests/CodexReleaseTests/MarketTests/FailTest.cs b/Tests/CodexReleaseTests/MarketTests/FailTest.cs index cbd39600..dc278bcd 100644 --- a/Tests/CodexReleaseTests/MarketTests/FailTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/FailTest.cs @@ -21,7 +21,7 @@ namespace CodexReleaseTests.MarketTests [Test] [Combinatorial] public void Fail( - [Values([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])] int rerun + [Rerun] int rerun ) { var hosts = StartHosts(); diff --git a/Tests/CodexReleaseTests/MarketTests/FinishTest.cs b/Tests/CodexReleaseTests/MarketTests/FinishTest.cs index 6f97773b..6e591929 100644 --- a/Tests/CodexReleaseTests/MarketTests/FinishTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/FinishTest.cs @@ -22,12 +22,12 @@ namespace CodexReleaseTests.MarketTests protected override int NumberOfHosts => hosts; protected override int NumberOfClients => 1; protected override ByteSize HostAvailabilitySize => purchaseParams.SlotSize.Multiply(5.1); - protected override TimeSpan HostAvailabilityMaxDuration => Get8TimesConfiguredPeriodDuration() * 12; + protected override TimeSpan HostAvailabilityMaxDuration => GetContractDuration() * 2; [Test] [Combinatorial] public void Finish( - [Values([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])] int rerun + [Rerun] int rerun ) { var hosts = StartHosts(); diff --git a/Tests/CodexReleaseTests/MarketTests/MaxCapacityTest.cs b/Tests/CodexReleaseTests/MarketTests/MaxCapacityTest.cs new file mode 100644 index 00000000..cd7306d6 --- /dev/null +++ b/Tests/CodexReleaseTests/MarketTests/MaxCapacityTest.cs @@ -0,0 +1,72 @@ +using CodexClient; +using CodexReleaseTests.Utils; +using NUnit.Framework; +using Utils; + +namespace CodexReleaseTests.MarketTests +{ + public class MaxCapacityTest : MarketplaceAutoBootstrapDistTest + { + private readonly TestToken pricePerBytePerSecond = 10.TstWei(); + private readonly PurchaseParams purchaseParams = new PurchaseParams( + nodes: 10, + tolerance: 5, + uploadFilesize: 10.MB() + ); + + protected override int NumberOfHosts => purchaseParams.Nodes / 2; + protected override int NumberOfClients => 1; + protected override ByteSize HostAvailabilitySize => purchaseParams.SlotSize.Multiply(2.1); + protected override TimeSpan HostAvailabilityMaxDuration => GetContractDuration() * 2; + + [Test] + [Combinatorial] + public void TwoSlotsEach( + [Rerun] int rerun + ) + { + var hosts = StartHosts(); + var client = StartClients().Single(); + AssertHostAvailabilitiesAreEmpty(hosts); + + var request = CreateStorageRequest(client); + + request.WaitForStorageContractSubmitted(); + AssertContractIsOnChain(request); + + WaitForContractStarted(request); + AssertContractSlotsAreFilledByHosts(request, hosts); + } + + private IStoragePurchaseContract CreateStorageRequest(ICodexNode client) + { + var cid = client.UploadFile(GenerateTestFile(purchaseParams.UploadFilesize)); + var config = GetContracts().Deployment.Config; + return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) + { + Duration = GetContractDuration(), + Expiry = GetContractExpiry(), + MinRequiredNumberOfNodes = (uint)purchaseParams.Nodes, + NodeFailureTolerance = (uint)purchaseParams.Tolerance, + PricePerBytePerSecond = pricePerBytePerSecond, + ProofProbability = 20, + CollateralPerByte = 100.TstWei() + }); + } + + private TimeSpan GetContractExpiry() + { + return GetContractDuration() / 2; + } + + private TimeSpan GetContractDuration() + { + return Get8TimesConfiguredPeriodDuration(); + } + + private TimeSpan Get8TimesConfiguredPeriodDuration() + { + return GetPeriodDuration() * 8.0; + } + } +} diff --git a/Tests/CodexReleaseTests/MarketTests/RepairTest.cs b/Tests/CodexReleaseTests/MarketTests/RepairTest.cs index c515f639..90f87f77 100644 --- a/Tests/CodexReleaseTests/MarketTests/RepairTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/RepairTest.cs @@ -34,7 +34,7 @@ namespace CodexReleaseTests.MarketTests [Test] [Combinatorial] public void RollingRepairSingleFailure( - [Values([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])] int rerun, + [Rerun] int rerun, [Values(10)] int numFailures) { var hosts = StartHosts().ToList(); diff --git a/Tests/CodexReleaseTests/MarketTests/SequentialContracts.cs b/Tests/CodexReleaseTests/MarketTests/SequentialContracts.cs index 383093cf..199ff470 100644 --- a/Tests/CodexReleaseTests/MarketTests/SequentialContracts.cs +++ b/Tests/CodexReleaseTests/MarketTests/SequentialContracts.cs @@ -21,7 +21,7 @@ namespace CodexReleaseTests.MarketTests protected override int NumberOfHosts => hosts; protected override int NumberOfClients => 6; protected override ByteSize HostAvailabilitySize => purchaseParams.SlotSize.Multiply(100.0); - protected override TimeSpan HostAvailabilityMaxDuration => Get8TimesConfiguredPeriodDuration() * 12; + protected override TimeSpan HostAvailabilityMaxDuration => GetContractDuration() * 2; private readonly TestToken pricePerBytePerSecond = 10.TstWei(); [Test] diff --git a/Tests/CodexReleaseTests/MarketTests/StartTest.cs b/Tests/CodexReleaseTests/MarketTests/StartTest.cs index c64aef2a..18008138 100644 --- a/Tests/CodexReleaseTests/MarketTests/StartTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/StartTest.cs @@ -23,7 +23,7 @@ namespace CodexReleaseTests.MarketTests [Test] [Combinatorial] public void Start( - [Values([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])] int rerun + [Rerun] int rerun ) { var hosts = StartHosts(); diff --git a/Tests/CodexReleaseTests/RerunAttribute.cs b/Tests/CodexReleaseTests/RerunAttribute.cs new file mode 100644 index 00000000..d30b010d --- /dev/null +++ b/Tests/CodexReleaseTests/RerunAttribute.cs @@ -0,0 +1,16 @@ +using NUnit.Framework; + +namespace CodexReleaseTests +{ + public class RerunAttribute : ValuesAttribute + { + private const int NumberOfReRuns = 8; + + public RerunAttribute() + { + var list = new List(); + for (var i = 0; i < NumberOfReRuns; i++) list.Add(i); + data = list.ToArray(); + } + } +} diff --git a/Tools/BiblioTech/CodexChecking/CodexTwoWayChecker.cs b/Tools/BiblioTech/CodexChecking/CodexTwoWayChecker.cs index ac83ccd9..1dc6b681 100644 --- a/Tools/BiblioTech/CodexChecking/CodexTwoWayChecker.cs +++ b/Tools/BiblioTech/CodexChecking/CodexTwoWayChecker.cs @@ -163,7 +163,7 @@ namespace BiblioTech.CodexChecking private bool IsManifestLengthCompatible(ICheckResponseHandler handler, TransferCheck check, Manifest manifest) { var dataLength = check.UniqueData.Length; - var manifestLength = manifest.OriginalBytes.SizeInBytes; + var manifestLength = manifest.DatasetSize.SizeInBytes; Log($"Checking manifest length: dataLength={dataLength},manifestLength={manifestLength}"); diff --git a/Tools/TraceContract/Output.cs b/Tools/TraceContract/Output.cs index be89d3f6..6365037b 100644 --- a/Tools/TraceContract/Output.cs +++ b/Tools/TraceContract/Output.cs @@ -86,11 +86,6 @@ namespace TraceContract Add(requestEvent.Block.Utc, $"Slot reservations full. Index: {slotIndex}"); } - public void LogReserveSlotCalls(ReserveSlotFunction[] reserveSlotFunctions) - { - foreach (var call in reserveSlotFunctions) LogReserveSlotCall(call); - } - public void WriteContractEvents() { var sorted = entries.OrderBy(e => e.Utc).ToArray();