Fixes incorrect block numbers in eventFormatter

This commit is contained in:
Ben 2024-06-27 11:43:25 +02:00
parent a92455b2a5
commit 52a02abd3f
No known key found for this signature in database
GPG Key ID: 541B9D8C9F1426A1
7 changed files with 105 additions and 91 deletions

View File

@ -1,6 +1,7 @@
using CodexContractsPlugin.Marketplace; using CodexContractsPlugin.Marketplace;
using GethPlugin; using GethPlugin;
using Logging; using Logging;
using NethereumWorkflow.BlockUtils;
using System.Numerics; using System.Numerics;
using Utils; using Utils;
@ -8,12 +9,24 @@ namespace CodexContractsPlugin.ChainMonitor
{ {
public interface IChainStateChangeHandler public interface IChainStateChangeHandler
{ {
void OnNewRequest(IChainStateRequest request); void OnNewRequest(RequestEvent requestEvent);
void OnRequestFinished(IChainStateRequest request); void OnRequestFinished(RequestEvent requestEvent);
void OnRequestFulfilled(IChainStateRequest request); void OnRequestFulfilled(RequestEvent requestEvent);
void OnRequestCancelled(IChainStateRequest request); void OnRequestCancelled(RequestEvent requestEvent);
void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex); void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex);
void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex); void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex);
}
public class RequestEvent
{
public RequestEvent(BlockTimeEntry block, IChainStateRequest request)
{
Block = block;
Request = request;
}
public BlockTimeEntry Block { get; }
public IChainStateRequest Request { get; }
} }
public class ChainState public class ChainState
@ -92,41 +105,41 @@ namespace CodexContractsPlugin.ChainMonitor
var newRequest = new ChainStateRequest(log, request, RequestState.New); var newRequest = new ChainStateRequest(log, request, RequestState.New);
requests.Add(newRequest); requests.Add(newRequest);
handler.OnNewRequest(newRequest); handler.OnNewRequest(new RequestEvent(request.Block, newRequest));
} }
private void ApplyEvent(RequestFulfilledEventDTO request) private void ApplyEvent(RequestFulfilledEventDTO @event)
{ {
var r = FindRequest(request.RequestId); var r = FindRequest(@event.RequestId);
if (r == null) return; if (r == null) return;
r.UpdateState(request.Block.BlockNumber, RequestState.Started); r.UpdateState(@event.Block.BlockNumber, RequestState.Started);
handler.OnRequestFulfilled(r); handler.OnRequestFulfilled(new RequestEvent(@event.Block, r));
} }
private void ApplyEvent(RequestCancelledEventDTO request) private void ApplyEvent(RequestCancelledEventDTO @event)
{ {
var r = FindRequest(request.RequestId); var r = FindRequest(@event.RequestId);
if (r == null) return; if (r == null) return;
r.UpdateState(request.Block.BlockNumber, RequestState.Cancelled); r.UpdateState(@event.Block.BlockNumber, RequestState.Cancelled);
handler.OnRequestCancelled(r); handler.OnRequestCancelled(new RequestEvent(@event.Block, r));
} }
private void ApplyEvent(SlotFilledEventDTO request) private void ApplyEvent(SlotFilledEventDTO @event)
{ {
var r = FindRequest(request.RequestId); var r = FindRequest(@event.RequestId);
if (r == null) return; if (r == null) return;
r.Hosts.Add(request.Host, (int)request.SlotIndex); r.Hosts.Add(@event.Host, (int)@event.SlotIndex);
r.Log($"[{request.Block.BlockNumber}] SlotFilled (host:'{request.Host}', slotIndex:{request.SlotIndex})"); r.Log($"[{@event.Block.BlockNumber}] SlotFilled (host:'{@event.Host}', slotIndex:{@event.SlotIndex})");
handler.OnSlotFilled(r, request.Host, request.SlotIndex); handler.OnSlotFilled(new RequestEvent(@event.Block, r), @event.Host, @event.SlotIndex);
} }
private void ApplyEvent(SlotFreedEventDTO request) private void ApplyEvent(SlotFreedEventDTO @event)
{ {
var r = FindRequest(request.RequestId); var r = FindRequest(@event.RequestId);
if (r == null) return; if (r == null) return;
r.Hosts.RemoveHost((int)request.SlotIndex); r.Hosts.RemoveHost((int)@event.SlotIndex);
r.Log($"[{request.Block.BlockNumber}] SlotFreed (slotIndex:{request.SlotIndex})"); r.Log($"[{@event.Block.BlockNumber}] SlotFreed (slotIndex:{@event.SlotIndex})");
handler.OnSlotFreed(r, request.SlotIndex); handler.OnSlotFreed(new RequestEvent(@event.Block, r), @event.SlotIndex);
} }
private void ApplyTimeImplicitEvents(ulong blockNumber, DateTime eventsUtc) private void ApplyTimeImplicitEvents(ulong blockNumber, DateTime eventsUtc)
@ -137,7 +150,7 @@ namespace CodexContractsPlugin.ChainMonitor
&& r.FinishedUtc < eventsUtc) && r.FinishedUtc < eventsUtc)
{ {
r.UpdateState(blockNumber, RequestState.Finished); r.UpdateState(blockNumber, RequestState.Finished);
handler.OnRequestFinished(r); handler.OnRequestFinished(new RequestEvent(new BlockTimeEntry(blockNumber, eventsUtc), r));
} }
} }
} }

View File

@ -5,27 +5,27 @@ namespace CodexContractsPlugin.ChainMonitor
{ {
public class DoNothingChainEventHandler : IChainStateChangeHandler public class DoNothingChainEventHandler : IChainStateChangeHandler
{ {
public void OnNewRequest(IChainStateRequest request) public void OnNewRequest(RequestEvent requestEvent)
{ {
} }
public void OnRequestCancelled(IChainStateRequest request) public void OnRequestCancelled(RequestEvent requestEvent)
{ {
} }
public void OnRequestFinished(IChainStateRequest request) public void OnRequestFinished(RequestEvent requestEvent)
{ {
} }
public void OnRequestFulfilled(IChainStateRequest request) public void OnRequestFulfilled(RequestEvent requestEvent)
{ {
} }
public void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex) public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
{ {
} }
public void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex) public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
{ {
} }
} }

View File

@ -13,34 +13,34 @@ namespace TestNetRewarder
this.handlers = handlers; this.handlers = handlers;
} }
public void OnNewRequest(IChainStateRequest request) public void OnNewRequest(RequestEvent requestEvent)
{ {
foreach (var handler in handlers) handler.OnNewRequest(request); foreach (var handler in handlers) handler.OnNewRequest(requestEvent);
} }
public void OnRequestCancelled(IChainStateRequest request) public void OnRequestCancelled(RequestEvent requestEvent)
{ {
foreach (var handler in handlers) handler.OnRequestCancelled(request); foreach (var handler in handlers) handler.OnRequestCancelled(requestEvent);
} }
public void OnRequestFinished(IChainStateRequest request) public void OnRequestFinished(RequestEvent requestEvent)
{ {
foreach (var handler in handlers) handler.OnRequestFinished(request); foreach (var handler in handlers) handler.OnRequestFinished(requestEvent);
} }
public void OnRequestFulfilled(IChainStateRequest request) public void OnRequestFulfilled(RequestEvent requestEvent)
{ {
foreach (var handler in handlers) handler.OnRequestFulfilled(request); foreach (var handler in handlers) handler.OnRequestFulfilled(requestEvent);
} }
public void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex) public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
{ {
foreach (var handler in handlers) handler.OnSlotFilled(request, host, slotIndex); foreach (var handler in handlers) handler.OnSlotFilled(requestEvent, host, slotIndex);
} }
public void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex) public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
{ {
foreach (var handler in handlers) handler.OnSlotFreed(request, slotIndex); foreach (var handler in handlers) handler.OnSlotFreed(requestEvent, slotIndex);
} }
} }
} }

View File

@ -23,9 +23,10 @@ namespace TestNetRewarder
AddBlock("📢 **Error**", error); AddBlock("📢 **Error**", error);
} }
public void OnNewRequest(IChainStateRequest request) public void OnNewRequest(RequestEvent requestEvent)
{ {
AddRequestBlock(request, "New Request", var request = requestEvent.Request;
AddRequestBlock(requestEvent, "New Request",
$"Client: {request.Client}", $"Client: {request.Client}",
$"Content: {request.Request.Content.Cid}", $"Content: {request.Request.Content.Cid}",
$"Duration: {BigIntToDuration(request.Request.Ask.Duration)}", $"Duration: {BigIntToDuration(request.Request.Ask.Duration)}",
@ -38,40 +39,40 @@ namespace TestNetRewarder
); );
} }
public void OnRequestCancelled(IChainStateRequest request) public void OnRequestCancelled(RequestEvent requestEvent)
{ {
AddRequestBlock(request, "Cancelled"); AddRequestBlock(requestEvent, "Cancelled");
} }
public void OnRequestFinished(IChainStateRequest request) public void OnRequestFinished(RequestEvent requestEvent)
{ {
AddRequestBlock(request, "Finished"); AddRequestBlock(requestEvent, "Finished");
} }
public void OnRequestFulfilled(IChainStateRequest request) public void OnRequestFulfilled(RequestEvent requestEvent)
{ {
AddRequestBlock(request, "Started"); AddRequestBlock(requestEvent, "Started");
} }
public void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex) public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
{ {
AddRequestBlock(request, "Slot Filled", AddRequestBlock(requestEvent, "Slot Filled",
$"Host: {host}", $"Host: {host}",
$"Slot Index: {slotIndex}" $"Slot Index: {slotIndex}"
); );
} }
public void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex) public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
{ {
AddRequestBlock(request, "Slot Freed", AddRequestBlock(requestEvent, "Slot Freed",
$"Slot Index: {slotIndex}" $"Slot Index: {slotIndex}"
); );
} }
private void AddRequestBlock(IChainStateRequest request, string eventName, params string[] content) private void AddRequestBlock(RequestEvent requestEvent, string eventName, params string[] content)
{ {
var blockNumber = $"[{request.Request.Block.BlockNumber}]"; var blockNumber = $"[{requestEvent.Block.BlockNumber}]";
var title = $"{blockNumber} **{eventName}** `{request.Request.Id}`"; var title = $"{blockNumber} **{eventName}** `{requestEvent.Request.Request.Id}`";
AddBlock(title, content); AddBlock(title, content);
} }

View File

@ -7,7 +7,7 @@ namespace TestNetRewarder
{ {
public class MarketBuffer public class MarketBuffer
{ {
private readonly List<IChainStateRequest> requests = new List<IChainStateRequest>(); private readonly List<RequestEvent> requestEvents = new List<RequestEvent>();
private readonly TimeSpan bufferSpan; private readonly TimeSpan bufferSpan;
public MarketBuffer(TimeSpan bufferSpan) public MarketBuffer(TimeSpan bufferSpan)
@ -15,24 +15,24 @@ namespace TestNetRewarder
this.bufferSpan = bufferSpan; this.bufferSpan = bufferSpan;
} }
public void Add(IChainStateRequest request) public void Add(RequestEvent requestEvent)
{ {
requests.Add(request); requestEvents.Add(requestEvent);
} }
public void Update() public void Update()
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
requests.RemoveAll(r => (now - r.FinishedUtc) > bufferSpan); requestEvents.RemoveAll(r => (now - r.Request.FinishedUtc) > bufferSpan);
} }
public MarketAverage? GetAverage() public MarketAverage? GetAverage()
{ {
if (requests.Count == 0) return null; if (requestEvents.Count == 0) return null;
return new MarketAverage return new MarketAverage
{ {
NumberOfFinished = requests.Count, NumberOfFinished = requestEvents.Count,
TimeRangeSeconds = (int)bufferSpan.TotalSeconds, TimeRangeSeconds = (int)bufferSpan.TotalSeconds,
Price = Average(s => s.Request.Ask.Reward), Price = Average(s => s.Request.Ask.Reward),
Duration = Average(s => s.Request.Ask.Duration), Duration = Average(s => s.Request.Ask.Duration),
@ -54,10 +54,10 @@ namespace TestNetRewarder
private float Average(Func<IChainStateRequest, int> getValue) private float Average(Func<IChainStateRequest, int> getValue)
{ {
var sum = 0.0f; var sum = 0.0f;
float count = requests.Count; float count = requestEvents.Count;
foreach (var r in requests) foreach (var r in requestEvents)
{ {
sum += getValue(r); sum += getValue(r.Request);
} }
if (count < 1.0f) return 0.0f; if (count < 1.0f) return 0.0f;

View File

@ -32,28 +32,28 @@ namespace TestNetRewarder
return buffers.Select(b => b.GetAverage()).Where(a => a != null).Cast<MarketAverage>().ToArray(); return buffers.Select(b => b.GetAverage()).Where(a => a != null).Cast<MarketAverage>().ToArray();
} }
public void OnNewRequest(IChainStateRequest request) public void OnNewRequest(RequestEvent requestEvent)
{ {
} }
public void OnRequestFinished(IChainStateRequest request) public void OnRequestFinished(RequestEvent requestEvent)
{ {
foreach (var b in buffers) b.Add(request); foreach (var b in buffers) b.Add(requestEvent);
} }
public void OnRequestFulfilled(IChainStateRequest request) public void OnRequestFulfilled(RequestEvent requestEvent)
{ {
} }
public void OnRequestCancelled(IChainStateRequest request) public void OnRequestCancelled(RequestEvent requestEvent)
{ {
} }
public void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex) public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
{ {
} }
public void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex) public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
{ {
} }

View File

@ -22,40 +22,40 @@ namespace TestNetRewarder
this.giver = giver; this.giver = giver;
} }
public void OnNewRequest(IChainStateRequest request) public void OnNewRequest(RequestEvent requestEvent)
{ {
if (MeetsRequirements(CheckType.ClientPostedContract, request)) if (MeetsRequirements(CheckType.ClientPostedContract, requestEvent))
{ {
GiveReward(reward, request.Client); GiveReward(reward, requestEvent.Request.Client);
} }
} }
public void OnRequestCancelled(IChainStateRequest request) public void OnRequestCancelled(RequestEvent requestEvent)
{ {
} }
public void OnRequestFinished(IChainStateRequest request) public void OnRequestFinished(RequestEvent requestEvent)
{ {
if (MeetsRequirements(CheckType.HostFinishedSlot, request)) if (MeetsRequirements(CheckType.HostFinishedSlot, requestEvent))
{ {
foreach (var host in request.Hosts.GetHosts()) foreach (var host in requestEvent.Request.Hosts.GetHosts())
{ {
GiveReward(reward, host); GiveReward(reward, host);
} }
} }
} }
public void OnRequestFulfilled(IChainStateRequest request) public void OnRequestFulfilled(RequestEvent requestEvent)
{ {
if (MeetsRequirements(CheckType.ClientStartedContract, request)) if (MeetsRequirements(CheckType.ClientStartedContract, requestEvent))
{ {
GiveReward(reward, request.Client); GiveReward(reward, requestEvent.Request.Client);
} }
} }
public void OnSlotFilled(IChainStateRequest request, EthAddress host, BigInteger slotIndex) public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
{ {
if (MeetsRequirements(CheckType.HostFilledSlot, request)) if (MeetsRequirements(CheckType.HostFilledSlot, requestEvent))
{ {
if (host != null) if (host != null)
{ {
@ -64,7 +64,7 @@ namespace TestNetRewarder
} }
} }
public void OnSlotFreed(IChainStateRequest request, BigInteger slotIndex) public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
{ {
} }
@ -73,12 +73,12 @@ namespace TestNetRewarder
giver.Give(reward, receiver); giver.Give(reward, receiver);
} }
private bool MeetsRequirements(CheckType type, IChainStateRequest request) private bool MeetsRequirements(CheckType type, RequestEvent requestEvent)
{ {
return return
reward.CheckConfig.Type == type && reward.CheckConfig.Type == type &&
MeetsDurationRequirement(request) && MeetsDurationRequirement(requestEvent.Request) &&
MeetsSizeRequirement(request); MeetsSizeRequirement(requestEvent.Request);
} }
private bool MeetsSizeRequirement(IChainStateRequest r) private bool MeetsSizeRequirement(IChainStateRequest r)