Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ public interface IRavenTestSuite
Task TeardownDatabase();
Task CreateLegacyTimeoutManagerIndex(bool waitForIndexToBeUpToDate);
Task EnsureIndexIsNotStale();
Task InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId);
Task<InitiTimeoutsResult> InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace TimeoutMigrationTool.Raven.IntegrationTests
{
using System;

public class InitiTimeoutsResult
{
public DateTime ShortestTimeout { get; set; }
public DateTime LongestTimeout { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public string ServerName
{
get { return serverName; }
}
static Random random = new Random();

public async Task SetupDatabase()
{
Expand Down Expand Up @@ -67,9 +68,13 @@ public async Task InitTimeouts(int nrOfTimeouts)
}
}

public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId)
public async Task<InitiTimeoutsResult> InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId)
{
var timeoutsPrefix = "TimeoutDatas";
var shortestTimeout = DateTime.MaxValue;
var longestTimeout = DateTime.MinValue;
var daysToTrigger = random.Next(2, 60); // randomize the Time property

for (var i = 0; i < nrOfTimeouts; i++)
{
var insertTimeoutUrl = $"{serverName}/databases/{DatabaseName}/docs/{timeoutsPrefix}/{startFromId +i}";
Expand All @@ -81,7 +86,7 @@ public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startF
Destination = "WeDontCare.ThisShouldBeIgnored.BecauseItsJustForRouting",
SagaId = Guid.NewGuid(),
OwningTimeoutManager = endpointName,
Time = i < nrOfTimeouts / 2 ? DateTime.Now.AddDays(7) : DateTime.Now.AddDays(14),
Time = DateTime.Now.AddDays(daysToTrigger),
Headers = new Dictionary<string, string>(),
State = Encoding.ASCII.GetBytes("This is my state")
};
Expand All @@ -91,7 +96,16 @@ public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startF

var result = await httpClient.PutAsync(insertTimeoutUrl, httpContent);
Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.Created));
if (shortestTimeout > timeoutData.Time) shortestTimeout = timeoutData.Time;
if (longestTimeout < timeoutData.Time) longestTimeout = timeoutData.Time;
}

return new InitiTimeoutsResult
{
ShortestTimeout = shortestTimeout,
LongestTimeout = longestTimeout
};

}

public async Task<List<RavenBatch>> SetupExistingBatchInfoInDatabase()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class Raven4TestSuite : IRavenTestSuite
{
public ICanTalkToRavenVersion RavenAdapter => new Raven4Adapter(ServerName, DatabaseName);
public ILogger Logger => new ConsoleLogger(false);
static Random random = new Random();

public string ServerName
{
Expand Down Expand Up @@ -81,9 +82,13 @@ public async Task InitTimeouts(int nrOfTimeouts)
}
}

public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId)
public async Task<InitiTimeoutsResult> InitTimeouts(int nrOfTimeouts, string endpointName, int startFromId)
{
var timeoutsPrefix = "TimeoutDatas";
var shortestTimeout = DateTime.MaxValue;
var longestTimeout = DateTime.MinValue;
var daysToTrigger = random.Next(2, 60); // randomize the Time property

for (var i = 0; i < nrOfTimeouts; i++)
{
var insertTimeoutUrl = $"{ServerName}/databases/{DatabaseName}/docs?id={timeoutsPrefix}/{startFromId + i}";
Expand All @@ -94,7 +99,7 @@ public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startF
Destination = "WeDontCare.ThisShouldBeIgnored.BecauseItsJustForRouting",
SagaId = Guid.NewGuid(),
OwningTimeoutManager = endpointName,
Time = i < nrOfTimeouts / 2 ? DateTime.Now.AddDays(7) : DateTime.Now.AddDays(14),
Time = DateTime.Now.AddDays(daysToTrigger),
Headers = new Dictionary<string, string>(),
State = Encoding.ASCII.GetBytes("This is my state")
};
Expand All @@ -104,7 +109,15 @@ public async Task InitTimeouts(int nrOfTimeouts, string endpointName, int startF

var result = await httpClient.PutAsync(insertTimeoutUrl, httpContent);
Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.Created));
if (shortestTimeout > timeoutData.Time) shortestTimeout = timeoutData.Time;
if (longestTimeout < timeoutData.Time) longestTimeout = timeoutData.Time;
}

return new InitiTimeoutsResult
{
ShortestTimeout = shortestTimeout,
LongestTimeout = longestTimeout
};
}

public RavenToolState SetupToolState(DateTime cutoffTime)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,26 @@ public async Task WhenThereAreNoTimeoutsListEndpointsReturnsAnEmptyList(bool use
[TestCase(false)]
public async Task WhenThereTimeoutsListEndpointsReturnsEndpointsList(bool useIndex)
{
await testSuite.InitTimeouts(nrOfTimeouts, "EndpointA", 0);
await testSuite.InitTimeouts(500, "EndpointB", nrOfTimeouts);
var endpointATimes = await testSuite.InitTimeouts(nrOfTimeouts, "EndpointA", 0);
var endpointBTimes = await testSuite.InitTimeouts(500, "EndpointB", nrOfTimeouts);

var sut = new RavenDBTimeoutStorage(testSuite.Logger,testSuite.ServerName, testSuite.DatabaseName, "TimeoutDatas", testSuite.RavenVersion, useIndex);
var endpoints = await sut.ListEndpoints(DateTime.Now);

Assert.IsNotNull(endpoints);
Assert.That(endpoints.Count, Is.EqualTo(2));

var endpointA = endpoints.FirstOrDefault(x => x.EndpointName == "EndpointA");
var endpointB = endpoints.FirstOrDefault(x => x.EndpointName == "EndpointB");
Assert.IsNotNull(endpointA);
Assert.That(endpointA.NrOfTimeouts, Is.EqualTo(nrOfTimeouts));
Assert.That(endpointA.ShortestTimeout, Is.EqualTo(endpointATimes.ShortestTimeout));
Assert.That(endpointA.LongestTimeout, Is.EqualTo(endpointATimes.LongestTimeout));

var endpointB = endpoints.FirstOrDefault(x => x.EndpointName == "EndpointB");
Assert.IsNotNull(endpointB);
Assert.That(endpointB.NrOfTimeouts, Is.EqualTo(500));
Assert.That(endpointB.ShortestTimeout, Is.EqualTo(endpointBTimes.ShortestTimeout));
Assert.That(endpointB.LongestTimeout, Is.EqualTo(endpointBTimes.LongestTimeout));
}

[TestCase(true)]
Expand Down
16 changes: 10 additions & 6 deletions src/TimeoutMigrationTool/RavenDB/RavenDBTimeoutStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,13 +151,17 @@ static void ProcessTimeoutsIntoEndpointsFound(List<TimeoutData> timeouts, Dictio
var endpointsFetched = eligibleTimeouts.GroupBy(
key => key.OwningTimeoutManager.Replace(RavenConstants.MigrationDonePrefix, "").Replace(RavenConstants.MigrationOngoingPrefix, ""),
elements => elements,
(endpointName, destinationTimeouts) => new EndpointInfo
(endpointName, destinationTimeouts) =>
{
EndpointName = endpointName,
NrOfTimeouts = eligibleTimeouts.Count(x => x.OwningTimeoutManager.Replace(RavenConstants.MigrationDonePrefix, "").Replace(RavenConstants.MigrationOngoingPrefix, "") == endpointName),
ShortestTimeout = eligibleTimeouts.Min(x => x.Time),
LongestTimeout = eligibleTimeouts.Max(x => x.Time),
Destinations = eligibleTimeouts.GroupBy(x => x.Destination).Select(g => g.Key).ToList()
var endpointTimeouts = eligibleTimeouts.Where(x => x.OwningTimeoutManager.Replace(RavenConstants.MigrationDonePrefix, "").Replace(RavenConstants.MigrationOngoingPrefix, "") == endpointName).ToList();
return new EndpointInfo
{
EndpointName = endpointName,
NrOfTimeouts = endpointTimeouts.Count(),
ShortestTimeout = endpointTimeouts.Min(x => x.Time),
LongestTimeout = endpointTimeouts.Max(x => x.Time),
Destinations = eligibleTimeouts.GroupBy(x => x.Destination).Select(g => g.Key).ToList()
};
}).ToList();

endpointsFetched.ForEach(ep =>
Expand Down