1
0
Fork 0

fixed segfault

This commit is contained in:
Jan Steemann 2013-04-22 13:11:52 +02:00
parent 66d790728a
commit a241c6959e
2 changed files with 23 additions and 17 deletions

View File

@ -423,7 +423,6 @@ namespace triagens {
int res = this->lock(trxCollection, TRI_TRANSACTION_READ); int res = this->lock(trxCollection, TRI_TRANSACTION_READ);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
this->unlock(trxCollection, TRI_TRANSACTION_READ);
TRI_FreeBarrier(*barrier); TRI_FreeBarrier(*barrier);
*barrier = 0; *barrier = 0;
return res; return res;
@ -486,7 +485,6 @@ namespace triagens {
int res = this->lock(trxCollection, TRI_TRANSACTION_READ); int res = this->lock(trxCollection, TRI_TRANSACTION_READ);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
this->unlock(trxCollection, TRI_TRANSACTION_READ);
return res; return res;
} }
@ -533,7 +531,6 @@ namespace triagens {
int res = this->lock(trxCollection, TRI_TRANSACTION_READ); int res = this->lock(trxCollection, TRI_TRANSACTION_READ);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
this->unlock(trxCollection, TRI_TRANSACTION_READ);
return res; return res;
} }
@ -770,6 +767,7 @@ namespace triagens {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief truncate a collection /// @brief truncate a collection
/// the caller must make sure a barrier is held
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int removeAll (TRI_transaction_collection_t* const trxCollection, int removeAll (TRI_transaction_collection_t* const trxCollection,
@ -777,25 +775,25 @@ namespace triagens {
vector<string> ids; vector<string> ids;
int res = readAll(trxCollection, ids); TRI_primary_collection_t* primary = primaryCollection(trxCollection);
// WRITE-LOCK START
int res = this->lock(trxCollection, TRI_TRANSACTION_WRITE);
if (res != TRI_ERROR_NO_ERROR) {
return res;
}
res = readAll(trxCollection, ids);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
this->unlock(trxCollection, TRI_TRANSACTION_WRITE);
return res; return res;
} }
TRI_doc_update_policy_t updatePolicy; TRI_doc_update_policy_t updatePolicy;
TRI_InitUpdatePolicy(&updatePolicy, TRI_DOC_UPDATE_LAST_WRITE, 0, NULL); TRI_InitUpdatePolicy(&updatePolicy, TRI_DOC_UPDATE_LAST_WRITE, 0, NULL);
const size_t n = ids.size();
size_t n = ids.size();
TRI_primary_collection_t* primary = primaryCollection(trxCollection);
// WRITE-LOCK START
res = this->lock(trxCollection, TRI_TRANSACTION_WRITE);
if (res != TRI_ERROR_NO_ERROR) {
return res;
}
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
const string& id = ids[i]; const string& id = ids[i];

View File

@ -5455,18 +5455,26 @@ static v8::Handle<v8::Value> JS_TruncateVocbaseCol (v8::Arguments const& argv) {
if (col == 0) { if (col == 0) {
TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection"); TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection");
} }
CollectionNameResolver resolver(col->_vocbase); CollectionNameResolver resolver(col->_vocbase);
SingleCollectionWriteTransaction<EmbeddableTransaction<V8TransactionContext>, UINT64_MAX> trx(col->_vocbase, resolver, col->_cid); SingleCollectionWriteTransaction<EmbeddableTransaction<V8TransactionContext>, UINT64_MAX> trx(col->_vocbase, resolver, col->_cid);
int res = trx.begin(); int res = trx.begin();
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot truncate collection"); TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot truncate collection");
} }
TRI_barrier_t* barrier = TRI_CreateBarrierElement(&(trx.primaryCollection()->_barrierList));
if (barrier == 0) {
TRI_V8_EXCEPTION_MEMORY(scope);
}
res = trx.truncate(forceSync); res = trx.truncate(forceSync);
res = trx.finish(res); res = trx.finish(res);
TRI_FreeBarrier(barrier);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot truncate collection"); TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot truncate collection");
} }