public ReplayManager(ProgramArguments args, GUIDataMonitor monitor)
 {
     connectionString = OdbcUtils.CreateConnectionString(args);
     snapshotName     = args.Snapshot;
     processName      = args.Process;
     databaseName     = args.TestDatabase;
     setupTrace       = args.SetupTraceFile;
     testTrace        = args.TestTraceFile;
     replayMode       = args.ReplayMode;
     resetMethod      = args.ResetMethod;
     nbrWarmup        = args.NbrWarmup;
     this.backupFile  = args.BackupFile;
     this.monitor     = monitor;
     RunTimeMillis    = new List <long>();
     MemReaders       = new List <MemoryReader>();
     StartMemReader   = new MemoryReader(processName);
 }
Example #2
0
        public static void RestoreFromBackup(string backupFile, string databaseName, string connectionString)
        {
            using (OdbcConnection conn = new OdbcConnection(connectionString))
            {
                conn.Open();
                //close existing connections by setting single user mode
                string s1 = "ALTER DATABASE " + databaseName +
                            " SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";

                //restore from backup
                string s2 = "USE master;" +
                            "RESTORE DATABASE " + databaseName +
                            " FROM DISK = '" + backupFile + "'" +
                            " WITH REPLACE;";

                //set back to multi user mode
                string s3 = "ALTER DATABASE " + databaseName +
                            " SET MULTI_USER WITH ROLLBACK IMMEDIATE;";
                OdbcUtils.ExecuteNonQuery(conn, s1 + s2 + s3);
            }
        }
Example #3
0
        public static void RestoreSnapshot(string snapshotName, string databaseName, string connectionString)
        {
            using (OdbcConnection conn = new OdbcConnection(connectionString))
            {
                conn.Open();
                //close existing connections by setting single user mode
                string s1 = "ALTER DATABASE " + databaseName +
                            " SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";

                //restore database from snapshot
                string s2 = "USE master;" +
                            "RESTORE DATABASE " + databaseName +
                            " FROM DATABASE_SNAPSHOT = '" + snapshotName + "';"
                ;

                //set back to multi user mode
                string s3 = "ALTER DATABASE " + databaseName +
                            " SET MULTI_USER WITH ROLLBACK IMMEDIATE;";

                OdbcUtils.ExecuteNonQuery(conn, s1 + s2 + s3);
            }
        }
        public void Run(int nbrRepeats)
        {
            ReplayUnit setupReplay  = null;
            ReplayUnit testReplay   = null;
            ReplayUnit warmupReplay = null;

            using (OdbcConnection conn = new OdbcConnection(connectionString))
            {
                conn.Open();
                //Loading setup trace
                if (!setupTrace.Equals(""))
                {
                    Console.Write("Loading setup trace " + setupTrace + " ... ");
                    string s = "select EventClass, TextData, EventSequence, StartTime, EndTime, SPID, DatabaseName " +
                               "from sys.fn_trace_gettable(N'" + setupTrace + "', default) " +
                               "where EventClass = 11 or EventClass = 13 or EventClass = 14 " +
                               "or EventClass = 15 or EventClass = 17";
                    DataTable replayTable = OdbcUtils.ExecuteReader(conn, s);
                    TracePreprocessor.Preprocess(replayTable, databaseName);
                    setupReplay = new SingleConnectionReplayUnit(connectionString, databaseName);
                    DatabaseEventBuilder.Build(setupReplay, replayTable);
                    Console.WriteLine("completed");
                }
                Console.Write("Loading test trace " + testTrace + " ... ");
                string sql = "select EventClass, TextData, EventSequence, StartTime, EndTime, SPID, DatabaseName " +
                             "from sys.fn_trace_gettable(N'" + testTrace + "', default) " +
                             "where EventClass = 11 or EventClass = 13 or EventClass = 14 " +
                             "or EventClass = 15 or EventClass = 17";
                DataTable testTable = OdbcUtils.ExecuteReader(conn, sql);
                TracePreprocessor.Preprocess(testTable, databaseName);
                if (replayMode.Equals(ProgramArguments.REPLAY_MODE_MULTI_CONNECTION))
                {
                    testReplay = new ReplayUnit(connectionString, databaseName, false);
                }
                else if (replayMode.Equals(ProgramArguments.REPLAY_MODE_MULTI_CONNECTION_WITH_DELAY))
                {
                    testReplay = new ReplayUnit(connectionString, databaseName, true);
                }
                else
                {
                    testReplay = new SingleConnectionReplayUnit(connectionString, databaseName);
                }
                DatabaseEventBuilder.Build(testReplay, testTable);
                Console.WriteLine("completed");

                warmupReplay = new SingleConnectionReplayUnit(connectionString, databaseName);
                DatabaseEventBuilder.Build(warmupReplay, testTable);
            }

            RunTimeMillis.Clear();
            MemReaders.Clear();

            Console.WriteLine("----------");
            Console.WriteLine("WARM UP");
            for (int i = 0; i < nbrWarmup; i++)
            {
                Console.WriteLine("----------");

                if (resetMethod.Equals(ProgramArguments.RESET_METHOD_SNAPSHOT))
                {
                    Console.Write("Restoring snapshot ... ");
                    SQLServerUtils.RestoreSnapshot(snapshotName, databaseName, connectionString);
                    Console.WriteLine("completed");
                }
                else if (resetMethod.Equals(ProgramArguments.RESET_METHOD_BACKUP))
                {
                    Console.Write("Restoring from backup ... ");
                    SQLServerUtils.RestoreFromBackup(backupFile, databaseName, connectionString);
                    Console.WriteLine("completed");
                }

                OdbcConnection.ReleaseObjectPool();

                bool cancelled = false;
                if (!setupTrace.Equals(""))
                {
                    setupReplay.Reset();
                    Console.WriteLine("Running setup trace " + setupTrace + " (q to cancel)");
                    if (!RunReplayAsCancellableTask(setupReplay))
                    {
                        cancelled = true;
                        break;
                    }
                }

                if (cancelled)
                {
                    Console.WriteLine("Cancelled");
                    break;
                }

                warmupReplay.Reset();
                Console.WriteLine("Running test trace " + testTrace + " (q to cancel)");
                if (!RunReplayAsCancellableTask(warmupReplay))
                {
                    Console.WriteLine("Cancelled");
                    break;
                }
            }

            Console.WriteLine("----------");
            Console.WriteLine("ACTUAL TEST");
            for (int i = 0; i < nbrRepeats; i++)
            {
                Console.WriteLine("----------");

                if (resetMethod.Equals(ProgramArguments.RESET_METHOD_SNAPSHOT))
                {
                    Console.Write("Restoring snapshot ... ");
                    SQLServerUtils.RestoreSnapshot(snapshotName, databaseName, connectionString);
                    Console.WriteLine("completed");
                }
                else if (resetMethod.Equals(ProgramArguments.RESET_METHOD_BACKUP))
                {
                    Console.Write("Restoring from backup ... ");
                    SQLServerUtils.RestoreFromBackup(backupFile, databaseName, connectionString);
                    Console.WriteLine("completed");
                }

                OdbcConnection.ReleaseObjectPool();

                //Restart service
                //RestartService();

                bool cancelled = false;
                if (!setupTrace.Equals(""))
                {
                    setupReplay.Reset();
                    Console.WriteLine("Running setup trace " + setupTrace + " (q to cancel)");
                    if (!RunReplayAsCancellableTask(setupReplay))
                    {
                        cancelled = true;
                        break;
                    }
                }

                if (cancelled)
                {
                    Console.WriteLine("Cancelled");
                    break;
                }

                testReplay.Reset();
                Console.WriteLine("Running test trace " + testTrace + " (q to cancel)");
                MemoryReader mr = new MemoryReader(processName);
                mr.StartMeasure();
                if (!RunReplayAsCancellableTask(testReplay))
                {
                    mr.EndMeasure();
                    Console.WriteLine("Cancelled");
                    break;
                }
                mr.EndMeasure();
                MemReaders.Add(mr);
                RunTimeMillis.Add(testReplay.RunTimeMillis);

                monitor.AddRunTimeMillis(testReplay.RunTimeMillis);
                monitor.AddAvgMem(mr.GetAverage());
            }
        }