public void RaiseFaultedEvent(bool taskFailed) { bool raiseEvent = false; // For SP3, we need to crash if this happens in the vertex host if (String.Compare(Process.GetCurrentProcess().ProcessName, "HpcQueryVertexHost", StringComparison.OrdinalIgnoreCase) == 0) { DryadLogger.LogCritical(0, null, "Vertex Host lost communication with Vertex Service while updating vertex status: Exiting vertex. Graph Manager will rerun a failed vertex up to six times."); Environment.Exit(unchecked ((int)Constants.DrError_VertexHostLostCommunication)); } lock (SyncRoot) { // We always want to raise the faulted event if the // task failed, so that the dispatcher is disposed. // If the task did not fail, we want to ensure that // the event is only raised once for a given fault. raiseEvent = taskFailed || (!Faulted); // We never want to reset m_taskFailed once it's been set // to true, because the task isn't coming back. m_taskFailed = m_taskFailed || taskFailed; m_faulted = true; } if (raiseEvent) { DryadLogger.LogError(0, null, "Dispatcher for task {0} has faulted on node {1}, current process: {2}", m_taskId, m_nodeName, CurrentProcess == InvalidProcessId ? "<none>" : CurrentProcess.ToString()); // Notice that this will keep any locks that are currently held, so refrain from calling this while enumerating the dispatchers FaultedEvent(this, null); } }