mirror of https://gitee.com/bigwinds/arangodb
add part of sliceify in replication-dump
This commit is contained in:
parent
cea8110c2e
commit
f195b09783
|
@ -24,6 +24,7 @@
|
||||||
#include "replication-dump.h"
|
#include "replication-dump.h"
|
||||||
#include "Basics/ReadLocker.h"
|
#include "Basics/ReadLocker.h"
|
||||||
#include "Basics/StaticStrings.h"
|
#include "Basics/StaticStrings.h"
|
||||||
|
#include "Basics/StringRef.h"
|
||||||
#include "Basics/VPackStringBufferAdapter.h"
|
#include "Basics/VPackStringBufferAdapter.h"
|
||||||
#include "Logger/Logger.h"
|
#include "Logger/Logger.h"
|
||||||
#include "VocBase/CompactionLocker.h"
|
#include "VocBase/CompactionLocker.h"
|
||||||
|
@ -320,6 +321,141 @@ static int StringifyMarker(TRI_replication_dump_t* dump,
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int SliceifyMarker(TRI_replication_dump_t* dump,
|
||||||
|
TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId,
|
||||||
|
TRI_df_marker_t const* marker, bool isDump,
|
||||||
|
bool withTicks, bool isEdgeCollection) {
|
||||||
|
TRI_ASSERT(MustReplicateWalMarkerType(marker));
|
||||||
|
TRI_df_marker_type_t const type = marker->getType();
|
||||||
|
|
||||||
|
VPackBuilder builder(&dump->_vpackOptions);
|
||||||
|
|
||||||
|
if (!isDump) {
|
||||||
|
builder.openObject();
|
||||||
|
// logger-follow command
|
||||||
|
builder.add("tick", VPackValue(static_cast<uint64_t>(marker->getTick())));
|
||||||
|
|
||||||
|
if (dump->_compat28 && (type == TRI_DF_MARKER_VPACK_DOCUMENT ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_REMOVE)) {
|
||||||
|
// 2.8-compatible format
|
||||||
|
VPackSlice slice(reinterpret_cast<char const*>(marker) +
|
||||||
|
DatafileHelper::VPackOffset(type));
|
||||||
|
// additionally dump "key" and "rev" attributes on the top-level
|
||||||
|
builder.add("key", slice.get(StaticStrings::KeyString));
|
||||||
|
if (slice.hasKey(StaticStrings::RevString)) {
|
||||||
|
builder.add("rev", slice.get(StaticStrings::RevString));
|
||||||
|
}
|
||||||
|
// convert 2300 markers to 2301 markers for edges
|
||||||
|
if (type == TRI_DF_MARKER_VPACK_DOCUMENT && isEdgeCollection) {
|
||||||
|
builder.add("type", VPackValue(2301));
|
||||||
|
} else {
|
||||||
|
builder.add("type",
|
||||||
|
VPackValue(static_cast<uint64_t>(TranslateType(marker))));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 3.0 dump
|
||||||
|
builder.add("type",
|
||||||
|
VPackValue(static_cast<uint64_t>(TranslateType(marker))));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == TRI_DF_MARKER_VPACK_DOCUMENT ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_REMOVE ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION) {
|
||||||
|
// transaction id
|
||||||
|
builder.add("tid", VPackValue(DatafileHelper::TransactionId(marker)));
|
||||||
|
}
|
||||||
|
if (databaseId > 0) {
|
||||||
|
builder.add("database", VPackValue(databaseId));
|
||||||
|
if (collectionId > 0) {
|
||||||
|
builder.add("cid", VPackValue(collectionId));
|
||||||
|
// also include collection name
|
||||||
|
char const* cname = NameFromCid(dump, collectionId);
|
||||||
|
if (cname != nullptr) {
|
||||||
|
builder.add("cname", VPackValue(cname));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// collection dump
|
||||||
|
if (withTicks) {
|
||||||
|
Append(dump, "{\"tick\":\"");
|
||||||
|
Append(dump, static_cast<uint64_t>(marker->getTick()));
|
||||||
|
Append(dump, "\",");
|
||||||
|
} else {
|
||||||
|
Append(dump, "{");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dump->_compat28 && (type == TRI_DF_MARKER_VPACK_DOCUMENT ||
|
||||||
|
type == TRI_DF_MARKER_VPACK_REMOVE)) {
|
||||||
|
// 2.8-compatible format
|
||||||
|
VPackSlice slice(reinterpret_cast<char const*>(marker) +
|
||||||
|
DatafileHelper::VPackOffset(type));
|
||||||
|
arangodb::basics::VPackStringBufferAdapter adapter(dump->_buffer);
|
||||||
|
VPackDumper dumper(
|
||||||
|
&adapter,
|
||||||
|
&dump->_vpackOptions); // note: we need the CustomTypeHandler here
|
||||||
|
|
||||||
|
// additionally dump "key" and "rev" attributes on the top-level
|
||||||
|
Append(dump, "\"key\":");
|
||||||
|
dumper.dump(slice.get(StaticStrings::KeyString));
|
||||||
|
if (slice.hasKey(StaticStrings::RevString)) {
|
||||||
|
Append(dump, ",\"rev\":");
|
||||||
|
dumper.dump(slice.get(StaticStrings::RevString));
|
||||||
|
}
|
||||||
|
// convert 2300 markers to 2301 markers for edges
|
||||||
|
Append(dump, ",\"type\":");
|
||||||
|
if (type == TRI_DF_MARKER_VPACK_DOCUMENT && isEdgeCollection) {
|
||||||
|
Append(dump, 2301);
|
||||||
|
} else {
|
||||||
|
Append(dump, static_cast<uint64_t>(TranslateType(marker)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Append(dump, "\"type\":");
|
||||||
|
Append(dump, static_cast<uint64_t>(TranslateType(marker)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TRI_DF_MARKER_VPACK_DOCUMENT:
|
||||||
|
case TRI_DF_MARKER_VPACK_REMOVE:
|
||||||
|
case TRI_DF_MARKER_VPACK_CREATE_DATABASE:
|
||||||
|
case TRI_DF_MARKER_VPACK_CREATE_COLLECTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_CREATE_INDEX:
|
||||||
|
case TRI_DF_MARKER_VPACK_RENAME_COLLECTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_CHANGE_COLLECTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_DROP_DATABASE:
|
||||||
|
case TRI_DF_MARKER_VPACK_DROP_COLLECTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_DROP_INDEX: {
|
||||||
|
Append(dump, ",\"data\":");
|
||||||
|
|
||||||
|
VPackSlice slice(reinterpret_cast<char const*>(marker) +
|
||||||
|
DatafileHelper::VPackOffset(type));
|
||||||
|
arangodb::basics::VPackStringBufferAdapter adapter(dump->_buffer);
|
||||||
|
VPackDumper dumper(
|
||||||
|
&adapter,
|
||||||
|
&dump->_vpackOptions); // note: we need the CustomTypeHandler here
|
||||||
|
dumper.dump(slice);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION:
|
||||||
|
case TRI_DF_MARKER_VPACK_ABORT_TRANSACTION: {
|
||||||
|
// nothing to do
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
TRI_ASSERT(false);
|
||||||
|
return TRI_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Append(dump, "}\n");
|
||||||
|
return TRI_ERROR_NO_ERROR;
|
||||||
|
}
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief whether or not a marker belongs to a transaction
|
/// @brief whether or not a marker belongs to a transaction
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -399,7 +535,7 @@ static int DumpCollection(TRI_replication_dump_t* dump,
|
||||||
LogicalCollection* collection,
|
LogicalCollection* collection,
|
||||||
TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId,
|
TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId,
|
||||||
TRI_voc_tick_t dataMin, TRI_voc_tick_t dataMax,
|
TRI_voc_tick_t dataMin, TRI_voc_tick_t dataMax,
|
||||||
bool withTicks) {
|
bool withTicks, bool useVpp = false) {
|
||||||
LOG(TRACE) << "dumping collection " << collection->cid() << ", tick range "
|
LOG(TRACE) << "dumping collection " << collection->cid() << ", tick range "
|
||||||
<< dataMin << " - " << dataMax;
|
<< dataMin << " - " << dataMax;
|
||||||
|
|
||||||
|
@ -410,18 +546,25 @@ static int DumpCollection(TRI_replication_dump_t* dump,
|
||||||
bool bufferFull = false;
|
bool bufferFull = false;
|
||||||
|
|
||||||
auto callback = [&dump, &lastFoundTick, &databaseId, &collectionId,
|
auto callback = [&dump, &lastFoundTick, &databaseId, &collectionId,
|
||||||
&withTicks, &isEdgeCollection, &bufferFull](
|
&withTicks, &isEdgeCollection, &bufferFull, &useVpp](
|
||||||
TRI_voc_tick_t foundTick, TRI_df_marker_t const* marker) {
|
TRI_voc_tick_t foundTick, TRI_df_marker_t const* marker) {
|
||||||
// note the last tick we processed
|
// note the last tick we processed
|
||||||
lastFoundTick = foundTick;
|
lastFoundTick = foundTick;
|
||||||
|
|
||||||
int res = StringifyMarker(dump, databaseId, collectionId, marker, true,
|
int res;
|
||||||
|
if (useVpp) {
|
||||||
|
res = SliceifyMarker(dump, databaseId, collectionId, marker, true,
|
||||||
withTicks, isEdgeCollection);
|
withTicks, isEdgeCollection);
|
||||||
|
} else {
|
||||||
|
res = StringifyMarker(dump, databaseId, collectionId, marker, true,
|
||||||
|
withTicks, isEdgeCollection);
|
||||||
|
}
|
||||||
|
|
||||||
if (res != TRI_ERROR_NO_ERROR) {
|
if (res != TRI_ERROR_NO_ERROR) {
|
||||||
THROW_ARANGO_EXCEPTION(res);
|
THROW_ARANGO_EXCEPTION(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO if vppcase find out slice lenght of _slices.back()
|
||||||
if (static_cast<uint64_t>(TRI_LengthStringBuffer(dump->_buffer)) >
|
if (static_cast<uint64_t>(TRI_LengthStringBuffer(dump->_buffer)) >
|
||||||
dump->_chunkSize) {
|
dump->_chunkSize) {
|
||||||
// abort the iteration
|
// abort the iteration
|
||||||
|
|
|
@ -32,7 +32,13 @@
|
||||||
#include "VocBase/voc-types.h"
|
#include "VocBase/voc-types.h"
|
||||||
#include "VocBase/vocbase.h"
|
#include "VocBase/vocbase.h"
|
||||||
|
|
||||||
|
#include <velocypack/Builder.h>
|
||||||
|
#include <velocypack/Dumper.h>
|
||||||
|
#include <velocypack/Iterator.h>
|
||||||
#include <velocypack/Options.h>
|
#include <velocypack/Options.h>
|
||||||
|
#include <velocypack/velocypack-aliases.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief replication dump container
|
/// @brief replication dump container
|
||||||
|
@ -56,18 +62,21 @@ struct TRI_replication_dump_t {
|
||||||
_hasMore(false),
|
_hasMore(false),
|
||||||
_includeSystem(includeSystem),
|
_includeSystem(includeSystem),
|
||||||
_fromTickIncluded(false),
|
_fromTickIncluded(false),
|
||||||
_compat28(false) {
|
_compat28(false),
|
||||||
|
_slices() {
|
||||||
if (_chunkSize == 0) {
|
if (_chunkSize == 0) {
|
||||||
// default chunk size
|
// default chunk size
|
||||||
_chunkSize = 128 * 1024;
|
_chunkSize = 128 * 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!useVpp) {
|
||||||
_buffer = TRI_CreateSizedStringBuffer(TRI_UNKNOWN_MEM_ZONE, _chunkSize);
|
_buffer = TRI_CreateSizedStringBuffer(TRI_UNKNOWN_MEM_ZONE, _chunkSize);
|
||||||
|
|
||||||
if (_buffer == nullptr) {
|
if (_buffer == nullptr) {
|
||||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
|
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
~TRI_replication_dump_t() {
|
~TRI_replication_dump_t() {
|
||||||
if (_buffer != nullptr) {
|
if (_buffer != nullptr) {
|
||||||
|
@ -90,6 +99,7 @@ struct TRI_replication_dump_t {
|
||||||
bool _includeSystem;
|
bool _includeSystem;
|
||||||
bool _fromTickIncluded;
|
bool _fromTickIncluded;
|
||||||
bool _compat28;
|
bool _compat28;
|
||||||
|
std::vector<VPackBuffer<uint64_t>> _slices;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue