From 91c63338f2f1155972955112b011c8f81f429a9f Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 17 Apr 2013 18:02:55 +0200 Subject: [PATCH] some locking fixes --- arangod/Utils/Transaction.h | 6 ++++++ arangod/V8Server/v8-query.cpp | 7 +++++++ arangod/VocBase/transaction.c | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/arangod/Utils/Transaction.h b/arangod/Utils/Transaction.h index 6b27d84ece..91689736b7 100644 --- a/arangod/Utils/Transaction.h +++ b/arangod/Utils/Transaction.h @@ -414,6 +414,7 @@ namespace triagens { TRI_primary_collection_t* primary = primaryCollection(trxCollection); *barrier = TRI_CreateBarrierElement(&primary->_barrierList); + if (*barrier == 0) { return TRI_ERROR_OUT_OF_MEMORY; } @@ -422,6 +423,7 @@ namespace triagens { int res = this->lock(trxCollection, TRI_TRANSACTION_READ); if (res != TRI_ERROR_NO_ERROR) { + this->unlock(trxCollection, TRI_TRANSACTION_READ); TRI_FreeBarrier(*barrier); *barrier = 0; return res; @@ -484,6 +486,7 @@ namespace triagens { int res = this->lock(trxCollection, TRI_TRANSACTION_READ); if (res != TRI_ERROR_NO_ERROR) { + this->unlock(trxCollection, TRI_TRANSACTION_READ); return res; } @@ -530,6 +533,7 @@ namespace triagens { int res = this->lock(trxCollection, TRI_TRANSACTION_READ); if (res != TRI_ERROR_NO_ERROR) { + this->unlock(trxCollection, TRI_TRANSACTION_READ); return res; } @@ -542,7 +546,9 @@ namespace triagens { } *barrier = TRI_CreateBarrierElement(&primary->_barrierList); + if (*barrier == 0) { + this->unlock(trxCollection, TRI_TRANSACTION_READ); return TRI_ERROR_OUT_OF_MEMORY; } diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index b1473333e0..220c51ad5c 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -1746,10 +1746,17 @@ static v8::Handle JS_AnyQuery (v8::Arguments const& argv) { res = trx.finish(res); if (res != TRI_ERROR_NO_ERROR) { + if (barrier != 0) { + TRI_FreeBarrier(barrier); + } TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot fetch document"); } if (document._data == 0 || document._key == 0) { + if (barrier != 0) { + TRI_FreeBarrier(barrier); + } + return scope.Close(v8::Null()); } diff --git a/arangod/VocBase/transaction.c b/arangod/VocBase/transaction.c index 7aab7ab881..c22569117d 100644 --- a/arangod/VocBase/transaction.c +++ b/arangod/VocBase/transaction.c @@ -1177,6 +1177,11 @@ static int UnlockCollection (TRI_transaction_collection_t* trxCollection, assert(trxCollection->_locked == true); primary = trxCollection->_collection->_collection; + + if (trxCollection->_nestingLevel < nestingLevel) { + // only process our own collections + return TRI_ERROR_NO_ERROR; + } if (type == TRI_TRANSACTION_READ) { LOG_TRX(trxCollection->_transaction,