public void AddShardItem_Test() { ShardConfiguration shardConfiguration = new ShardConfiguration(3); IShardKeyAlgorithm shardKeyAlgorithm = new EvenlyDistributedShardKeyAlgorithm(shardConfiguration); InMemoryDB db = new InMemoryDB(shardConfiguration, shardKeyAlgorithm); AddCustomer(db, 1); AddCustomer(db, 2); AddCustomer(db, 3); AddCustomer(db, 4); // 3 shards var stats = db.GetTotalShardItems(); Assert.AreEqual(2, stats[0].ItemsCount); Assert.AreEqual(1, stats[1].ItemsCount); Assert.AreEqual(1, stats[2].ItemsCount); // 4 shards db.AddShard(); AddCustomer(db, 5); AddCustomer(db, 6); stats = db.GetTotalShardItems(); Assert.AreEqual(3, stats[0].ItemsCount); Assert.AreEqual(2, stats[1].ItemsCount); Assert.AreEqual(1, stats[2].ItemsCount); // 5 shards db.AddShard(); AddCustomer(db, 7); AddCustomer(db, 8); AddCustomer(db, 9); AddCustomer(db, 10); AddCustomer(db, 11); stats = db.GetTotalShardItems(); Assert.AreEqual(4, stats[0].ItemsCount); Assert.AreEqual(3, stats[1].ItemsCount); Assert.AreEqual(2, stats[2].ItemsCount); Assert.AreEqual(1, stats[3].ItemsCount); Assert.AreEqual(1, stats[4].ItemsCount); }
public void ChangeShardCount_Test() { ShardConfiguration shardConfiguration = new ShardConfiguration(3); IShardKeyAlgorithm shardKeyAlgorithm = new EvenlyDistributedShardKeyAlgorithm(shardConfiguration); InMemoryDB dataProvider = new InMemoryDB(shardConfiguration, shardKeyAlgorithm); int shardId; shardId = dataProvider.GetShardId("1"); Assert.AreEqual(1, shardId); shardId = dataProvider.GetShardId("2"); Assert.AreEqual(2, shardId); shardId = dataProvider.GetShardId("3"); Assert.AreEqual(3, shardId); shardId = dataProvider.GetShardId("4"); Assert.AreEqual(1, shardId); shardId = dataProvider.GetShardId("123"); Assert.AreEqual(3, shardId); // 3 + 1 shards dataProvider.AddShard(); shardId = dataProvider.GetShardId("1"); Assert.AreEqual(1, shardId); shardId = dataProvider.GetShardId("2"); Assert.AreEqual(2, shardId); shardId = dataProvider.GetShardId("3"); Assert.AreEqual(3, shardId); shardId = dataProvider.GetShardId("4"); Assert.AreEqual(1, shardId); shardId = dataProvider.GetShardId("123"); Assert.AreEqual(3, shardId); shardId = dataProvider.GetShardId("5"); Assert.AreEqual(1, shardId); shardId = dataProvider.GetShardId("6"); Assert.AreEqual(2, shardId); shardId = dataProvider.GetShardId("7"); Assert.AreEqual(3, shardId); shardId = dataProvider.GetShardId("8"); Assert.AreEqual(4, shardId); }
public static void RunTest(int shardCount, int itemsCount, int customerItemsCount) { int totalSuccess = 0; var tasks = new List <Task>(); var factory = new System.Threading.Tasks.TaskFactory(); //using (GetTransaction()) //{ Console.WriteLine($"Running test with {shardCount} shards and {itemsCount} items and {customerItemsCount} customer items"); ShardConfiguration shardConfiguration = new ShardConfiguration(shardCount); IShardKeyAlgorithm shardKeyAlgorithm = new EvenlyDistributedShardKeyAlgorithm(shardConfiguration); using (SqlDb db = new SqlDb(shardConfiguration, shardKeyAlgorithm)) { try { //db.ClearAll(); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < itemsCount; i++) { try { db.AddCustomer(new Common.SampleCustomerInformation() { CustomerId = i, Title = $"Customer {i}", Address = "Address one + two", Birthdate = DateTime.Now, Job = "Jobs of the future is related to data" }); Interlocked.Increment(ref totalSuccess); } catch (Exception ex) { } } sw.Stop(); var avg = sw.ElapsedMilliseconds / itemsCount; Console.WriteLine($"ShardCount: {shardCount}, Insert Count: {itemsCount}, Avg: {avg}, Total Success: {totalSuccess}"); sw.Reset(); sw.Start(); var list = Enumerable.Range(0, itemsCount).ToList(); Parallel.ForEach(list, (customerId) => { //foreach (var customerId in list) //{ for (int i = 0; i < customerItemsCount; i++) { try { db.AddOrder(new Common.SampleOrderInformation() { CustomerId = customerId, Count = customerId + i + 10, Price = (customerId + i + 3453) * 10, Description = "some order detail", OrderEntryDate = DateTime.Now }); } catch (Exception ex) { } } }); //} sw.Stop(); avg = sw.ElapsedMilliseconds / itemsCount; Console.WriteLine($"ShardCount: {shardCount}, Insert Count: {itemsCount * customerItemsCount}, Avg: {avg}, Total: {sw.Elapsed.TotalSeconds:0.0}"); } finally { db.ClearAll(); } } }