private void SendDocumentsBatch(DocumentsOperationContext documentsContext, OutgoingReplicationStatsScope stats) { if (_log.IsInfoEnabled) { _log.Info($"Starting sending replication batch ({_parent._database.Name}) with {_orderedReplicaItems.Count:#,#;;0} docs, and last etag {_lastEtag:#,#;;0}"); } var sw = Stopwatch.StartNew(); var headerJson = new DynamicJsonValue { [nameof(ReplicationMessageHeader.Type)] = ReplicationMessageType.Documents, [nameof(ReplicationMessageHeader.LastDocumentEtag)] = _lastEtag, [nameof(ReplicationMessageHeader.ItemsCount)] = _orderedReplicaItems.Count, [nameof(ReplicationMessageHeader.AttachmentStreamsCount)] = _replicaAttachmentStreams.Count }; stats.RecordLastEtag(_lastEtag); _parent.WriteToServer(headerJson); foreach (var item in _orderedReplicaItems) { using (Slice.From(documentsContext.Allocator, item.Value.ChangeVector, out var cv)) { item.Value.Write(cv, _stream, _tempBuffer, stats); } } foreach (var item in _replicaAttachmentStreams) { item.Value.WriteStream(_stream, _tempBuffer); stats.RecordAttachmentOutput(item.Value.Stream.Length); } // close the transaction as early as possible, and before we wait for reply // from other side documentsContext.Transaction.Dispose(); _stream.Flush(); sw.Stop(); if (_log.IsInfoEnabled && _orderedReplicaItems.Count > 0) { _log.Info($"Finished sending replication batch. Sent {_orderedReplicaItems.Count:#,#;;0} documents and {_replicaAttachmentStreams.Count:#,#;;0} attachment streams in {sw.ElapsedMilliseconds:#,#;;0} ms. Last sent etag = {_lastEtag:#,#;;0}"); } var(type, _) = _parent.HandleServerResponse(); if (type == ReplicationMessageReply.ReplyType.MissingAttachments) { MissingAttachmentsInLastBatch = true; return; } _parent._lastSentDocumentEtag = _lastEtag; _parent._lastDocumentSentTime = DateTime.UtcNow; }
private void SendDocumentsBatch(DocumentsOperationContext documentsContext, OutgoingReplicationStatsScope stats) { if (_log.IsInfoEnabled) { _log.Info($"Starting sending replication batch ({_parent._database.Name}) with {_orderedReplicaItems.Count:#,#;;0} docs, and last etag {_lastEtag}"); } var sw = Stopwatch.StartNew(); var headerJson = new DynamicJsonValue { [nameof(ReplicationMessageHeader.Type)] = ReplicationMessageType.Documents, [nameof(ReplicationMessageHeader.LastDocumentEtag)] = _lastEtag, [nameof(ReplicationMessageHeader.ItemsCount)] = _orderedReplicaItems.Count, [nameof(ReplicationMessageHeader.AttachmentStreamsCount)] = _replicaAttachmentStreams.Count }; stats.RecordLastEtag(_lastEtag); _parent.WriteToServer(headerJson); foreach (var item in _orderedReplicaItems) { var value = item.Value; WriteItemToServer(documentsContext, value, stats); } foreach (var item in _replicaAttachmentStreams) { var value = item.Value; WriteAttachmentStreamToServer(value); stats.RecordAttachmentOutput(value.Stream.Length); } // close the transaction as early as possible, and before we wait for reply // from other side documentsContext.Transaction.Dispose(); _stream.Flush(); sw.Stop(); _parent._lastSentDocumentEtag = _lastEtag; if (_log.IsInfoEnabled && _orderedReplicaItems.Count > 0) { _log.Info($"Finished sending replication batch. Sent {_orderedReplicaItems.Count:#,#;;0} documents and {_replicaAttachmentStreams.Count:#,#;;0} attachment streams in {sw.ElapsedMilliseconds:#,#;;0} ms. Last sent etag = {_lastEtag}"); } _parent._lastDocumentSentTime = DateTime.UtcNow; _parent.HandleServerResponse(); }