private void ReplicateSegment(Segment segment)
        {
            while (true)
            {
                log.DebugFormat("Starting replication of segment [{0}] from {1}",
                                segment,
                                endpoint.Sync);

                var result = otherNode.ReplicateNextPage(node.Endpoint, type, segment.Index);
                log.DebugFormat("Replication of segment [{0}] from {1} got {2} puts & {3} removals",
                                segment,
                                endpoint.Sync,
                                result.PutRequests.Length,
                                result.RemoveRequests.Length);

                if (result.PutRequests.Length != 0)
                {
                    node.Storage.Put(node.GetTopologyVersion(), result.PutRequests);
                }

                if (result.RemoveRequests.Length != 0)
                {
                    node.Storage.Remove(node.GetTopologyVersion(), result.RemoveRequests);
                }

                if (result.Done)
                {
                    break;
                }
            }
            node.DoneReplicatingSegments(type, segment.Index);
        }
            public void WhenItemIsRemovedWillResultInRemovalRequestOnNextReplicationPage()
            {
                var result = replication.ReplicateNextPage(NodeEndpoint.ForTest(1), ReplicationType.Ownership, 0);

                Assert.Equal(1, result.PutRequests.Length);
                node.Storage.Remove(node.GetTopologyVersion(), new ExtendedRemoveRequest
                {
                    Key             = "test",
                    SpecificVersion = putResult.Version,
                    Segment         = 0,
                });

                result = replication.ReplicateNextPage(NodeEndpoint.ForTest(1), ReplicationType.Ownership, 0);
                Assert.Equal(1, result.RemoveRequests.Length);
            }