mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'spdvpk' of github.com:arangodb/arangodb into spdvpk
This commit is contained in:
commit
45a75bf4c6
|
@ -309,7 +309,7 @@ bool RestDocumentHandler::readSingleDocument(bool generateBody) {
|
||||||
} else {
|
} else {
|
||||||
// copy default options
|
// copy default options
|
||||||
VPackOptions options = VPackOptions::Defaults;
|
VPackOptions options = VPackOptions::Defaults;
|
||||||
options.customTypeHandler = result.customTypeHandler;
|
options.customTypeHandler = result.customTypeHandler.get();
|
||||||
generateDocument(result.slice(), generateBody, &options);
|
generateDocument(result.slice(), generateBody, &options);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -57,7 +57,7 @@ struct OperationCursor : public OperationResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
OperationCursor(std::shared_ptr<VPackBuffer<uint8_t>> buffer,
|
OperationCursor(std::shared_ptr<VPackBuffer<uint8_t>> buffer,
|
||||||
VPackCustomTypeHandler* handler,
|
std::shared_ptr<VPackCustomTypeHandler> handler,
|
||||||
std::string const& message,
|
std::string const& message,
|
||||||
int code,
|
int code,
|
||||||
bool wasSynchronous)
|
bool wasSynchronous)
|
||||||
|
@ -67,7 +67,7 @@ struct OperationCursor : public OperationResult {
|
||||||
_batchSize(1000) {
|
_batchSize(1000) {
|
||||||
}
|
}
|
||||||
|
|
||||||
OperationCursor(VPackCustomTypeHandler* handler, IndexIterator* iterator,
|
OperationCursor(std::shared_ptr<VPackCustomTypeHandler> handler, IndexIterator* iterator,
|
||||||
uint64_t limit, uint64_t batchSize)
|
uint64_t limit, uint64_t batchSize)
|
||||||
: OperationResult(std::make_shared<VPackBuffer<uint8_t>>(), handler, "",
|
: OperationResult(std::make_shared<VPackBuffer<uint8_t>>(), handler, "",
|
||||||
TRI_ERROR_NO_ERROR, false),
|
TRI_ERROR_NO_ERROR, false),
|
||||||
|
|
|
@ -36,20 +36,20 @@ namespace arangodb {
|
||||||
struct OperationResult {
|
struct OperationResult {
|
||||||
|
|
||||||
explicit OperationResult(int code)
|
explicit OperationResult(int code)
|
||||||
: customTypeHandler(nullptr), code(code), wasSynchronous(false) {
|
: customTypeHandler(), code(code), wasSynchronous(false) {
|
||||||
if (code != TRI_ERROR_NO_ERROR) {
|
if (code != TRI_ERROR_NO_ERROR) {
|
||||||
errorMessage = TRI_errno_string(code);
|
errorMessage = TRI_errno_string(code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OperationResult(int code, std::string const& message)
|
OperationResult(int code, std::string const& message)
|
||||||
: customTypeHandler(nullptr), errorMessage(message), code(code),
|
: customTypeHandler(), errorMessage(message), code(code),
|
||||||
wasSynchronous(false) {
|
wasSynchronous(false) {
|
||||||
TRI_ASSERT(code != TRI_ERROR_NO_ERROR);
|
TRI_ASSERT(code != TRI_ERROR_NO_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
OperationResult(std::shared_ptr<VPackBuffer<uint8_t>> buffer,
|
OperationResult(std::shared_ptr<VPackBuffer<uint8_t>> buffer,
|
||||||
VPackCustomTypeHandler* handler,
|
std::shared_ptr<VPackCustomTypeHandler> handler,
|
||||||
std::string const& message,
|
std::string const& message,
|
||||||
int code,
|
int code,
|
||||||
bool wasSynchronous)
|
bool wasSynchronous)
|
||||||
|
@ -58,7 +58,6 @@ struct OperationResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~OperationResult() {
|
virtual ~OperationResult() {
|
||||||
// TODO: handle destruction of customTypeHandler
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool successful() const {
|
bool successful() const {
|
||||||
|
@ -75,7 +74,7 @@ struct OperationResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<VPackBuffer<uint8_t>> buffer;
|
std::shared_ptr<VPackBuffer<uint8_t>> buffer;
|
||||||
VPackCustomTypeHandler* customTypeHandler;
|
std::shared_ptr<VPackCustomTypeHandler> customTypeHandler;
|
||||||
std::string errorMessage;
|
std::string errorMessage;
|
||||||
int code;
|
int code;
|
||||||
bool wasSynchronous;
|
bool wasSynchronous;
|
||||||
|
|
|
@ -77,7 +77,7 @@ int StandaloneTransactionContext::registerTransaction(TRI_transaction_t* trx) {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void StandaloneTransactionContext::unregisterTransaction() {
|
void StandaloneTransactionContext::unregisterTransaction() {
|
||||||
// nothing to do. cleanup will be done by the parent's destructor
|
// nothing special to do. cleanup will be done by the parent's destructor
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -69,7 +69,7 @@ class StandaloneTransactionContext final : public TransactionContext {
|
||||||
int registerTransaction(struct TRI_transaction_s*) override;
|
int registerTransaction(struct TRI_transaction_s*) override;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief unregister the transaction, does nothing
|
/// @brief unregister the transaction
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void unregisterTransaction() override;
|
void unregisterTransaction() override;
|
||||||
|
|
|
@ -1097,10 +1097,14 @@ class Transaction {
|
||||||
TRI_ASSERT(!isEmbeddedTransaction());
|
TRI_ASSERT(!isEmbeddedTransaction());
|
||||||
|
|
||||||
if (_trx != nullptr) {
|
if (_trx != nullptr) {
|
||||||
this->_transactionContext->unregisterTransaction();
|
auto id = _trx->_id;
|
||||||
|
bool hasFailedOperations = TRI_FreeTransaction(_trx);
|
||||||
TRI_FreeTransaction(_trx);
|
|
||||||
_trx = nullptr;
|
_trx = nullptr;
|
||||||
|
|
||||||
|
// store result
|
||||||
|
this->_transactionContext->storeTransactionResult(id, hasFailedOperations);
|
||||||
|
|
||||||
|
this->_transactionContext->unregisterTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "Storage/Marker.h"
|
#include "Storage/Marker.h"
|
||||||
#include "VocBase/Ditch.h"
|
#include "VocBase/Ditch.h"
|
||||||
#include "VocBase/document-collection.h"
|
#include "VocBase/document-collection.h"
|
||||||
|
#include "Wal/LogfileManager.h"
|
||||||
|
|
||||||
#include <velocypack/Dumper.h>
|
#include <velocypack/Dumper.h>
|
||||||
#include <velocypack/Options.h>
|
#include <velocypack/Options.h>
|
||||||
|
@ -107,7 +108,8 @@ struct CustomTypeHandler : public VPackCustomTypeHandler {
|
||||||
TransactionContext::TransactionContext(TRI_vocbase_t* vocbase)
|
TransactionContext::TransactionContext(TRI_vocbase_t* vocbase)
|
||||||
: _vocbase(vocbase),
|
: _vocbase(vocbase),
|
||||||
_resolver(nullptr),
|
_resolver(nullptr),
|
||||||
_customTypeHandler(nullptr),
|
_customTypeHandler(),
|
||||||
|
_transaction{ 0, false },
|
||||||
_ownsResolver(false) {}
|
_ownsResolver(false) {}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -115,6 +117,11 @@ TransactionContext::TransactionContext(TRI_vocbase_t* vocbase)
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TransactionContext::~TransactionContext() {
|
TransactionContext::~TransactionContext() {
|
||||||
|
// unregister the transaction from the logfile manager
|
||||||
|
if (_transaction.id > 0) {
|
||||||
|
arangodb::wal::LogfileManager::instance()->unregisterTransaction(_transaction.id, _transaction.hasFailedOperations);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& it : _ditches) {
|
for (auto& it : _ditches) {
|
||||||
// we're done with this ditch
|
// we're done with this ditch
|
||||||
auto& ditch = it.second;
|
auto& ditch = it.second;
|
||||||
|
@ -122,8 +129,6 @@ TransactionContext::~TransactionContext() {
|
||||||
// If some external entity is still using the ditch, it is kept!
|
// If some external entity is still using the ditch, it is kept!
|
||||||
}
|
}
|
||||||
|
|
||||||
delete _customTypeHandler;
|
|
||||||
|
|
||||||
if (_ownsResolver) {
|
if (_ownsResolver) {
|
||||||
delete _resolver;
|
delete _resolver;
|
||||||
_resolver = nullptr;
|
_resolver = nullptr;
|
||||||
|
@ -134,9 +139,9 @@ TransactionContext::~TransactionContext() {
|
||||||
/// @brief order a document ditch for the collection
|
/// @brief order a document ditch for the collection
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
VPackCustomTypeHandler* TransactionContext::orderCustomTypeHandler() {
|
std::shared_ptr<VPackCustomTypeHandler> TransactionContext::orderCustomTypeHandler() {
|
||||||
if (_customTypeHandler == nullptr) {
|
if (_customTypeHandler == nullptr) {
|
||||||
_customTypeHandler = new CustomTypeHandler(_vocbase, getResolver());
|
_customTypeHandler.reset(new CustomTypeHandler(_vocbase, getResolver()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_ASSERT(_customTypeHandler != nullptr);
|
TRI_ASSERT(_customTypeHandler != nullptr);
|
||||||
|
@ -200,3 +205,15 @@ void TransactionContext::createResolver() {
|
||||||
_ownsResolver = true;
|
_ownsResolver = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief unregister the transaction
|
||||||
|
/// this will save the transaction's id and status locally
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void TransactionContext::storeTransactionResult(TRI_voc_tid_t id, bool hasFailedOperations) {
|
||||||
|
TRI_ASSERT(_transaction.id == 0);
|
||||||
|
|
||||||
|
_transaction.id = id;
|
||||||
|
_transaction.hasFailedOperations = hasFailedOperations;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ class TransactionContext {
|
||||||
/// @brief orders a custom type handler
|
/// @brief orders a custom type handler
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
velocypack::CustomTypeHandler* orderCustomTypeHandler();
|
std::shared_ptr<velocypack::CustomTypeHandler> orderCustomTypeHandler();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief order a document ditch for the collection
|
/// @brief order a document ditch for the collection
|
||||||
|
@ -90,6 +90,13 @@ class TransactionContext {
|
||||||
|
|
||||||
DocumentDitch* ditch(TRI_voc_cid_t) const;
|
DocumentDitch* ditch(TRI_voc_cid_t) const;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief unregister the transaction
|
||||||
|
/// this will save the transaction's id and status locally
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void storeTransactionResult(TRI_voc_tid_t, bool);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief return the resolver
|
/// @brief return the resolver
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -113,15 +120,15 @@ class TransactionContext {
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
virtual int registerTransaction(struct TRI_transaction_s*) = 0;
|
virtual int registerTransaction(struct TRI_transaction_s*) = 0;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief unregister the transaction from the context
|
/// @brief unregister the transaction
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
virtual void unregisterTransaction() = 0;
|
virtual void unregisterTransaction() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief create a resolver
|
/// @brief create a resolver
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -134,10 +141,15 @@ class TransactionContext {
|
||||||
|
|
||||||
CollectionNameResolver const* _resolver;
|
CollectionNameResolver const* _resolver;
|
||||||
|
|
||||||
velocypack::CustomTypeHandler* _customTypeHandler;
|
std::shared_ptr<velocypack::CustomTypeHandler> _customTypeHandler;
|
||||||
|
|
||||||
std::unordered_map<TRI_voc_cid_t, DocumentDitch*> _ditches;
|
std::unordered_map<TRI_voc_cid_t, DocumentDitch*> _ditches;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
TRI_voc_tid_t id;
|
||||||
|
bool hasFailedOperations;
|
||||||
|
} _transaction;
|
||||||
|
|
||||||
bool _ownsResolver;
|
bool _ownsResolver;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,7 +588,7 @@ static void DocumentVocbaseVPack(
|
||||||
}
|
}
|
||||||
|
|
||||||
VPackOptions resultOptions = VPackOptions::Defaults;
|
VPackOptions resultOptions = VPackOptions::Defaults;
|
||||||
resultOptions.customTypeHandler = opResult.customTypeHandler;
|
resultOptions.customTypeHandler = opResult.customTypeHandler.get();
|
||||||
|
|
||||||
v8::Handle<v8::Value> result = TRI_VPackToV8(isolate, opResult.slice(), &resultOptions);
|
v8::Handle<v8::Value> result = TRI_VPackToV8(isolate, opResult.slice(), &resultOptions);
|
||||||
|
|
||||||
|
|
|
@ -892,13 +892,14 @@ static void JS_AllQuery(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
||||||
VPackSlice count = countResult.slice();
|
VPackSlice count = countResult.slice();
|
||||||
TRI_ASSERT(count.isNumber());
|
TRI_ASSERT(count.isNumber());
|
||||||
|
|
||||||
VPackOptions resultOptions = VPackOptions::Defaults;
|
|
||||||
resultOptions.customTypeHandler = opCursor.customTypeHandler;
|
|
||||||
|
|
||||||
if (!opCursor.hasMore()) {
|
if (!opCursor.hasMore()) {
|
||||||
// OUT OF MEMORY. initial hasMore should return true even if index is empty
|
// OUT OF MEMORY. initial hasMore should return true even if index is empty
|
||||||
TRI_V8_THROW_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
|
TRI_V8_THROW_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copy default options
|
||||||
|
VPackOptions resultOptions = VPackOptions::Defaults;
|
||||||
|
resultOptions.customTypeHandler = opCursor.customTypeHandler.get();
|
||||||
|
|
||||||
opCursor.getMore();
|
opCursor.getMore();
|
||||||
// We only need this one call, limit == batchsize
|
// We only need this one call, limit == batchsize
|
||||||
|
@ -971,8 +972,9 @@ static void JS_AnyQuery(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
||||||
TRI_V8_RETURN_NULL();
|
TRI_V8_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copy default options
|
||||||
VPackOptions resultOptions = VPackOptions::Defaults;
|
VPackOptions resultOptions = VPackOptions::Defaults;
|
||||||
resultOptions.customTypeHandler = cursor.customTypeHandler;
|
resultOptions.customTypeHandler = cursor.customTypeHandler.get();
|
||||||
TRI_V8_RETURN(TRI_VPackToV8(isolate, doc.at(0), &resultOptions));
|
TRI_V8_RETURN(TRI_VPackToV8(isolate, doc.at(0), &resultOptions));
|
||||||
TRI_V8_TRY_CATCH_END
|
TRI_V8_TRY_CATCH_END
|
||||||
}
|
}
|
||||||
|
|
|
@ -769,7 +769,7 @@ TRI_transaction_t* TRI_CreateTransaction(TRI_vocbase_t* vocbase,
|
||||||
/// @brief free a transaction container
|
/// @brief free a transaction container
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void TRI_FreeTransaction(TRI_transaction_t* trx) {
|
bool TRI_FreeTransaction(TRI_transaction_t* trx) {
|
||||||
TRI_ASSERT(trx != nullptr);
|
TRI_ASSERT(trx != nullptr);
|
||||||
|
|
||||||
if (trx->_status == TRI_TRANSACTION_RUNNING) {
|
if (trx->_status == TRI_TRANSACTION_RUNNING) {
|
||||||
|
@ -779,8 +779,6 @@ void TRI_FreeTransaction(TRI_transaction_t* trx) {
|
||||||
// release the marker protector
|
// release the marker protector
|
||||||
bool const hasFailedOperations =
|
bool const hasFailedOperations =
|
||||||
(trx->_hasOperations && trx->_status == TRI_TRANSACTION_ABORTED);
|
(trx->_hasOperations && trx->_status == TRI_TRANSACTION_ABORTED);
|
||||||
arangodb::wal::LogfileManager::instance()->unregisterTransaction(
|
|
||||||
trx->_id, hasFailedOperations);
|
|
||||||
|
|
||||||
ReleaseCollections(trx, 0);
|
ReleaseCollections(trx, 0);
|
||||||
|
|
||||||
|
@ -795,6 +793,8 @@ void TRI_FreeTransaction(TRI_transaction_t* trx) {
|
||||||
|
|
||||||
TRI_DestroyVectorPointer(&trx->_collections);
|
TRI_DestroyVectorPointer(&trx->_collections);
|
||||||
TRI_Free(TRI_UNKNOWN_MEM_ZONE, trx);
|
TRI_Free(TRI_UNKNOWN_MEM_ZONE, trx);
|
||||||
|
|
||||||
|
return hasFailedOperations;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -150,7 +150,7 @@ TRI_transaction_t* TRI_CreateTransaction(TRI_vocbase_t*, TRI_voc_tid_t, double,
|
||||||
/// @brief free a transaction
|
/// @brief free a transaction
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void TRI_FreeTransaction(TRI_transaction_t*);
|
bool TRI_FreeTransaction(TRI_transaction_t*);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief return the type of the transaction as a string
|
/// @brief return the type of the transaction as a string
|
||||||
|
|
Loading…
Reference in New Issue