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);
        }
        private void HandleReplicateNextPage(StorageMessageUnion wrapper,
                                             MessageStreamWriter <StorageMessageUnion> writer)
        {
            var replicationResult = replication.ReplicateNextPage(
                wrapper.ReplicateNextPageRequest.ReplicationEndpoint.GetNodeEndpoint(),
                wrapper.ReplicateNextPageRequest.Type == ReplicationType.Backup ? Internal.ReplicationType.Backup : Internal.ReplicationType.Ownership,
                wrapper.ReplicateNextPageRequest.Segment
                );

            writer.Write(new StorageMessageUnion.Builder
            {
                Type = StorageMessageType.ReplicateNextPageResponse,
                ReplicateNextPageResponse = new ReplicateNextPageResponseMessage.Builder()
                {
                    Done = replicationResult.Done,
                    RemoveRequestsList =
                    {
                        replicationResult.RemoveRequests.Select(x => x.GetRemoveRequest()),
                    },
                    PutRequestsList =
                    {
                        replicationResult.PutRequests.Select(x => x.GetPutRequest())
                    }
                }.Build()
            }.Build());
        }
            public void WillGiveExistingKeysFromSegment()
            {
                var result = replication.ReplicateNextPage(NodeEndpoint.ForTest(1), ReplicationType.Ownership, 0);

                Assert.Equal(1, result.PutRequests.Length);
                Assert.Equal(new byte[] { 1 }, result.PutRequests[0].Bytes);
            }