private void OnStateChange(object sender, NodeLifecycleState state) { if (!(sender is INodeLifecycleManager evictionCandidate)) { return; } if (!_evictionPairs.TryGetValue(evictionCandidate.ManagedNode.IdHash, out EvictionPair evictionPair)) { return; } if (state == NodeLifecycleState.Active) { //survived eviction if (_logger.IsTrace) { _logger.Trace($"Survived eviction process, evictionCandidate: {evictionCandidate.ManagedNode}, replacementCandidate: {evictionPair.ReplacementCandidate.ManagedNode}"); } evictionPair.ReplacementCandidate.LostEvictionProcess(); CloseEvictionProcess(evictionCandidate); } else if (state == NodeLifecycleState.Unreachable) { //lost eviction, being replaced in nodeTable _nodeTable.ReplaceNode(evictionCandidate.ManagedNode, evictionPair.ReplacementCandidate.ManagedNode); if (_logger.IsTrace) { _logger.Trace($"Lost eviction process, evictionCandidate: {evictionCandidate.ManagedNode}, replacementCandidate: {evictionPair.ReplacementCandidate.ManagedNode}"); } CloseEvictionProcess(evictionCandidate); } }