private void DownloadConflictingSagas(string sagaTypeName, string propertyName) { var sagaDirectory = GetSagaDirectory(sagaTypeName); Console.WriteLine(); if (EnsureEmptyDirectoryExists(sagaDirectory) == false) { Console.WriteLine("Directory '{0}' must be empty", sagaTypeName); return; } var cloudTable = GetTable(sagaTypeName); if (cloudTable.Exists() == false) { Console.WriteLine("Table for saga '{0}' does not exist", sagaDirectory); return; } var mapper = new SagaJsonMapper(connectionString, sagaTypeName); var sagaIndexer = SagaIndexer.Get(connectionString, sagaTypeName, propertyName); Console.WriteLine($"Dowloading duplicates of saga '{sagaTypeName}' to '{sagaDirectory}'."); sagaIndexer.SearchForDuplicates((collidingPropertyValueHash, collidingSagas) => { var alreadyDownloaded = new HashSet <Guid>(); var workDir = Path.Combine(sagaDirectory, collidingPropertyValueHash.ToString()); if (Directory.Exists(workDir) == false) { Directory.CreateDirectory(workDir); } else { var files = Directory.EnumerateFiles(workDir).Select(filePath => filePath.Substring(filePath.LastIndexOf("\\", StringComparison.Ordinal) + 1)).Select(Guid.Parse); foreach (var sagaId in files) { alreadyDownloaded.Add(sagaId); } } foreach (var sagaId in collidingSagas.ToArray().Except(alreadyDownloaded)) { using (var file = File.OpenWrite(Path.Combine(workDir, sagaId.ToString()))) { using (var sw = new StreamWriter(file)) { Console.WriteLine($"* Downloading saga {sagaId}"); mapper.Download(sagaId, sw); } } } }); }
public void When_duplicates_found_Should_raise_an_event_for_every_duplicate_set_found(int testSize) { const int NumberOfCollisionsForEach = 2; var modulo = testSize / NumberOfCollisionsForEach; var toCreate = Enumerable.Range(0, testSize).Select(i => Tuple.Create(i, Guid.NewGuid())).ToArray(); const int concurrency = 100; var semaphore = new SemaphoreSlim(concurrency); foreach (var t in toCreate) { semaphore.Wait(); cloudTable.ExecuteAsync(TableOperation.Insert(CreateSagaState(t, modulo))) .ContinueWith(task => { if (task.Exception != null) { Console.WriteLine($"Exception occured {task.Exception}"); } semaphore.Release(); }); } for (var i = 0; i < concurrency; i++) { semaphore.Wait(); } var comparer = EqualityComparers.GetValueComparer(EdmType.Int64); var indexer = new SagaIndexer(cloudTable, "CorrelatingId", o => (ulong)(long)o, comparer); var results = new List <Tuple <Guid, Guid[]> >(); indexer.SearchForDuplicates((o, guids) => results.Add(Tuple.Create(o, guids.ToArray()))); var dict = results .GroupBy(t => t.Item1, t => t.Item2, comparer) .ToDictionary(g => g.Key, g => g.SelectMany(ids => ids).Distinct().ToArray(), comparer); Assert.AreEqual(modulo, dict.Count); foreach (var kvp in dict) { Assert.AreEqual(2, kvp.Value.Length); } }
private CloudTable GetTable(string sagaTypeName) { return(SagaIndexer.GetTable(connectionString, sagaTypeName)); }