public static void Start(string configFileName) { Configuration config = null; try { using (FileStream fs = new FileStream(configFileName, FileMode.Open, FileAccess.Read)) { XmlSerializer serializer = new XmlSerializer(typeof(Configuration)); config = serializer.Deserialize(fs) as Configuration; } } catch (Exception ex) { Trace.TraceError("Failed to load the configuration file {0}", configFileName); Trace.TraceError(ex.ToString()); throw ex; } Trace.TraceInformation("Loaded {0} file successfully", configFileName); if (config != null) { // persist to db try { SessionGroupConfigurationManager configManager = new SessionGroupConfigurationManager(config); configManager.TrySave(false); } catch (DuplicateConfigurationException) { // the same configuration already exists // swallow the exception } Guid sessionGroupGuid = config.SessionGroupUniqueId; config = null; // load the configuration from db (instead of the deserialized object from file) BusinessModelManager businessModelManager = new BusinessModelManager(); config = businessModelManager.LoadConfiguration(sessionGroupGuid); SyncOrchestrator syncOrch = new SyncOrchestrator(config); syncOrch.ConstructPipelines(); syncOrch.InitializePipelines(); syncOrch.Start(Timeout.Infinite); syncOrch.BlockUntilAllSessionFinishes(); } }
public void StartSessionGroup(Guid sessionGroupUniqueId) { try { lock (m_runningSessionGroupsLock) { TraceManager.TraceInformation("StartSessionGroup: Enter with sessionGroupUniqueId: {0}", sessionGroupUniqueId); PollLivenessAndUpdateHostedSessionGroups(); // Create a SyncOrchestrator if we don't already have one servicing the referenced SessionGroup if (!m_runningSessionGroups.ContainsKey(sessionGroupUniqueId)) { // mark session group init status to be Starting if (!m_sessionGroupInitializationStatus.ContainsKey(sessionGroupUniqueId)) { m_sessionGroupInitializationStatus.Add(sessionGroupUniqueId, SessionGroupInitializationStatus.Initializing); } else { m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.Initializing; } if (IsSessionGroupObsoleteOrDeleted(sessionGroupUniqueId)) { TraceManager.TraceError(MigrationToolkitResources.ErrorRestartDeletedSessionGroup, sessionGroupUniqueId.ToString()); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; return; } else if (IsSessionGroupOneTimeCompleted(sessionGroupUniqueId)) { TraceManager.TraceError(MigrationToolkitResources.ErrorRestartOneTimeCompleteSessionGroup, sessionGroupUniqueId.ToString()); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; return; } TraceManager.TraceInformation("StartSessionGroup: Creating new SyncOrchestrator"); BusinessModelManager businessModelManager = new BusinessModelManager(); Configuration configuration = businessModelManager.LoadConfiguration(sessionGroupUniqueId); // exclude sessions that are started in standalone process Guid[] standaloneSessionsInGroup = new Guid[0]; using (RuntimeEntityModel context = RuntimeEntityModel.CreateInstance()) { int StartedInStandaloneProcessState = (int)BusinessModelManager.SessionStateEnum.StartedInStandaloneProcess; var sessionQuery = from s in context.RTSessionSet where s.State == StartedInStandaloneProcessState && s.SessionGroup.GroupUniqueId.Equals(sessionGroupUniqueId) select s.SessionUniqueId; if (sessionQuery.Count() > 0) { standaloneSessionsInGroup = sessionQuery.ToArray(); } } ExcludeSessionFromGroupInConfig(configuration, standaloneSessionsInGroup); SyncOrchestrator syncOrchestrator = new SyncOrchestrator(configuration); // phase1 light-weight initialization syncOrchestrator.ConstructPipelines(); // phase2 heavy-weight initialization syncOrchestrator.InitializePipelines(); // clean-up the sync orchestration status and command queue, in case // previous session process aborted syncOrchestrator.CleanUpSyncOrchStatus(); TraceManager.TraceInformation("StartSessionGroup: Starting SyncOrchestrator; now {0} running sessions", m_runningSessionGroups.Count); syncOrchestrator.Start(); m_runningSessionGroups.Add(sessionGroupUniqueId, syncOrchestrator); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.Initialized; } } } catch (Exception e) { TraceManager.TraceException(e); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; } }
public void StartSingleSessionInSessionGroup(Guid sessionGroupUniqueId, Guid sessionUniqueId) { try { lock (m_runningSessionGroupsLock) { PollLivenessAndUpdateHostedSessionGroups(); // mark session group init status to be Starting if (!m_sessionGroupInitializationStatus.ContainsKey(sessionGroupUniqueId)) { m_sessionGroupInitializationStatus.Add(sessionGroupUniqueId, SessionGroupInitializationStatus.Initializing); } else { m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.Initializing; } if (IsSessionGroupObsoleteOrDeleted(sessionGroupUniqueId)) { TraceManager.TraceError(MigrationToolkitResources.ErrorRestartDeletedSessionGroup, sessionGroupUniqueId.ToString()); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; return; } else if (IsSessionGroupOneTimeCompleted(sessionGroupUniqueId)) { TraceManager.TraceError(MigrationToolkitResources.ErrorRestartOneTimeCompleteSessionGroup, sessionGroupUniqueId.ToString()); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; return; } TraceManager.TraceInformation("StartSingleSessionInSessionGroup: Enter with sessionGroupUniqueId: {0}, sessionUniqueId: {1}", sessionGroupUniqueId.ToString(), sessionUniqueId.ToString()); using (RuntimeEntityModel context = RuntimeEntityModel.CreateInstance()) { var sessionQuery = from s in context.RTSessionSet where s.SessionUniqueId.Equals(sessionUniqueId) && s.SessionGroup.GroupUniqueId.Equals(sessionGroupUniqueId) select s; if (sessionQuery.Count() == 0) { return; } sessionQuery.First().State = (int)BusinessModelManager.SessionStateEnum.StartedInStandaloneProcess; context.TrySaveChanges(); } // Create a SyncOrchestrator if we don't already have one servicing the referenced SessionGroup if (!m_runningSessionGroups.ContainsKey(sessionGroupUniqueId)) { TraceManager.TraceInformation("StartSessionGroup: Creating new SyncOrchestrator"); BusinessModelManager businessModelManager = new BusinessModelManager(); Configuration configuration = businessModelManager.LoadConfiguration(sessionGroupUniqueId); List <Guid> sessionIdsToExclude = new List <Guid>(); foreach (var session in configuration.SessionGroup.Sessions.Session) { var sessionId = new Guid(session.SessionUniqueId); if (sessionId.Equals(sessionUniqueId)) { continue; } sessionIdsToExclude.Add(sessionId); } // extract only the session we need ExcludeSessionFromGroupInConfig(configuration, sessionIdsToExclude.ToArray()); SyncOrchestrator syncOrchestrator = new SyncOrchestrator(configuration); // phase1 light-weight initialization syncOrchestrator.ConstructPipelines(); // phase2 heavy-weight initialization syncOrchestrator.InitializePipelines(); syncOrchestrator.CleanUpSyncOrchStatus(); TraceManager.TraceInformation("StartSessionGroup: Starting SyncOrchestrator; now {0} running sessions", m_runningSessionGroups.Count); syncOrchestrator.Start(); m_runningSessionGroups.Add(sessionGroupUniqueId, syncOrchestrator); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.Initialized; } } } catch (Exception e) { TraceManager.TraceException(e); m_sessionGroupInitializationStatus[sessionGroupUniqueId] = SessionGroupInitializationStatus.NotInitialized; } }