diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index 93a7786aa1..987fef994c 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -821,29 +821,32 @@ static v8::Handle DocumentVocbaseCol (const bool useCollection, assert(barrier != 0); + bool freeBarrier = true; + v8::Handle result; TRI_doc_mptr_t document; res = trx.read(&document, key, true); if (res == TRI_ERROR_NO_ERROR) { result = TRI_WrapShapedJson(resolver, col, &document, barrier); + freeBarrier = false; } res = trx.finish(res); - if (res != TRI_ERROR_NO_ERROR) { + if (res != TRI_ERROR_NO_ERROR || document._key == 0 || document._data == 0) { + if (freeBarrier) { + TRI_FreeBarrier(barrier); + } + return scope.Close(v8::ThrowException(TRI_CreateErrorObject(res, "document not found", true))); } - if (document._key == 0 || document._data == 0) { - TRI_FreeBarrier(barrier); - - return scope.Close(v8::ThrowException( - TRI_CreateErrorObject(TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND, - "document not found"))); - } - if (rid != 0 && document._rid != rid) { + if (freeBarrier) { + TRI_FreeBarrier(barrier); + } + return scope.Close(v8::ThrowException(TRI_CreateErrorObject(TRI_ERROR_ARANGO_CONFLICT, "revision not found"))); } diff --git a/arangod/VocBase/datafile.c b/arangod/VocBase/datafile.c index 6d4cec7b09..bea8e298aa 100644 --- a/arangod/VocBase/datafile.c +++ b/arangod/VocBase/datafile.c @@ -1018,7 +1018,7 @@ bool TRI_IsValidMarkerDatafile (TRI_df_marker_t* const marker) { return false; } - if (marker->_size >= (TRI_voc_size_t) (256 * 1024 * 1024)) { + if (marker->_size >= (TRI_voc_size_t) TRI_MARKER_MAXIMAL_SIZE) { // a single marker bigger than 256 MB seems unreasonable // note: this is an arbitrary limit return false; diff --git a/arangod/VocBase/datafile.h b/arangod/VocBase/datafile.h index 56e6f78408..17dfa27207 100644 --- a/arangod/VocBase/datafile.h +++ b/arangod/VocBase/datafile.h @@ -114,6 +114,12 @@ extern "C" { #define TRI_DF_BLOCK_ALIGNMENT (8) +//////////////////////////////////////////////////////////////////////////////// +/// @brief maximum size of a single marker (in bytes) +//////////////////////////////////////////////////////////////////////////////// + +#define TRI_MARKER_MAXIMAL_SIZE (256 * 1024 * 1024) + //////////////////////////////////////////////////////////////////////////////// /// @} //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/VocBase/vocbase.h b/arangod/VocBase/vocbase.h index 0747f7605b..01c65931c5 100644 --- a/arangod/VocBase/vocbase.h +++ b/arangod/VocBase/vocbase.h @@ -206,11 +206,20 @@ extern size_t PageSize; #define TRI_JOURNAL_DEFAULT_MAXIMAL_SIZE (1024 * 1024 * 32) //////////////////////////////////////////////////////////////////////////////// -/// @brief minimal collection journal size +/// @brief minimal collection journal size (for testing, we allow very small +/// file sizes in maintainer mode) //////////////////////////////////////////////////////////////////////////////// +#ifdef TRI_ENABLE_MAINTAINER_MODE + +#define TRI_JOURNAL_MINIMAL_SIZE (16 * 1024) + +#else + #define TRI_JOURNAL_MINIMAL_SIZE (1024 * 1024) +#endif + //////////////////////////////////////////////////////////////////////////////// /// @brief journal overhead //////////////////////////////////////////////////////////////////////////////// diff --git a/js/common/tests/shell-collection.js b/js/common/tests/shell-collection.js index 340036cf17..9732d7e834 100644 --- a/js/common/tests/shell-collection.js +++ b/js/common/tests/shell-collection.js @@ -148,7 +148,25 @@ function CollectionSuiteErrorHandling () { catch (err) { assertEqual(ERRORS.ERROR_ARANGO_ILLEGAL_NAME.code, err.errorNum); } - } + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief creating with too small journal size +//////////////////////////////////////////////////////////////////////////////// + + testErrorInvalidJournalSize : function () { + var cn = "example"; + + db._drop(cn); + try { + db._create(cn, { waitForSync : false, journalSize : 1024 }); + fail(); + } + catch (err) { + assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); + } + }, + }; } @@ -375,6 +393,7 @@ function CollectionSuite () { assertEqual(false, p.waitForSync); assertEqual(false, p.isVolatile); + assertEqual(1048576, p.journalSize); db._drop(cn); }, @@ -399,14 +418,7 @@ function CollectionSuite () { assertEqual(true, p.waitForSync); assertEqual(false, p.isVolatile); - - if (p.journalSize < 1024 * 1024) { - fail(); - } - - if (1024 * 1025 < p.journalSize) { - fail(); - } + assertEqual(1048576, p.journalSize); db._drop(cn); }, @@ -430,6 +442,7 @@ function CollectionSuite () { var p = c1.properties(); assertEqual(true, p.isVolatile); + assertEqual(1048576, p.journalSize); db._drop(cn); },