public void If_dump_import_fails_rollback_and_check_no_data_was_lost() { #if DEBUG var config = new ClientConfig(); config.LoadFromFile("inprocess_persistent_config.xml"); const string dumpPath = "dump"; if (Directory.Exists(dumpPath)) { Directory.Delete(dumpPath, true); } Directory.CreateDirectory(dumpPath); using (var connector = new Connector(config)) { var dataSource = connector.DataSource <Trade>(); for (var i = 0; i < 1010; i++) { if (i % 10 == 0) { dataSource.Put(new Trade(i, 1000 + i, "TOTO", DateTime.Now.Date, 150)); } else { dataSource.Put(new Trade(i, 1000 + i, "TATA", DateTime.Now.Date, 150)); } } var admin = connector.AdminInterface(); admin.Dump(dumpPath); // add some data after dump dataSource.Put(new Trade(2000, 3000, "TITI", DateTime.Now.Date, 150)); } // simulate exception during dump import using (var connector = new Connector(config)) { var admin = connector.AdminInterface(); Dbg.ActivateSimulation(100); Assert.Throws <CacheException>(() => admin.ImportDump(dumpPath)); var dataSource = connector.DataSource <Trade>(); var folders = new[] { "TATA", "TOTO" }; var list = dataSource.Where(t => folders.Contains(t.Folder)).ToList(); Assert.AreEqual(1010, list.Count); dataSource.DeleteMany(t => t.Folder == "TATA"); var count = dataSource.Count(t => t.Folder == "TATA"); Assert.AreEqual(0, count); count = dataSource.Count(t => t.Folder == "TITI"); Assert.AreEqual(1, count, "this object should exist as the dump import failed"); } #endif }
public void In_case_of_failure_during_dump_import_data_is_rollbacked() { var dumpPath = "dump"; if (Directory.Exists(dumpPath)) { Directory.Delete(dumpPath, true); } Directory.CreateDirectory(dumpPath); using (var connector = new Connector(_clientConfig)) { var dataSource = connector.DataSource <ProductEvent>(); var events = new List <ProductEvent>(); for (var i = 0; i < 100; i++) { switch (i % 3) { case 0: events.Add(new FixingEvent(i, "AXA", 150, "EQ-256")); break; case 1: events.Add(new FixingEvent(i, "TOTAL", 180, "IRD-400")); break; case 2: events.Add(new Increase(i, 180, "EQ-256")); break; } } dataSource.PutMany(events); var admin = connector.AdminInterface(); admin.Dump(dumpPath); dataSource.Put(new FixingEvent(55555, "GLE", 180, "IRD-500")); } StopServers(); StartServers(); using (var connector = new Connector(_clientConfig)) { var dataSource = connector.DataSource <ProductEvent>(); var eventAfterDump = dataSource[55555]; Assert.IsNotNull(eventAfterDump); // simulate a failure on the 3rd node Dbg.ActivateSimulation(100, 3); var admin = connector.AdminInterface(); try { admin.ImportDump(dumpPath); Assert.Fail("An exception was expected here"); } catch (CacheException e) { Assert.IsTrue(e.Message.ToLower().Contains("simulation")); } eventAfterDump = dataSource[55555]; // this event was added after dump and it's still present as the dump was rolled-back Assert.NotNull(eventAfterDump); // check that it is still woking fine after rollback dataSource.Put(new FixingEvent(66666, "GLE", 180, "IRD-500")); var events = new[] { 55555, 66666 }; var evts = dataSource.Where(e => events.Contains(e.EventId)).ToList(); Assert.AreEqual(2, evts.Count); } StopServers(); StartServers(); // check thatr everything is persisted using (var connector = new Connector(_clientConfig)) { var dataSource = connector.DataSource <ProductEvent>(); var events = new[] { 55555, 66666 }; var evts = dataSource.Where(e => events.Contains(e.EventId)).ToList(); Assert.AreEqual(2, evts.Count); } }