1
0
Fork 0

Fixed startup exception

This commit is contained in:
Simon Grätzer 2017-04-26 20:35:20 +02:00
parent e87f4321da
commit 37cbb80d50
3 changed files with 35 additions and 29 deletions

View File

@ -71,7 +71,7 @@ static inline rocksdb::Transaction* rocksTransaction(
return static_cast<RocksDBTransactionState*>(trx->state()) return static_cast<RocksDBTransactionState*>(trx->state())
->rocksTransaction(); ->rocksTransaction();
} }
} } // namespace
RocksDBCollection::RocksDBCollection(LogicalCollection* collection, RocksDBCollection::RocksDBCollection(LogicalCollection* collection,
VPackSlice const& info) VPackSlice const& info)
@ -196,8 +196,8 @@ void RocksDBCollection::open(bool ignoreErrors) {
RocksDBEngine* engine = RocksDBEngine* engine =
static_cast<RocksDBEngine*>(EngineSelectorFeature::ENGINE); static_cast<RocksDBEngine*>(EngineSelectorFeature::ENGINE);
auto counterValue = engine->counterManager()->loadCounter(this->objectId()); auto counterValue = engine->counterManager()->loadCounter(this->objectId());
LOG_TOPIC(ERR, Logger::DEVEL) << " number of documents: " LOG_TOPIC(ERR, Logger::DEVEL)
<< counterValue.added(); << " number of documents: " << counterValue.added();
_numberDocuments = counterValue.added() - counterValue.removed(); _numberDocuments = counterValue.added() - counterValue.removed();
_revisionId = counterValue.revisionId(); _revisionId = counterValue.revisionId();
//_numberDocuments = countKeyRange(db, readOptions, //_numberDocuments = countKeyRange(db, readOptions,
@ -438,9 +438,8 @@ void RocksDBCollection::truncate(transaction::Methods* trx,
iter->Seek(documentBounds.start()); iter->Seek(documentBounds.start());
while (iter->Valid() && cmp->Compare(iter->key(), documentBounds.end()) < 0) { while (iter->Valid() && cmp->Compare(iter->key(), documentBounds.end()) < 0) {
TRI_voc_rid_t revisionId = RocksDBKey::revisionId(iter->key()); TRI_voc_rid_t revisionId = RocksDBKey::revisionId(iter->key());
// add possible log statement // add possible log statement
state->prepareOperation(cid, revisionId, TRI_VOC_DOCUMENT_OPERATION_REMOVE); state->prepareOperation(cid, revisionId, TRI_VOC_DOCUMENT_OPERATION_REMOVE);
rocksdb::Status s = rtrx->Delete(iter->key()); rocksdb::Status s = rtrx->Delete(iter->key());
@ -613,6 +612,11 @@ int RocksDBCollection::insert(arangodb::transaction::Methods* trx,
RocksDBSavePoint guard(rocksTransaction(trx), RocksDBSavePoint guard(rocksTransaction(trx),
trx->isSingleOperationTransaction()); trx->isSingleOperationTransaction());
RocksDBTransactionState* state =
static_cast<RocksDBTransactionState*>(trx->state());
state->prepareOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_INSERT);
res = insertDocument(trx, revisionId, newSlice, options.waitForSync); res = insertDocument(trx, revisionId, newSlice, options.waitForSync);
if (res.ok()) { if (res.ok()) {
Result lookupResult = lookupRevisionVPack(revisionId, trx, mdr); Result lookupResult = lookupRevisionVPack(revisionId, trx, mdr);
@ -622,11 +626,9 @@ int RocksDBCollection::insert(arangodb::transaction::Methods* trx,
} }
// report document and key size // report document and key size
RocksDBOperationResult result = RocksDBOperationResult result = state->addOperation(
static_cast<RocksDBTransactionState*>(trx->state()) _logicalCollection->cid(), revisionId,
->addOperation(_logicalCollection->cid(), revisionId, TRI_VOC_DOCUMENT_OPERATION_INSERT, newSlice.byteSize(), res.keySize());
TRI_VOC_DOCUMENT_OPERATION_INSERT,
newSlice.byteSize(), res.keySize());
// transaction size limit reached -- fail // transaction size limit reached -- fail
if (result.fail()) { if (result.fail()) {
@ -701,7 +703,8 @@ int RocksDBCollection::update(arangodb::transaction::Methods* trx,
mergeObjectsForUpdate(trx, oldDoc, newSlice, isEdgeCollection, mergeObjectsForUpdate(trx, oldDoc, newSlice, isEdgeCollection,
TRI_RidToString(revisionId), options.mergeObjects, TRI_RidToString(revisionId), options.mergeObjects,
options.keepNull, *builder.get()); options.keepNull, *builder.get());
RocksDBTransactionState* state = static_cast<RocksDBTransactionState*>(trx->state()); RocksDBTransactionState* state =
static_cast<RocksDBTransactionState*>(trx->state());
if (state->isDBServer()) { if (state->isDBServer()) {
// Need to check that no sharding keys have changed: // Need to check that no sharding keys have changed:
if (arangodb::shardKeysChanged(_logicalCollection->dbName(), if (arangodb::shardKeysChanged(_logicalCollection->dbName(),
@ -714,7 +717,7 @@ int RocksDBCollection::update(arangodb::transaction::Methods* trx,
RocksDBSavePoint guard(rocksTransaction(trx), RocksDBSavePoint guard(rocksTransaction(trx),
trx->isSingleOperationTransaction()); trx->isSingleOperationTransaction());
// add possible log statement under guard // add possible log statement under guard
state->prepareOperation(_logicalCollection->cid(), revisionId, state->prepareOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_UPDATE); TRI_VOC_DOCUMENT_OPERATION_UPDATE);
@ -731,9 +734,9 @@ int RocksDBCollection::update(arangodb::transaction::Methods* trx,
TRI_ASSERT(!mdr.empty()); TRI_ASSERT(!mdr.empty());
// report document and key size // report document and key size
result = state ->addOperation(_logicalCollection->cid(), revisionId, result = state->addOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_UPDATE, TRI_VOC_DOCUMENT_OPERATION_UPDATE,
newDoc.byteSize(), res.keySize()); newDoc.byteSize(), res.keySize());
// transaction size limit reached -- fail // transaction size limit reached -- fail
if (result.fail()) { if (result.fail()) {
@ -802,7 +805,8 @@ int RocksDBCollection::replace(
isEdgeCollection, TRI_RidToString(revisionId), isEdgeCollection, TRI_RidToString(revisionId),
*builder.get()); *builder.get());
RocksDBTransactionState* state = static_cast<RocksDBTransactionState*>(trx->state()); RocksDBTransactionState* state =
static_cast<RocksDBTransactionState*>(trx->state());
if (state->isDBServer()) { if (state->isDBServer()) {
// Need to check that no sharding keys have changed: // Need to check that no sharding keys have changed:
if (arangodb::shardKeysChanged(_logicalCollection->dbName(), if (arangodb::shardKeysChanged(_logicalCollection->dbName(),
@ -815,7 +819,7 @@ int RocksDBCollection::replace(
RocksDBSavePoint guard(rocksTransaction(trx), RocksDBSavePoint guard(rocksTransaction(trx),
trx->isSingleOperationTransaction()); trx->isSingleOperationTransaction());
// add possible log statement under guard // add possible log statement under guard
state->prepareOperation(_logicalCollection->cid(), revisionId, state->prepareOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_REPLACE); TRI_VOC_DOCUMENT_OPERATION_REPLACE);
@ -834,9 +838,9 @@ int RocksDBCollection::replace(
// report document and key size // report document and key size
result = state->addOperation(_logicalCollection->cid(), revisionId, result = state->addOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_REPLACE, TRI_VOC_DOCUMENT_OPERATION_REPLACE,
VPackSlice(builder->slice()).byteSize(), VPackSlice(builder->slice()).byteSize(),
opResult.keySize()); opResult.keySize());
// transaction size limit reached -- fail // transaction size limit reached -- fail
if (result.fail()) { if (result.fail()) {
@ -905,16 +909,18 @@ int RocksDBCollection::remove(arangodb::transaction::Methods* trx,
trx->isSingleOperationTransaction()); trx->isSingleOperationTransaction());
// add possible log statement under guard // add possible log statement under guard
RocksDBTransactionState* state = static_cast<RocksDBTransactionState*>(trx->state()); RocksDBTransactionState* state =
static_cast<RocksDBTransactionState*>(trx->state());
state->prepareOperation(_logicalCollection->cid(), revisionId, state->prepareOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_REMOVE); TRI_VOC_DOCUMENT_OPERATION_REMOVE);
//RocksDBLogValue val = RocksDBLogValue::DocumentRemove(StringRef(key)); // RocksDBLogValue val = RocksDBLogValue::DocumentRemove(StringRef(key));
//state->rocksTransaction()->PutLogData(val.slice()); // state->rocksTransaction()->PutLogData(val.slice());
res = removeDocument(trx, oldRevisionId, oldDoc, options.waitForSync); res = removeDocument(trx, oldRevisionId, oldDoc, options.waitForSync);
if (res.ok()) { if (res.ok()) {
// report key size // report key size
res = state->addOperation(_logicalCollection->cid(), revisionId, res = state->addOperation(_logicalCollection->cid(), revisionId,
TRI_VOC_DOCUMENT_OPERATION_REMOVE, 0, res.keySize()); TRI_VOC_DOCUMENT_OPERATION_REMOVE, 0,
res.keySize());
// transaction size limit reached -- fail // transaction size limit reached -- fail
if (res.fail()) { if (res.fail()) {
THROW_ARANGO_EXCEPTION(res); THROW_ARANGO_EXCEPTION(res);

View File

@ -97,7 +97,8 @@ RocksDBLogValue::RocksDBLogValue(RocksDBLogType type) : _buffer() {
RocksDBLogValue::RocksDBLogValue(RocksDBLogType type, uint64_t val) : _buffer() { RocksDBLogValue::RocksDBLogValue(RocksDBLogType type, uint64_t val) : _buffer() {
switch (type) { switch (type) {
case RocksDBLogType::DatabaseDrop: case RocksDBLogType::DatabaseDrop:
case RocksDBLogType::CollectionCreate: { case RocksDBLogType::CollectionCreate:
case RocksDBLogType::DocumentOperationsPrologue: {
_buffer.reserve(sizeof(RocksDBLogType) + sizeof(uint64_t)); _buffer.reserve(sizeof(RocksDBLogType) + sizeof(uint64_t));
_buffer += static_cast<char>(type); _buffer += static_cast<char>(type);
uint64ToPersistent(_buffer, val);// database or collection ID uint64ToPersistent(_buffer, val);// database or collection ID

View File

@ -282,6 +282,8 @@ void RocksDBTransactionState::prepareOperation(
TRI_voc_cid_t collectionId, TRI_voc_rid_t revisionId, TRI_voc_cid_t collectionId, TRI_voc_rid_t revisionId,
TRI_voc_document_operation_e operationType) { TRI_voc_document_operation_e operationType) {
switch (operationType) { switch (operationType) {
case TRI_VOC_DOCUMENT_OPERATION_UNKNOWN:
break;
case TRI_VOC_DOCUMENT_OPERATION_INSERT: case TRI_VOC_DOCUMENT_OPERATION_INSERT:
case TRI_VOC_DOCUMENT_OPERATION_UPDATE: case TRI_VOC_DOCUMENT_OPERATION_UPDATE:
case TRI_VOC_DOCUMENT_OPERATION_REPLACE: case TRI_VOC_DOCUMENT_OPERATION_REPLACE:
@ -289,13 +291,10 @@ void RocksDBTransactionState::prepareOperation(
if (collectionId != _lastUsedCollection) { if (collectionId != _lastUsedCollection) {
RocksDBLogValue logValue = RocksDBLogValue logValue =
RocksDBLogValue::DocumentOpsPrologue(collectionId); RocksDBLogValue::DocumentOpsPrologue(collectionId);
_rocksTransaction->PutLogData(logValue.slice()); //_rocksTransaction->PutLogData(logValue.slice());
_lastUsedCollection = collectionId; _lastUsedCollection = collectionId;
} }
} break; } break;
case TRI_VOC_DOCUMENT_OPERATION_UNKNOWN:
THROW_ARANGO_EXCEPTION(TRI_ERROR_BAD_PARAMETER);
break;
} }
} }