From bd9e8b0478cc516fd5227c2968e84fe954f080ae Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 28 May 2014 15:19:57 +0200 Subject: [PATCH] fixed too eager iteration over skiplists --- arangod/V8Server/v8-query.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index 1562d588e1..565c3b4f91 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -1128,7 +1128,8 @@ static v8::Handle ExecuteSkiplistQuery (v8::Arguments const& argv, bool error = false; bool usedBarrier = false; - while (true) { + + while (limit > 0) { TRI_skiplist_index_element_t* indexElement = skiplistIterator->_next(skiplistIterator); if (indexElement == NULL) { @@ -1151,6 +1152,7 @@ static v8::Handle ExecuteSkiplistQuery (v8::Arguments const& argv, (TRI_doc_mptr_t const*) indexElement->_document, barrier, usedBarrier); + if (doc.IsEmpty()) { error = true; @@ -1158,7 +1160,10 @@ static v8::Handle ExecuteSkiplistQuery (v8::Arguments const& argv, } else { documents->Set(count, doc); - ++count; + + if (++count >= limit) { + break; + } } } @@ -1344,7 +1349,7 @@ static v8::Handle ExecuteBitarrayQuery (v8::Arguments const& argv, bool usedBarrier = false; if (indexIterator != NULL) { - while (true) { + while (limit > 0) { TRI_doc_mptr_t* data = (TRI_doc_mptr_t*) indexIterator->_next(indexIterator); if (data == NULL) { @@ -1371,7 +1376,9 @@ static v8::Handle ExecuteBitarrayQuery (v8::Arguments const& argv, } else { documents->Set(count, doc); - ++count; + if (++count >= limit) { + break; + } } } }