コード例 #1
0
        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
        }
コード例 #2
0
        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);
            }
        }