1
0
Fork 0

remove _rid from master pointer

This commit is contained in:
Jan Steemann 2016-03-01 15:06:54 +01:00
parent acf308f3dc
commit 0cb0c0142f
9 changed files with 49 additions and 61 deletions

View File

@ -184,7 +184,6 @@ int ModificationBlock::extractKey(AqlValue const& value,
void ModificationBlock::constructMptr(TRI_doc_mptr_t* dst,
TRI_df_marker_t const* marker) const {
dst->_rid = TRI_EXTRACT_MARKER_RID(marker);
dst->_fid = 0;
dst->_hash = 0;
dst->setDataPtr(marker);

View File

@ -1450,7 +1450,7 @@ int InitialSyncer::handleSyncKeys(TRI_vocbase_col_t* col,
if (mptr == nullptr) {
// key not found locally
toFetch.emplace_back(i);
} else if (std::to_string(mptr->_rid) !=
} else if (std::to_string(mptr->revisionId()) !=
std::string(ridJson->_value._string.data,
ridJson->_value._string.length - 1)) {
// key found, but rid differs

View File

@ -542,10 +542,10 @@ OperationResult Transaction::documentLocal(std::string const& collectionName,
}
TRI_ASSERT(mptr.getDataPtr() != nullptr);
if (expectedRevision != 0 && expectedRevision != mptr._rid) {
if (expectedRevision != 0 && expectedRevision != mptr.revisionId()) {
// still return
VPackBuilder resultBuilder;
buildDocumentIdentity(resultBuilder, cid, key, mptr._rid, "");
buildDocumentIdentity(resultBuilder, cid, key, mptr.revisionId(), "");
return OperationResult(resultBuilder.steal(), nullptr, "",
TRI_ERROR_ARANGO_CONFLICT,
@ -763,7 +763,7 @@ OperationResult Transaction::insertLocal(std::string const& collectionName,
TRI_ASSERT(mptr.getDataPtr() != nullptr);
buildDocumentIdentity(resultBuilder, cid, keyString, mptr._rid, "");
buildDocumentIdentity(resultBuilder, cid, keyString, mptr.revisionId(), "");
return TRI_ERROR_NO_ERROR;
};
@ -946,7 +946,7 @@ OperationResult Transaction::updateLocal(std::string const& collectionName,
if (res == TRI_ERROR_ARANGO_CONFLICT) {
// still return
VPackBuilder resultBuilder;
buildDocumentIdentity(resultBuilder, cid, key, mptr._rid, "");
buildDocumentIdentity(resultBuilder, cid, key, mptr.revisionId(), "");
return OperationResult(resultBuilder.steal(), nullptr, "",
TRI_ERROR_ARANGO_CONFLICT,
@ -1130,7 +1130,7 @@ OperationResult Transaction::replaceLocal(std::string const& collectionName,
if (res == TRI_ERROR_ARANGO_CONFLICT) {
// still return
VPackBuilder resultBuilder;
buildDocumentIdentity(resultBuilder, cid, key, mptr._rid, "");
buildDocumentIdentity(resultBuilder, cid, key, mptr.revisionId(), "");
return OperationResult(resultBuilder.steal(), nullptr, "",
TRI_ERROR_ARANGO_CONFLICT,

View File

@ -1073,19 +1073,29 @@ static bool ChecksumCalculator(TRI_doc_mptr_t const* mptr,
// TODO vpack
if (marker->_type == TRI_DOC_MARKER_KEY_DOCUMENT ||
marker->_type == TRI_WAL_MARKER_VPACK_DOCUMENT) {
TRI_voc_rid_t rid = 0;
if (WR) {
rid = mptr->revisionId();
}
localCrc = TRI_Crc32HashString(
TRI_EXTRACT_MARKER_KEY(mptr)); // PROTECTED by trx in calling function
// TRI_DocumentIteratorDocumentCollection
if (WR) {
localCrc += TRI_Crc32HashPointer(&mptr->_rid, sizeof(TRI_voc_rid_t));
localCrc += TRI_Crc32HashPointer(&rid, sizeof(TRI_voc_rid_t));
}
} else if (marker->_type == TRI_DOC_MARKER_KEY_EDGE) {
// must convert _rid, _fromCid, _toCid into strings for portability
TRI_voc_rid_t rid = 0;
if (WR) {
rid = mptr->revisionId();
}
localCrc = TRI_Crc32HashString(
TRI_EXTRACT_MARKER_KEY(mptr)); // PROTECTED by trx in calling function
// TRI_DocumentIteratorDocumentCollection
if (WR) {
localCrc += TRI_Crc32HashPointer(&mptr->_rid, sizeof(TRI_voc_rid_t));
localCrc += TRI_Crc32HashPointer(&rid, sizeof(TRI_voc_rid_t));
}
if (marker->_type == TRI_DOC_MARKER_KEY_EDGE) {

View File

@ -485,8 +485,7 @@ bool ExampleMatcher::matches(TRI_voc_cid_t cid,
// Match _rev
it = def._internal.find(internalAttr::rev);
if (it != def._internal.end()) {
if (arangodb::basics::StringUtils::uint64(it->second.key) !=
mptr->_rid) {
if (arangodb::basics::StringUtils::uint64(it->second.key) != mptr->revisionId()) {
goto nextExample;
}
}

View File

@ -398,9 +398,8 @@ static bool Compactifier(TRI_df_marker_t const* marker, void* data,
// check if the document is still active
auto primaryIndex = document->primaryIndex();
auto found = static_cast<TRI_doc_mptr_t const*>(
primaryIndex->lookupKey(context->_trx, keySlice));
bool deleted = (found == nullptr || found->_rid > rid);
auto found = primaryIndex->lookupKey(context->_trx, keySlice);
bool deleted = (found == nullptr || found->revisionId() > rid);
if (deleted) {
// found a dead document
@ -544,9 +543,8 @@ static bool CalculateSize(TRI_df_marker_t const* marker, void* data,
// check if the document is still active
auto primaryIndex = document->primaryIndex();
auto found = static_cast<TRI_doc_mptr_t const*>(
primaryIndex->lookupKey(context->_trx, keySlice));
bool deleted = (found == nullptr || found->_rid > rid);
auto found = primaryIndex->lookupKey(context->_trx, keySlice);
bool deleted = (found == nullptr || found->revisionId() > rid);
if (deleted) {
return true;

View File

@ -32,6 +32,7 @@
#include "Basics/Logger.h"
#include "Basics/tri-strings.h"
#include "Basics/ThreadPool.h"
#include "Basics/VelocyPackHelper.h"
#include "Basics/WriteLocker.h"
#include "Cluster/ServerState.h"
#include "FulltextIndex/fulltext-index.h"
@ -67,6 +68,18 @@
using namespace arangodb;
using namespace arangodb::basics;
TRI_voc_rid_t TRI_doc_mptr_t::revisionId() const {
VPackSlice const slice(vpack());
VPackSlice const revisionSlice = slice.get(TRI_VOC_ATTRIBUTE_REV);
if (revisionSlice.isString()) {
return arangodb::basics::VelocyPackHelper::stringUInt64(revisionSlice);
}
else if (revisionSlice.isNumber()) {
return revisionSlice.getNumber<TRI_voc_rid_t>();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief create a document collection
@ -738,19 +751,6 @@ static int CleanupIndexes(TRI_document_collection_t* document) {
return res;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generates a new revision id if not yet set
////////////////////////////////////////////////////////////////////////////////
static inline TRI_voc_rid_t GetRevisionId(TRI_voc_rid_t previous) {
if (previous != 0) {
return previous;
}
// generate new revision id
return static_cast<TRI_voc_rid_t>(TRI_NewTickServer());
}
////////////////////////////////////////////////////////////////////////////////
/// @brief state during opening of a collection
////////////////////////////////////////////////////////////////////////////////
@ -848,10 +848,9 @@ static int OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* marker,
return TRI_ERROR_OUT_OF_MEMORY;
}
header->_rid = rid;
header->_fid = fid;
header->setDataPtr(marker); // ONLY IN OPENITERATOR
header->_hash = primaryIndex->calculateHash(trx, keySlice);
header->setDataPtr(marker); // ONLY IN OPENITERATOR
// insert into primary index
void const* result = nullptr;
@ -872,13 +871,12 @@ static int OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* marker,
}
// it is an update, but only if found has a smaller revision identifier
else if (found->_rid < rid ||
(found->_rid == rid && found->_fid <= fid)) {
else if (found->revisionId() < rid ||
(found->revisionId() == rid && found->_fid <= fid)) {
// save the old data
TRI_doc_mptr_t oldData = *found;
// update the header info
found->_rid = rid;
found->_fid = fid;
found->setDataPtr(marker);
@ -3644,7 +3642,6 @@ TRI_ASSERT(false);
// update the header we got
void* mem = operation.marker->mem();
header->_rid = rid;
header->setDataPtr(mem); // PROTECTED by trx in trxCollection
header->_hash = hash;
@ -3825,7 +3822,6 @@ int TRI_document_collection_t::read(Transaction* trx, std::string const& key,
}
TRI_ASSERT(mptr->getDataPtr() != nullptr);
TRI_ASSERT(mptr->_rid > 0);
return TRI_ERROR_NO_ERROR;
}
@ -3844,8 +3840,6 @@ int TRI_document_collection_t::insert(Transaction* trx, VPackSlice const* slice,
VPackSlice const key(slice->get(TRI_VOC_ATTRIBUTE_KEY));
uint64_t const hash = key.hash();
TRI_voc_rid_t revisionId = Transaction::extractRevisionId(slice);
std::unique_ptr<arangodb::wal::Marker> marker;
if (options.recoveryMarker == nullptr) {
marker.reset(createVPackInsertMarker(trx, slice));
@ -3895,7 +3889,6 @@ int TRI_document_collection_t::insert(Transaction* trx, VPackSlice const* slice,
// update the header we got
void* mem = operation.marker->mem();
header->_rid = revisionId;
header->_hash = hash;
header->setDataPtr(mem); // PROTECTED by trx in trxCollection
@ -3998,7 +3991,6 @@ int TRI_document_collection_t::update(Transaction* trx, VPackSlice const* slice,
if (res == TRI_ERROR_NO_ERROR) {
TRI_ASSERT(mptr->getDataPtr() != nullptr);
TRI_ASSERT(mptr->_rid > 0);
}
if (markerTick > 0) {
@ -4085,7 +4077,6 @@ int TRI_document_collection_t::replace(Transaction* trx, VPackSlice const* slice
if (res == TRI_ERROR_NO_ERROR) {
TRI_ASSERT(mptr->getDataPtr() != nullptr);
TRI_ASSERT(mptr->_rid > 0);
}
if (markerTick > 0) {
@ -4295,7 +4286,7 @@ int TRI_document_collection_t::lookupDocument(
}
if (policy != nullptr) {
return policy->check(header->_rid);
return policy->check(header->revisionId());
}
return TRI_ERROR_NO_ERROR;
@ -4329,9 +4320,7 @@ int TRI_document_collection_t::updateDocument(arangodb::Transaction* trx,
TRI_doc_mptr_t* newHeader = oldHeader;
// update the header. this will modify oldHeader, too !!!
newHeader->_rid = revisionId;
newHeader->setDataPtr(
operation.marker->mem());
newHeader->setDataPtr(operation.marker->mem());
// insert new document into secondary indexes
res = insertSecondaryIndexes(trx, newHeader, false);
@ -4434,8 +4423,7 @@ int TRI_document_collection_t::insertPrimaryIndex(arangodb::Transaction* trx,
TRI_doc_mptr_t* found;
TRI_ASSERT(header != nullptr);
TRI_ASSERT(header->getDataPtr() !=
nullptr); // ONLY IN INDEX, PROTECTED by RUNTIME
TRI_ASSERT(header->getDataPtr() != nullptr);
// insert into primary index
int res = primaryIndex()->insertKey(trx, header, (void const**)&found);

View File

@ -54,13 +54,11 @@ class Slice;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief master pointer
////////////////////////////////////////////////////////////////////////////////
struct TRI_doc_mptr_t {
TRI_voc_rid_t _rid; // this is the revision identifier
TRI_voc_fid_t _fid; // this is the datafile identifier
uint64_t _hash; // the pre-calculated hash value of the key
protected:
@ -69,8 +67,7 @@ struct TRI_doc_mptr_t {
public:
TRI_doc_mptr_t()
: _rid(0),
_fid(0),
: _fid(0),
_hash(0),
_dataptr(nullptr) {}
@ -78,15 +75,13 @@ struct TRI_doc_mptr_t {
~TRI_doc_mptr_t() {}
void clear() {
_rid = 0;
_fid = 0;
setDataPtr(nullptr);
_hash = 0;
setDataPtr(nullptr);
}
void copy(TRI_doc_mptr_t const& that) {
// This is for cases where we explicitly have to copy originals!
_rid = that._rid;
_fid = that._fid;
_dataptr = that._dataptr;
_hash = that._hash;
@ -113,12 +108,11 @@ struct TRI_doc_mptr_t {
inline void setDataPtr(void const* d) { _dataptr = d; }
inline uint8_t const* vpack() const {
TRI_df_marker_t const* marker =
static_cast<TRI_df_marker_t const*>(_dataptr);
return reinterpret_cast<uint8_t const*>(marker) + arangodb::DatafileHelper::VPackOffset(TRI_WAL_MARKER_VPACK_DOCUMENT);
return reinterpret_cast<uint8_t const*>(_dataptr) + arangodb::DatafileHelper::VPackOffset(TRI_WAL_MARKER_VPACK_DOCUMENT);
}
TRI_voc_rid_t revisionId() const;
//////////////////////////////////////////////////////////////////////////////
/// @brief return a pointer to the beginning of the shaped json stored in the
/// marker

View File

@ -695,7 +695,7 @@ void CollectorThread::processCollectionMarker(
auto found = document->primaryIndex()->lookupKey(&trx, slice.get(TRI_VOC_ATTRIBUTE_KEY));
if (found == nullptr || found->_rid != revisionId ||
if (found == nullptr || found->revisionId() != revisionId ||
found->getDataPtr() != walMarker) {
// somebody inserted a new revision of the document or the revision
// was already moved by the compactor
@ -727,7 +727,7 @@ void CollectorThread::processCollectionMarker(
auto found = document->primaryIndex()->lookupKey(&trx, slice.get(TRI_VOC_ATTRIBUTE_KEY));
if (found != nullptr && found->_rid > revisionId) {
if (found != nullptr && found->revisionId() > revisionId) {
// somebody re-created the document with a newer revision
dfi.numberDead++;
dfi.sizeDead += DatafileHelper::AlignedSize<int64_t>(datafileMarkerSize);