Skip to content

Commit f7fa35c

Browse files
committed
Implements center service
1 parent a7526aa commit f7fa35c

File tree

4 files changed

+150
-14
lines changed

4 files changed

+150
-14
lines changed
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<PropertyGroup>
4-
<ActiveDebugProfile>Container (Dockerfile)</ActiveDebugProfile>
4+
<ActiveDebugProfile>IIS Express</ActiveDebugProfile>
5+
</PropertyGroup>
6+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
7+
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
58
</PropertyGroup>
69
</Project>

AutoClientCenter/CidRepo.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
namespace AutoClientCenter
2+
{
3+
public class CidRepo
4+
{
5+
private readonly Random random = new Random();
6+
private readonly object _lock = new object();
7+
private readonly List<CidEntry> entries = new List<CidEntry>();
8+
9+
public void Add(string cid, long knownSize)
10+
{
11+
lock (_lock)
12+
{
13+
entries.Add(new CidEntry(cid, knownSize));
14+
}
15+
}
16+
17+
public void AddEncoded(string originalCid, string encodedCid)
18+
{
19+
lock (_lock)
20+
{
21+
var entry = entries.SingleOrDefault(e => e.Cid == originalCid);
22+
if (entry == null) return;
23+
24+
entry.Encoded = encodedCid;
25+
}
26+
}
27+
28+
public void Assign(AcDownloadStep downloadStep)
29+
{
30+
lock (_lock)
31+
{
32+
while (true)
33+
{
34+
if (!entries.Any()) return;
35+
36+
var i = random.Next(0, entries.Count);
37+
var entry = entries[i];
38+
39+
if (entry.CreatedUtc < (DateTime.UtcNow + TimeSpan.FromHours(18)))
40+
{
41+
entries.RemoveAt(i);
42+
}
43+
else
44+
{
45+
downloadStep.Cid = entry.Cid;
46+
return;
47+
}
48+
}
49+
}
50+
}
51+
52+
public long? GetSizeKbsForCid(string cid)
53+
{
54+
lock (_lock)
55+
{
56+
var entry = entries.SingleOrDefault(e => e.Cid == cid);
57+
if (entry == null) return null;
58+
return entry.KnownSize;
59+
}
60+
}
61+
}
62+
63+
public class CidEntry
64+
{
65+
public CidEntry(string cid, long knownSize)
66+
{
67+
Cid = cid;
68+
KnownSize = knownSize;
69+
}
70+
71+
public string Cid { get; }
72+
public string Encoded { get; set; } = string.Empty;
73+
public long KnownSize { get; }
74+
public DateTime CreatedUtc { get; } = DateTime.UtcNow;
75+
}
76+
}

AutoClientCenter/Model.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
public class AcTasks
44
{
5-
public TimeSpan StartTaskEvery { get; set; } = TimeSpan.FromHours(6);
5+
public int StartTaskEverySeconds { get; set; }
66
public AcTask[] Tasks { get; set; } = Array.Empty<AcTask>();
77
}
88

@@ -36,28 +36,25 @@ public class AcStoreStep
3636
public int Price { get; set; }
3737
public int RequiredCollateral { get; set; }
3838
public string? ResultPurchaseId { get; set; }
39-
public string? ResultCid { get; set; }
39+
public string? ResultOriginalCid { get; set; }
40+
public string? ResultEncodedCid { get; set; }
4041
}
4142

4243
public class AcDownloadStep
4344
{
44-
public string[] Cids { get; set; } = Array.Empty<string>();
45-
public long[] ResultDownloadTimeSeconds { get; set; } = Array.Empty<long>();
45+
public string Cid { get; set; } = string.Empty;
46+
public long ResultDownloadTimeMilliseconds { get; set; }
4647
}
4748

4849
public class AcStats
4950
{
50-
public int NumberOfAutoClients { get; set; } todo send client peerId
51-
5251
public DateTime ServiceStartUtc { get; set; } = DateTime.MinValue;
5352
public int TotalUploads { get; set; }
5453
public int TotalUploadsFailed { get; set; }
5554
public int TotalDownloads { get; set; }
56-
public long[] DownloadTimesSeconds { get; set; } = Array.Empty<long>();
55+
public long[] DownloadTimesMillisecondsPerKb { get; set; } = Array.Empty<long>();
5756
public int TotalDownloadsFailed { get; set; }
5857
public int TotalContractsStarted { get; set; }
59-
public int TotalContractsCompleted { get; set; }
60-
public int TotalContractsExpired { get; set; }
61-
public int TotalContractsFailed { get; set; }
58+
public int TotalContractStartsFailed { get; set; }
6259
}
6360
}

AutoClientCenter/TaskService.cs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public interface ITaskService
1010

1111
public class TaskService : ITaskService
1212
{
13+
private readonly CidRepo cidRepo = new CidRepo();
1314
private readonly List<long> downloadTimes = new List<long>();
1415
private readonly AcStats stats = new AcStats
1516
{
@@ -18,23 +19,31 @@ public class TaskService : ITaskService
1819

1920
private AcTasks tasks = new AcTasks
2021
{
21-
StartTaskEvery = TimeSpan.FromHours(8),
22+
StartTaskEverySeconds = Convert.ToInt32(TimeSpan.FromHours(8).TotalSeconds),
2223
Tasks = Array.Empty<AcTask>()
2324
};
2425

2526
public AcStats GetStats()
2627
{
28+
stats.DownloadTimesMillisecondsPerKb = downloadTimes.ToArray();
2729
return stats;
2830
}
2931

3032
public AcTasks GetTasks()
3133
{
34+
foreach (var task in tasks.Tasks)
35+
{
36+
foreach (var step in task.Steps)
37+
{
38+
if (step.DownloadStep != null) cidRepo.Assign(step.DownloadStep);
39+
}
40+
}
3241
return tasks;
3342
}
3443

3544
public void SetConfig(AcTasks newTasks)
3645
{
37-
if (newTasks.StartTaskEvery < TimeSpan.FromMinutes(10)) return;
46+
if (newTasks.StartTaskEverySeconds < (10 * 60)) return;
3847
foreach (var task in newTasks.Tasks)
3948
{
4049
if (task.ChanceWeight < 1) return;
@@ -50,7 +59,58 @@ public void SetConfig(AcTasks newTasks)
5059

5160
public void ProcessResults(AcTaskStep[] taskSteps)
5261
{
53-
throw new NotImplementedException();
62+
foreach (var step in taskSteps) ProcessResults(step);
63+
}
64+
65+
private void ProcessResults(AcTaskStep step)
66+
{
67+
ProcessResult(step.UploadStep);
68+
ProcessResult(step.StoreStep);
69+
ProcessResult(step.DownloadStep);
70+
}
71+
72+
private void ProcessResult(AcUploadStep? uploadStep)
73+
{
74+
if (uploadStep == null) return;
75+
76+
if (string.IsNullOrWhiteSpace(uploadStep.ResultCid))
77+
{
78+
stats.TotalUploadsFailed++;
79+
}
80+
else
81+
{
82+
stats.TotalUploads++;
83+
cidRepo.Add(uploadStep.ResultCid, uploadStep.SizeInBytes);
84+
}
85+
}
86+
87+
private void ProcessResult(AcStoreStep? storeStep)
88+
{
89+
if (storeStep == null) return;
90+
91+
if (string.IsNullOrWhiteSpace(storeStep.ResultOriginalCid) ||
92+
string.IsNullOrWhiteSpace(storeStep.ResultEncodedCid) ||
93+
string.IsNullOrWhiteSpace(storeStep.ResultPurchaseId))
94+
{
95+
stats.TotalContractStartsFailed++;
96+
}
97+
else
98+
{
99+
stats.TotalContractsStarted++;
100+
cidRepo.AddEncoded(storeStep.ResultOriginalCid, storeStep.ResultEncodedCid);
101+
}
102+
}
103+
104+
private void ProcessResult(AcDownloadStep? downloadStep)
105+
{
106+
if (downloadStep == null) return;
107+
108+
var kbs = cidRepo.GetSizeKbsForCid(downloadStep.Cid);
109+
if (kbs == null) return;
110+
var milliseconds = downloadStep.ResultDownloadTimeMilliseconds;
111+
112+
var millisecondsPerKb = milliseconds / kbs.Value;
113+
downloadTimes.Add(millisecondsPerKb);
54114
}
55115
}
56116
}

0 commit comments

Comments
 (0)