Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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;
            }
        }