private bool CheckExitedPeerProcesses(CommitLogMetadata metadata)
{
bool changed = false;
var processesToRemove = new HashSet<Process>(m_peerProcesses.Values);
foreach (KeyValuePair<Guid, CommitLogPeer> kvp in metadata.Peers.ToArray())
{
if (kvp.Key == m_peerID)
continue;
Process process;
if (m_peerProcesses.TryGetValue(kvp.Value.ProcessID, out process))
{
if (process.HasExited)
{
RemovePeer(metadata, kvp.Key);
changed = true;
}
else
{
processesToRemove.Remove(process);
}
}
else
{
try
{
process = Process.GetProcessById(kvp.Value.ProcessID);
m_peerProcesses[kvp.Value.ProcessID] = process;
}
catch (ArgumentException)
{
RemovePeer(metadata, kvp.Key);
changed = true;
}
}
}
foreach (Process process in processesToRemove)
{
m_peerProcesses.Remove(process.Id);
process.Close();
}
return changed;
}