private bool TryConnectMonitor()
        {
            if (buildMonitorRemote == null)
            {
                try
                {
                    var namedPipeBinding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
                    {
                        SendTimeout = TimeSpan.FromSeconds(300.0)
                    };
                    buildMonitorRemote = ChannelFactory <IBuildMonitorRemote> .CreateChannel(namedPipeBinding, new EndpointAddress(monitorPipeName));

                    buildMonitorRemote.Ping();
                }
                catch (EndpointNotFoundException)
                {
                    buildMonitorRemote = null;
                }
            }

            return(buildMonitorRemote != null);
        }
Esempio n. 2
0
        private bool SendThreadUpdate()
        {
            if (!TryConnectMonitor())
                return false;

            // Update local info
            var localMicroThreadNotifications = new List<MicrothreadNotification>();
            var localBuildStepResultsToSend = new List<long>();

            lock (microthreadNotifications)
            {
                localMicroThreadNotifications.AddRange(microthreadNotifications);
                microthreadNotifications.Clear();
            }

            lock (buildStepInfosToSend)
            {
                buildStepInfos.AddRange(buildStepInfosToSend);
                buildStepInfosToSend.Clear();
            }

            lock (buildStepResultsToSend)
            {
                localBuildStepResultsToSend.AddRange(buildStepResultsToSend);
                buildStepResultsToSend.Clear();
            }

            try
            {
                // Sending BuildStep view model
                foreach (var buildStepInfo in buildStepInfos.Where(x => !x.HasBeenSend))
                {
                    buildMonitorRemote.SendBuildStepInfo(builderId, buildStepInfo.ExecutionId, buildStepInfo.Description, startTime);
                    buildStepInfo.BuildStepSent();
                }

                buildMonitorRemote.SendMicrothreadEvents(builderId, startTime, DateTime.Now, localMicroThreadNotifications);

                // Sending log message
                foreach (var buildStepInfo in buildStepInfos)
                {
                    if (buildStepInfo.Logger != null)
                    {
                        TimestampLocalLogger.Message[] messages = null;
                        lock (buildStepInfo.Logger)
                        {
                            if (buildStepInfo.Logger.Messages.Count > 0)
                            {
                                messages = buildStepInfo.Logger.Messages.ToArray();
                                buildStepInfo.Logger.Messages.Clear();
                            }
                        }
                        if (messages != null)
                        {
                            try
                            {
                                var serializableMessages = (messages.Select(x => new SerializableTimestampLogMessage(x))).ToList();
                                buildMonitorRemote.SendCommandLog(builderId, startTime, buildStepInfo.ExecutionId, serializableMessages);
                            }
                            catch (Exception)
                            {
                                lock (buildStepInfo.Logger)
                                {
                                    buildStepInfo.Logger.Messages.InsertRange(0, messages);
                                }
                                throw;
                            }
                        }
                    }
                }

                // Sending BuildStep results
                for (int i = localBuildStepResultsToSend.Count - 1; i >= 0; --i)
                {
                    long microthreadId = localBuildStepResultsToSend[i];
                    BuildStepInfo stepInfo = buildStepInfos.SingleOrDefault(x => x.ExecutionId == microthreadId);
                    if (stepInfo != null && stepInfo.BuildStep != null)
                    {
                        buildMonitorRemote.SendBuildStepResult(builderId, startTime, microthreadId, stepInfo.BuildStep.Status);
                        localBuildStepResultsToSend.RemoveAt(i);
                    }
                }
            }
            catch (Exception)
            {
                lock (microthreadNotifications)
                {
                    microthreadNotifications.AddRange(localMicroThreadNotifications);
                }

                buildMonitorRemote = null;
            }
            finally
            {
                if (localBuildStepResultsToSend.Count > 0)
                {
                    lock (buildStepResultsToSend)
                    {
                        buildStepResultsToSend.AddRange(localBuildStepResultsToSend);
                    }
                }
            }
            return buildMonitorRemote != null;
        }
Esempio n. 3
0
        private bool TryConnectMonitor()
        {
            if (buildMonitorRemote == null)
            {
                try
                {
                    var namedPipeBinding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) { SendTimeout = TimeSpan.FromSeconds(300.0) };
                    buildMonitorRemote = ChannelFactory<IBuildMonitorRemote>.CreateChannel(namedPipeBinding, new EndpointAddress(monitorPipeName));
                    buildMonitorRemote.Ping();
                }
                catch (EndpointNotFoundException)
                {
                    buildMonitorRemote = null;
                }
            }

            return buildMonitorRemote != null;
        }
        private bool SendThreadUpdate()
        {
            if (!TryConnectMonitor())
            {
                return(false);
            }

            // Update local info
            var localMicroThreadNotifications = new List <MicrothreadNotification>();
            var localBuildStepResultsToSend   = new List <long>();

            lock (microthreadNotifications)
            {
                localMicroThreadNotifications.AddRange(microthreadNotifications);
                microthreadNotifications.Clear();
            }

            lock (buildStepInfosToSend)
            {
                buildStepInfos.AddRange(buildStepInfosToSend);
                buildStepInfosToSend.Clear();
            }

            lock (buildStepResultsToSend)
            {
                localBuildStepResultsToSend.AddRange(buildStepResultsToSend);
                buildStepResultsToSend.Clear();
            }

            try
            {
                // Sending BuildStep view model
                foreach (var buildStepInfo in buildStepInfos.Where(x => !x.HasBeenSend))
                {
                    buildMonitorRemote.SendBuildStepInfo(builderId, buildStepInfo.ExecutionId, buildStepInfo.Description, startTime);
                    buildStepInfo.BuildStepSent();
                }

                buildMonitorRemote.SendMicrothreadEvents(builderId, startTime, DateTime.Now, localMicroThreadNotifications);

                // Sending log message
                foreach (var buildStepInfo in buildStepInfos)
                {
                    if (buildStepInfo.Logger != null)
                    {
                        TimestampLocalLogger.Message[] messages = null;
                        lock (buildStepInfo.Logger)
                        {
                            if (buildStepInfo.Logger.Messages.Count > 0)
                            {
                                messages = buildStepInfo.Logger.Messages.ToArray();
                                buildStepInfo.Logger.Messages.Clear();
                            }
                        }
                        if (messages != null)
                        {
                            try
                            {
                                var serializableMessages = (messages.Select(x => new SerializableTimestampLogMessage(x))).ToList();
                                buildMonitorRemote.SendCommandLog(builderId, startTime, buildStepInfo.ExecutionId, serializableMessages);
                            }
                            catch (Exception)
                            {
                                lock (buildStepInfo.Logger)
                                {
                                    buildStepInfo.Logger.Messages.InsertRange(0, messages);
                                }
                                throw;
                            }
                        }
                    }
                }

                // Sending BuildStep results
                for (int i = localBuildStepResultsToSend.Count - 1; i >= 0; --i)
                {
                    long          microthreadId = localBuildStepResultsToSend[i];
                    BuildStepInfo stepInfo      = buildStepInfos.SingleOrDefault(x => x.ExecutionId == microthreadId);
                    if (stepInfo != null && stepInfo.BuildStep != null)
                    {
                        buildMonitorRemote.SendBuildStepResult(builderId, startTime, microthreadId, stepInfo.BuildStep.Status);
                        localBuildStepResultsToSend.RemoveAt(i);
                    }
                }
            }
            catch (Exception)
            {
                lock (microthreadNotifications)
                {
                    microthreadNotifications.AddRange(localMicroThreadNotifications);
                }

                buildMonitorRemote = null;
            }
            finally
            {
                if (localBuildStepResultsToSend.Count > 0)
                {
                    lock (buildStepResultsToSend)
                    {
                        buildStepResultsToSend.AddRange(localBuildStepResultsToSend);
                    }
                }
            }
            return(buildMonitorRemote != null);
        }