Skip to content

Commit db4c4a8

Browse files
committed
Rewarderbot: Speeds up time segments when catching up to realtime.
1 parent ffb5eb2 commit db4c4a8

File tree

4 files changed

+67
-18
lines changed

4 files changed

+67
-18
lines changed

ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,19 @@ public ChainState(ILog log, ICodexContracts contracts, IChainStateChangeHandler
4848
public TimeRange TotalSpan { get; private set; }
4949
public IChainStateRequest[] Requests => requests.ToArray();
5050

51-
public void Update()
51+
public int Update()
5252
{
53-
Update(DateTime.UtcNow);
53+
return Update(DateTime.UtcNow);
5454
}
5555

56-
public void Update(DateTime toUtc)
56+
public int Update(DateTime toUtc)
5757
{
5858
var span = new TimeRange(TotalSpan.To, toUtc);
5959
var events = ChainEvents.FromTimeRange(contracts, span);
6060
Apply(events);
6161

6262
TotalSpan = new TimeRange(TotalSpan.From, span.To);
63+
return events.All.Length;
6364
}
6465

6566
private void Apply(ChainEvents events)

Tools/MarketInsights/AverageHistory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public AverageHistory(AppState appState, ICodexContracts contracts, int maxContr
2323

2424
public MarketTimeSegment[] Segments { get; private set; } = Array.Empty<MarketTimeSegment>();
2525

26-
public Task OnNewSegment(TimeRange timeRange)
26+
public Task<TimeSegmentResponse> OnNewSegment(TimeRange timeRange)
2727
{
2828
var contribution = BuildContribution(timeRange);
2929
contributions.Add(contribution);
@@ -35,7 +35,7 @@ public Task OnNewSegment(TimeRange timeRange)
3535

3636
Segments = contributions.ToArray();
3737

38-
return Task.CompletedTask;
38+
return Task.FromResult(TimeSegmentResponse.OK);
3939
}
4040

4141
private MarketTimeSegment BuildContribution(TimeRange timeRange)

Tools/TestNetRewarder/Processor.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,18 @@ public Processor(Configuration config, BotClient client, ICodexContracts contrac
3131
chainState = new ChainState(log, contracts, handler, config.HistoryStartUtc);
3232
}
3333

34-
public async Task OnNewSegment(TimeRange timeRange)
34+
public async Task<TimeSegmentResponse> OnNewSegment(TimeRange timeRange)
3535
{
3636
try
3737
{
38-
chainState.Update(timeRange.To);
38+
var sw = System.Diagnostics.Stopwatch.StartNew();
39+
var numberOfChainEvents = await ProcessEvents(timeRange);
40+
var duration = sw.Elapsed;
3941

40-
var events = eventsFormatter.GetEvents();
41-
42-
var request = builder.Build(events);
43-
if (request.HasAny())
44-
{
45-
await client.SendRewards(request);
46-
}
42+
if (numberOfChainEvents == 0) return TimeSegmentResponse.Underload;
43+
if (numberOfChainEvents > 10) return TimeSegmentResponse.Overload;
44+
if (duration > TimeSpan.FromSeconds(1)) return TimeSegmentResponse.Overload;
45+
return TimeSegmentResponse.OK;
4746
}
4847
catch (Exception ex)
4948
{
@@ -53,5 +52,19 @@ public async Task OnNewSegment(TimeRange timeRange)
5352
throw;
5453
}
5554
}
55+
56+
private async Task<int> ProcessEvents(TimeRange timeRange)
57+
{
58+
var numberOfChainEvents = chainState.Update(timeRange.To);
59+
60+
var events = eventsFormatter.GetEvents();
61+
62+
var request = builder.Build(events);
63+
if (request.HasAny())
64+
{
65+
await client.SendRewards(request);
66+
}
67+
return numberOfChainEvents;
68+
}
5669
}
5770
}

Tools/TestNetRewarder/TimeSegmenter.cs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,24 @@ namespace TestNetRewarder
55
{
66
public interface ITimeSegmentHandler
77
{
8-
Task OnNewSegment(TimeRange timeRange);
8+
Task<TimeSegmentResponse> OnNewSegment(TimeRange timeRange);
9+
}
10+
11+
public enum TimeSegmentResponse
12+
{
13+
OK,
14+
Underload,
15+
Overload
916
}
1017

1118
public class TimeSegmenter
1219
{
20+
private const int maxSegmentMult = 50;
1321
private readonly ILog log;
1422
private readonly ITimeSegmentHandler handler;
1523
private readonly TimeSpan segmentSize;
1624
private DateTime latest;
25+
private int currentSegmentMult = 1;
1726

1827
public TimeSegmenter(ILog log, TimeSpan segmentSize, DateTime historyStartUtc, ITimeSegmentHandler handler)
1928
{
@@ -30,19 +39,45 @@ public TimeSegmenter(ILog log, TimeSpan segmentSize, DateTime historyStartUtc, I
3039

3140
public async Task ProcessNextSegment()
3241
{
33-
var end = latest + segmentSize;
42+
var end = GetNewSegmentEnd();
3443
IsRealtime = await WaitUntilTimeSegmentInPast(end);
3544

3645
if (Program.CancellationToken.IsCancellationRequested) return;
3746

3847
var postfix = "(Catching up...)";
3948
if (IsRealtime) postfix = "(Real-time)";
40-
log.Log($"Time segment [{latest} to {end}] {postfix}");
49+
log.Log($"Time segment [{latest} to {end}] {postfix}({currentSegmentMult}x)");
4150

4251
var range = new TimeRange(latest, end);
4352
latest = end;
4453

45-
await handler.OnNewSegment(range);
54+
var response = await handler.OnNewSegment(range);
55+
HandleResponse(response);
56+
}
57+
58+
private DateTime GetNewSegmentEnd()
59+
{
60+
if (IsRealtime) return latest + segmentSize;
61+
var segment = segmentSize * currentSegmentMult;
62+
return latest + segment;
63+
}
64+
65+
private void HandleResponse(TimeSegmentResponse response)
66+
{
67+
switch (response)
68+
{
69+
case TimeSegmentResponse.OK:
70+
if (currentSegmentMult > 1) currentSegmentMult--;
71+
break;
72+
case TimeSegmentResponse.Underload:
73+
if (currentSegmentMult < maxSegmentMult) currentSegmentMult++;
74+
break;
75+
case TimeSegmentResponse.Overload:
76+
currentSegmentMult = 1;
77+
break;
78+
default:
79+
throw new Exception("Unknown response type: " + response);
80+
}
4681
}
4782

4883
private async Task<bool> WaitUntilTimeSegmentInPast(DateTime end)

0 commit comments

Comments
 (0)