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); }
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); } }
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()); } }