1
0
Fork 0

fix segfault and try to avoid oom (#10518)

* create arena before using it

* try to avoid oom situation
This commit is contained in:
Jan Christoph Uhde 2019-11-25 11:49:50 +01:00 committed by KVS85
parent a8ceab9c71
commit b94755c61e
3 changed files with 10 additions and 6 deletions

View File

@ -52,6 +52,7 @@ MMFilesHashIndexLookupBuilder::MMFilesHashIndexLookupBuilder(
: _builder(trx),
_usesIn(false),
_isEmpty(false),
_mappingFieldConditionArena(),
_mappingFieldCondition{_mappingFieldConditionArena},
_inStorage(trx) {
TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND);

View File

@ -181,8 +181,8 @@ class MMFilesHashIndexLookupBuilder {
using MappingCondition =
::arangodb::containers::SmallVector<arangodb::aql::AstNode const*>;
MappingCondition _mappingFieldCondition;
MappingCondition::allocator_type::arena_type _mappingFieldConditionArena;
MappingCondition _mappingFieldCondition;
std::unordered_map<size_t, std::pair<size_t, std::vector<arangodb::velocypack::Slice>>> _inPosition;
transaction::BuilderLeaser _inStorage;
@ -272,10 +272,10 @@ class MMFilesHashIndex final : public MMFilesPathBasedIndex {
Index::FilterCosts supportsFilterCondition(std::vector<std::shared_ptr<arangodb::Index>> const& allIndexes,
arangodb::aql::AstNode const* node,
arangodb::aql::Variable const* reference,
arangodb::aql::Variable const* reference,
size_t itemsInIndex) const override;
std::unique_ptr<IndexIterator> iteratorForCondition(transaction::Methods* trx,
std::unique_ptr<IndexIterator> iteratorForCondition(transaction::Methods* trx,
arangodb::aql::AstNode const* node,
arangodb::aql::Variable const* reference,
IndexIteratorOptions const& opts) override;

View File

@ -21,7 +21,10 @@
/// @author Dr. Frank Celler
////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include "Aql/AstNode.h"
#include "Aql/ExecutionBlock.h"
#include "Basics/Exceptions.h"
#include "Basics/StaticStrings.h"
#include "Basics/hashes.h"
@ -161,7 +164,7 @@ bool MMFilesAllIndexIterator::next(LocalDocumentIdCallback const& cb, size_t lim
bool MMFilesAllIndexIterator::nextDocument(DocumentCallback const& cb, size_t limit) {
_documentIds.clear();
_documentIds.reserve(limit);
_documentIds.reserve((std::min)(limit, aql::ExecutionBlock::DefaultBatchSize()));
bool done = false;
while (limit > 0) {
@ -475,8 +478,8 @@ std::unique_ptr<IndexIterator> MMFilesPrimaryIndex::iteratorForCondition(
if (aap.opType == aql::NODE_TYPE_OPERATOR_BINARY_EQ) {
// a.b == value
return createEqIterator(trx, aap.attribute, aap.value);
}
}
if (aap.opType == aql::NODE_TYPE_OPERATOR_BINARY_IN &&
aap.value->isArray()) {
// a.b IN array