diff --git a/arangod/RestHandler/RestReplicationHandler.cpp b/arangod/RestHandler/RestReplicationHandler.cpp index 74f405fd58..ed951ba70d 100644 --- a/arangod/RestHandler/RestReplicationHandler.cpp +++ b/arangod/RestHandler/RestReplicationHandler.cpp @@ -980,9 +980,9 @@ void RestReplicationHandler::handleCommandLoggerFollow() { // generate the result size_t length = 0; if (useVpp) { - length = TRI_LengthStringBuffer(dump._buffer); - } else { length = dump._slices.size(); + } else { + length = TRI_LengthStringBuffer(dump._buffer); } if (length == 0) { @@ -991,25 +991,25 @@ void RestReplicationHandler::handleCommandLoggerFollow() { resetResponse(rest::ResponseCode::OK); } + // transfer ownership of the buffer contents + _response->setContentType(rest::ContentType::DUMP); + + // set headers + _response->setHeaderNC(TRI_REPLICATION_HEADER_CHECKMORE, + checkMore ? "true" : "false"); + + _response->setHeaderNC(TRI_REPLICATION_HEADER_LASTINCLUDED, + StringUtils::itoa(dump._lastFoundTick)); + + _response->setHeaderNC(TRI_REPLICATION_HEADER_LASTTICK, + StringUtils::itoa(state.lastCommittedTick)); + + _response->setHeaderNC(TRI_REPLICATION_HEADER_ACTIVE, "true"); + + _response->setHeaderNC(TRI_REPLICATION_HEADER_FROMPRESENT, + dump._fromTickIncluded ? "true" : "false"); + if (length > 0) { - // transfer ownership of the buffer contents - _response->setContentType(rest::ContentType::DUMP); - - // set headers - _response->setHeaderNC(TRI_REPLICATION_HEADER_CHECKMORE, - checkMore ? "true" : "false"); - - _response->setHeaderNC(TRI_REPLICATION_HEADER_LASTINCLUDED, - StringUtils::itoa(dump._lastFoundTick)); - - _response->setHeaderNC(TRI_REPLICATION_HEADER_LASTTICK, - StringUtils::itoa(state.lastCommittedTick)); - - _response->setHeaderNC(TRI_REPLICATION_HEADER_ACTIVE, "true"); - - _response->setHeaderNC(TRI_REPLICATION_HEADER_FROMPRESENT, - dump._fromTickIncluded ? "true" : "false"); - if (useVpp) { for (auto message : dump._slices) { _response->addPayload(std::move(message), &dump._vpackOptions, true); diff --git a/arangod/VocBase/replication-dump.cpp b/arangod/VocBase/replication-dump.cpp index 5824ec4d5e..9ee7c70d34 100644 --- a/arangod/VocBase/replication-dump.cpp +++ b/arangod/VocBase/replication-dump.cpp @@ -328,7 +328,11 @@ static int SliceifyMarker(TRI_replication_dump_t* dump, TRI_ASSERT(MustReplicateWalMarkerType(marker)); TRI_df_marker_type_t const type = marker->getType(); - VPackBuilder builder(&dump->_vpackOptions); + VPackBuffer buffer; + std::shared_ptr> bufferPtr; + bufferPtr.reset(&buffer, arangodb::velocypack::BufferNonDeleter()); + + VPackBuilder builder(bufferPtr, &dump->_vpackOptions); builder.openObject(); if (!isDump) { @@ -437,6 +441,9 @@ static int SliceifyMarker(TRI_replication_dump_t* dump, } builder.close(); + + dump->_slices.push_back(std::move(buffer)); + return TRI_ERROR_NO_ERROR; } //////////////////////////////////////////////////////////////////////////////// @@ -948,7 +955,7 @@ int TRI_DetermineOpenTransactionsReplication(TRI_replication_dump_t* dump, dump->_lastFoundTick = lastFoundTick; // LOG(INFO) << "last tick2: " << lastFoundTick; - (dump->_slices).push_back(std::move(buffer)); + dump->_slices.push_back(std::move(buffer)); } catch (arangodb::basics::Exception const& ex) { res = ex.code();