mirror of https://gitee.com/bigwinds/arangodb
fix revision conflict handling
This commit is contained in:
parent
2ececd8fb0
commit
df3d33774e
|
@ -2628,8 +2628,10 @@ int MMFilesCollection::insert(transaction::Methods* trx,
|
||||||
operation.setRevisions(DocumentDescriptor(),
|
operation.setRevisions(DocumentDescriptor(),
|
||||||
DocumentDescriptor(revisionId, doc.begin()));
|
DocumentDescriptor(revisionId, doc.begin()));
|
||||||
|
|
||||||
|
MMFilesDocumentPosition old;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
insertRevision(revisionId, marker->vpack(), 0, true, true);
|
old = insertRevision(revisionId, marker->vpack(), 0, true, true);
|
||||||
// and go on with the insertion...
|
// and go on with the insertion...
|
||||||
} catch (basics::Exception const& ex) {
|
} catch (basics::Exception const& ex) {
|
||||||
return ex.code();
|
return ex.code();
|
||||||
|
@ -2667,6 +2669,9 @@ int MMFilesCollection::insert(transaction::Methods* trx,
|
||||||
// from the list of revisions
|
// from the list of revisions
|
||||||
try {
|
try {
|
||||||
removeRevision(revisionId, false);
|
removeRevision(revisionId, false);
|
||||||
|
if (old) {
|
||||||
|
insertRevision(old, true);
|
||||||
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
throw;
|
throw;
|
||||||
|
@ -2674,6 +2679,10 @@ int MMFilesCollection::insert(transaction::Methods* trx,
|
||||||
|
|
||||||
if (res != TRI_ERROR_NO_ERROR) {
|
if (res != TRI_ERROR_NO_ERROR) {
|
||||||
operation.revert(trx);
|
operation.revert(trx);
|
||||||
|
|
||||||
|
if (old) {
|
||||||
|
insertRevision(old, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2738,10 +2747,14 @@ uint8_t const* MMFilesCollection::lookupRevisionVPackConditional(TRI_voc_rid_t r
|
||||||
return vpack;
|
return vpack;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMFilesCollection::insertRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock) {
|
MMFilesDocumentPosition MMFilesCollection::insertRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock) {
|
||||||
TRI_ASSERT(revisionId != 0);
|
TRI_ASSERT(revisionId != 0);
|
||||||
TRI_ASSERT(dataptr != nullptr);
|
TRI_ASSERT(dataptr != nullptr);
|
||||||
_revisionsCache.insert(revisionId, dataptr, fid, isInWal, shouldLock);
|
return _revisionsCache.insert(revisionId, dataptr, fid, isInWal, shouldLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MMFilesCollection::insertRevision(MMFilesDocumentPosition const& position, bool shouldLock) {
|
||||||
|
return _revisionsCache.insert(position, shouldLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMFilesCollection::updateRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal) {
|
void MMFilesCollection::updateRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal) {
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "Indexes/IndexLookupContext.h"
|
#include "Indexes/IndexLookupContext.h"
|
||||||
#include "MMFiles/MMFilesDatafileStatistics.h"
|
#include "MMFiles/MMFilesDatafileStatistics.h"
|
||||||
#include "MMFiles/MMFilesDitch.h"
|
#include "MMFiles/MMFilesDitch.h"
|
||||||
|
#include "MMFiles/MMFilesDocumentPosition.h"
|
||||||
#include "MMFiles/MMFilesRevisionsCache.h"
|
#include "MMFiles/MMFilesRevisionsCache.h"
|
||||||
#include "VocBase/KeyGenerator.h"
|
#include "VocBase/KeyGenerator.h"
|
||||||
#include "VocBase/ManagedDocumentResult.h"
|
#include "VocBase/ManagedDocumentResult.h"
|
||||||
|
@ -352,9 +353,11 @@ class MMFilesCollection final : public PhysicalCollection {
|
||||||
TRI_voc_rid_t newRevisionId,
|
TRI_voc_rid_t newRevisionId,
|
||||||
velocypack::Slice const& newDoc);
|
velocypack::Slice const& newDoc);
|
||||||
|
|
||||||
void insertRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr,
|
MMFilesDocumentPosition insertRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr,
|
||||||
TRI_voc_fid_t fid, bool isInWal, bool shouldLock);
|
TRI_voc_fid_t fid, bool isInWal, bool shouldLock);
|
||||||
|
|
||||||
|
void insertRevision(MMFilesDocumentPosition const& position, bool shouldLock);
|
||||||
|
|
||||||
void updateRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr,
|
void updateRevision(TRI_voc_rid_t revisionId, uint8_t const* dataptr,
|
||||||
TRI_voc_fid_t fid, bool isInWal);
|
TRI_voc_fid_t fid, bool isInWal);
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ void MMFilesRevisionsCache::clear() {
|
||||||
_positions.truncate([](MMFilesDocumentPosition&) { return true; });
|
_positions.truncate([](MMFilesDocumentPosition&) { return true; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMFilesRevisionsCache::insert(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock) {
|
MMFilesDocumentPosition MMFilesRevisionsCache::insert(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock) {
|
||||||
TRI_ASSERT(revisionId != 0);
|
TRI_ASSERT(revisionId != 0);
|
||||||
TRI_ASSERT(dataptr != nullptr);
|
TRI_ASSERT(dataptr != nullptr);
|
||||||
|
|
||||||
|
@ -101,9 +101,17 @@ void MMFilesRevisionsCache::insert(TRI_voc_rid_t revisionId, uint8_t const* data
|
||||||
int res = _positions.insert(nullptr, MMFilesDocumentPosition(revisionId, dataptr, fid, isInWal));
|
int res = _positions.insert(nullptr, MMFilesDocumentPosition(revisionId, dataptr, fid, isInWal));
|
||||||
|
|
||||||
if (res != TRI_ERROR_NO_ERROR) {
|
if (res != TRI_ERROR_NO_ERROR) {
|
||||||
_positions.removeByKey(nullptr, &revisionId);
|
MMFilesDocumentPosition old = _positions.removeByKey(nullptr, &revisionId);
|
||||||
_positions.insert(nullptr, MMFilesDocumentPosition(revisionId, dataptr, fid, isInWal));
|
_positions.insert(nullptr, MMFilesDocumentPosition(revisionId, dataptr, fid, isInWal));
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return MMFilesDocumentPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MMFilesRevisionsCache::insert(MMFilesDocumentPosition const& position, bool shouldLock) {
|
||||||
|
CONDITIONAL_WRITE_LOCKER(locker, _lock, shouldLock);
|
||||||
|
_positions.insert(nullptr, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMFilesRevisionsCache::update(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal) {
|
void MMFilesRevisionsCache::update(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal) {
|
||||||
|
|
|
@ -46,7 +46,8 @@ class MMFilesRevisionsCache {
|
||||||
size_t memoryUsage();
|
size_t memoryUsage();
|
||||||
void clear();
|
void clear();
|
||||||
MMFilesDocumentPosition lookup(TRI_voc_rid_t revisionId) const;
|
MMFilesDocumentPosition lookup(TRI_voc_rid_t revisionId) const;
|
||||||
void insert(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock);
|
MMFilesDocumentPosition insert(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock);
|
||||||
|
void insert(MMFilesDocumentPosition const& position, bool shouldLock);
|
||||||
void update(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal);
|
void update(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal);
|
||||||
bool updateConditional(TRI_voc_rid_t revisionId, TRI_df_marker_t const* oldPosition, TRI_df_marker_t const* newPosition, TRI_voc_fid_t newFid, bool isInWal);
|
bool updateConditional(TRI_voc_rid_t revisionId, TRI_df_marker_t const* oldPosition, TRI_df_marker_t const* newPosition, TRI_voc_fid_t newFid, bool isInWal);
|
||||||
void remove(TRI_voc_rid_t revisionId);
|
void remove(TRI_voc_rid_t revisionId);
|
||||||
|
|
Loading…
Reference in New Issue