Example #1
0
        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);
                        }
                    }
                }
            });
        }
Example #2
0
        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);
            }
        }
Example #3
0
 private CloudTable GetTable(string sagaTypeName)
 {
     return(SagaIndexer.GetTable(connectionString, sagaTypeName));
 }