/// <summary> /// Update properties /// </summary> /// <param name="replyEpr">callback URI</param> /// <param name="processId">vertex process id</param> /// <param name="infos">property information</param> /// <param name="blockOnLabel">property update label</param> /// <param name="blockOnVersion">property update version</param> /// <param name="maxBlockTime">maximum time to wait for update</param> /// <param name="getPropLabel">property to get</param> /// <param name="ProcessStatistics">vertex host process statistics</param> /// <returns>success/failure of property update</returns> bool IDryadVertexService.SetGetProps(string replyEpr, int processId, ProcessPropertyInfo[] infos, string blockOnLabel, ulong blockOnVersion, long maxBlockTime, string getPropLabel, bool ProcessStatistics) { DryadLogger.LogMethodEntry(replyEpr, processId); bool success = false; try { // Get the vertex process ID VertexProcess vp = FindByDryadId(processId); if (vp != null) { success = vp.SetGetProps(replyEpr, infos, blockOnLabel, blockOnVersion, maxBlockTime, getPropLabel, ProcessStatistics); } else { DryadLogger.LogError(0, null, "Failed to set / get process properties: Unknown process id {0}", processId); } } catch (Exception e) { DryadLogger.LogWarning("Set Or Get Process Properties", "Operation threw exception: {0}", e.ToString()); throw new FaultException <VertexServiceError>(new VertexServiceError("SetGetProps", e.ToString())); } DryadLogger.LogMethodExit(success); return(success); }
/// <summary> /// Cancels the vertex process with the provided id /// </summary> /// <param name="processId">vertex process id</param> void IDryadVertexService.CancelScheduleProcess(int processId) { VertexProcess vp = null; DryadLogger.LogMethodEntry(processId); try { vp = FindByDryadId(processId); if (vp != null) { vp.Cancel(false); } else { DryadLogger.LogWarning("Cancel Process", "Unknown process id {0}", processId); } } catch (Exception e) { DryadLogger.LogWarning("Cancel Process", "Operation threw exception: {0}", e.ToString()); } DryadLogger.LogMethodExit(); }
/// <summary> /// Removes reference to a vertex process /// </summary> /// <param name="processId">process id to forget</param> void IDryadVertexService.ReleaseProcess(int processId) { DryadLogger.LogMethodEntry(processId); VertexProcess vp = null; try { vp = FindByDryadId(processId); if (vp != null) { vertexProcessTable.Remove(vp); vp.Dispose(); } else { DryadLogger.LogWarning("Release Process", "Unknown process id {0}", processId); } } catch (Exception e) { DryadLogger.LogWarning("Release Process", "Operation threw exception: {0}", e.ToString()); } DryadLogger.LogMethodExit(); }
/// <summary> /// Schedule a vertex host process using the provided parameters /// </summary> /// <param name="replyUri">callback URI</param> /// <param name="processId">vertex process id</param> /// <param name="commandLine">vertex host command line</param> /// <param name="environment">vertex host environment variables</param> /// <returns>Success/Failure of starting vertex process thread</returns> bool IDryadVertexService.ScheduleProcess(string replyUri, int processId, string commandLine, StringDictionary environment) { DryadLogger.LogMethodEntry(processId, commandLine); bool startSuccess = false; Console.WriteLine("Starting process id {0} with commandLIne: '{1}", processId, commandLine); try { VertexProcess newProcess = null; lock (vertexProcessTable.SyncRoot) { foreach (VertexProcess vp in vertexProcessTable) { if (vp.DryadId == processId) { // This means a previous call to Schedule process partially succeeded: // the call made it to the service but something went wrong with the response // so the GM's xcompute machinery retried the call. We can just return success // for this case rather than tearing down the process and creating a new one. return(true); } if (vp.State <= ProcessState.Running) { // There should be no other processes running. // If there are, it means a previous communication error // cause the GM to give up on this node for a while. // Kill anything that's still hanging around. vp.Cancel(true); } } newProcess = new VertexProcess( replyUri, processId, commandLine, environment, OperationContext.Current.Channel.LocalAddress.Uri.ToString() ); this.vertexProcessTable.Add(newProcess); } startSuccess = newProcess.Start(initializedEvent); } catch (Exception e) { DryadLogger.LogWarning("Schedule Process", "Operation threw exception: {0}", e.ToString()); throw new FaultException <VertexServiceError>(new VertexServiceError("ReleaseProcess", e.ToString())); } DryadLogger.LogMethodExit(startSuccess); return(startSuccess); }
/// <summary> /// Schedule a vertex host process using the provided parameters /// </summary> /// <param name="replyUri">callback URI</param> /// <param name="processId">vertex process id</param> /// <param name="commandLine">vertex host command line</param> /// <param name="environment">vertex host environment variables</param> /// <returns>Success/Failure of starting vertex process thread</returns> bool IDryadVertexService.ScheduleProcess(string replyUri, int processId, string commandLine, StringDictionary environment) { DryadLogger.LogMethodEntry(processId, commandLine); bool startSuccess = false; Console.WriteLine("Starting process id {0} with commandLIne: '{1}", processId, commandLine); try { VertexProcess newProcess = null; lock (vertexProcessTable.SyncRoot) { foreach (VertexProcess vp in vertexProcessTable) { if (vp.DryadId == processId) { // This means a previous call to Schedule process partially succeeded: // the call made it to the service but something went wrong with the response // so the GM's xcompute machinery retried the call. We can just return success // for this case rather than tearing down the process and creating a new one. return true; } if (vp.State <= ProcessState.Running) { // There should be no other processes running. // If there are, it means a previous communication error // cause the GM to give up on this node for a while. // Kill anything that's still hanging around. vp.Cancel(true); } } newProcess = new VertexProcess( replyUri, processId, commandLine, environment, OperationContext.Current.Channel.LocalAddress.Uri.ToString() ); this.vertexProcessTable.Add(newProcess); } startSuccess = newProcess.Start(initializedEvent); } catch (Exception e) { DryadLogger.LogWarning("Schedule Process", "Operation threw exception: {0}", e.ToString()); throw new FaultException<VertexServiceError>(new VertexServiceError("ReleaseProcess", e.ToString())); } DryadLogger.LogMethodExit(startSuccess); return startSuccess; }