1
0
Fork 0

backport: address issue with inverted check for isCoordinator

This commit is contained in:
Vasiliy 2018-04-11 09:25:11 +03:00
parent b8245f9be7
commit aece5f4e4d
1 changed files with 133 additions and 272 deletions

View File

@ -355,313 +355,174 @@ RocksDBIndexFactory::RocksDBIndexFactory() {
return std::make_shared<RocksDBSkiplistIndex>(id, collection, definition); return std::make_shared<RocksDBSkiplistIndex>(id, collection, definition);
}); });
if (ServerState::instance()->isCoordinator()) {
emplaceNormalizer("edge", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
TRI_ASSERT(normalized.isOpenObject()); emplaceNormalizer("edge", [](
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_EDGE_INDEX))); velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
if (isCreation && !definition.hasKey("objectId")) { TRI_ASSERT(normalized.isOpenObject());
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_EDGE_INDEX)));
}
return TRI_ERROR_INTERNAL; if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} else { }
emplaceNormalizer("edge", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
TRI_ASSERT(normalized.isOpenObject()); return TRI_ERROR_INTERNAL;
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_EDGE_INDEX))); });
return TRI_ERROR_INTERNAL; emplaceNormalizer("fulltext", [](
}); velocypack::Builder& normalized,
} velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_FULLTEXT_INDEX)));
if (ServerState::instance()->isCoordinator()) { if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
emplaceNormalizer("fulltext", []( normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
velocypack::Builder& normalized, }
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_FULLTEXT_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { return EnhanceJsonIndexFulltext(definition, normalized, isCreation);
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); });
}
return EnhanceJsonIndexFulltext(definition, normalized, isCreation); emplaceNormalizer("geo", [](
}); velocypack::Builder& normalized,
} else { velocypack::Slice definition,
emplaceNormalizer("fulltext", []( bool isCreation
velocypack::Builder& normalized, )->arangodb::Result {
velocypack::Slice definition, auto current = definition.get("fields");
bool isCreation TRI_ASSERT(normalized.isOpenObject());
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_FULLTEXT_INDEX)));
return EnhanceJsonIndexFulltext(definition, normalized, isCreation); if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
if (ServerState::instance()->isCoordinator()) { if (current.isArray() && current.length() == 2) {
emplaceNormalizer("geo", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
auto current = definition.get("fields");
TRI_ASSERT(normalized.isOpenObject());
if (isCreation && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
}
if (current.isArray() && current.length() == 2) {
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX)));
return EnhanceJsonIndexGeo2(definition, normalized, isCreation);
}
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
});
emplaceNormalizer("geo1", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
if (isCreation && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
}
return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
});
emplaceNormalizer("geo2", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX)));
if (isCreation && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
}
return EnhanceJsonIndexGeo2(definition, normalized, isCreation);
});
} else {
emplaceNormalizer("geo", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
auto current = definition.get("fields");
TRI_ASSERT(normalized.isOpenObject());
if (current.isArray() && current.length() == 2) {
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX)));
return EnhanceJsonIndexGeo2(definition, normalized, isCreation);
}
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
});
emplaceNormalizer("geo1", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
});
emplaceNormalizer("geo2", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX))); normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX)));
return EnhanceJsonIndexGeo2(definition, normalized, isCreation); return EnhanceJsonIndexGeo2(definition, normalized, isCreation);
}); }
}
if (ServerState::instance()->isCoordinator()) { normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
emplaceNormalizer("hash", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_HASH_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); });
}
return EnhanceJsonIndexHash(definition, normalized, isCreation); emplaceNormalizer("geo1", [](
}); velocypack::Builder& normalized,
} else { velocypack::Slice definition,
emplaceNormalizer("hash", []( bool isCreation
velocypack::Builder& normalized, )->arangodb::Result {
velocypack::Slice definition, TRI_ASSERT(normalized.isOpenObject());
bool isCreation normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO1_INDEX)));
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_HASH_INDEX)));
return EnhanceJsonIndexHash(definition, normalized, isCreation); if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
if (ServerState::instance()->isCoordinator()) { return EnhanceJsonIndexGeo1(definition, normalized, isCreation);
emplaceNormalizer("primary", []( });
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
TRI_ASSERT(normalized.isOpenObject()); emplaceNormalizer("geo2", [](
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PRIMARY_INDEX))); velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_GEO2_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
return TRI_ERROR_INTERNAL; return EnhanceJsonIndexGeo2(definition, normalized, isCreation);
}); });
} else {
emplaceNormalizer("primary", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
TRI_ASSERT(normalized.isOpenObject()); emplaceNormalizer("hash", [](
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PRIMARY_INDEX))); velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_HASH_INDEX)));
return TRI_ERROR_INTERNAL; if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
if (ServerState::instance()->isCoordinator()) { return EnhanceJsonIndexHash(definition, normalized, isCreation);
emplaceNormalizer("persistent", []( });
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { emplaceNormalizer("primary", [](
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); velocypack::Builder& normalized,
} velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
if (isCreation) {
// creating these indexes yourself is forbidden
return TRI_ERROR_FORBIDDEN;
}
return EnhanceJsonIndexPersistent(definition, normalized, isCreation); TRI_ASSERT(normalized.isOpenObject());
}); normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PRIMARY_INDEX)));
} else {
emplaceNormalizer("persistent", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
return EnhanceJsonIndexPersistent(definition, normalized, isCreation); if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
if (ServerState::instance()->isCoordinator()) { return TRI_ERROR_INTERNAL;
emplaceNormalizer("rocksdb", []( });
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { emplaceNormalizer("persistent", [](
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); velocypack::Builder& normalized,
} velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
return EnhanceJsonIndexPersistent(definition, normalized, isCreation); if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
}); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} else { }
emplaceNormalizer("rocksdb", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
return EnhanceJsonIndexPersistent(definition, normalized, isCreation); return EnhanceJsonIndexPersistent(definition, normalized, isCreation);
}); });
}
if (ServerState::instance()->isCoordinator()) { emplaceNormalizer("rocksdb", [](
emplaceNormalizer("skiplist", []( velocypack::Builder& normalized,
velocypack::Builder& normalized, velocypack::Slice definition,
velocypack::Slice definition, bool isCreation
bool isCreation )->arangodb::Result {
)->arangodb::Result { TRI_ASSERT(normalized.isOpenObject());
TRI_ASSERT(normalized.isOpenObject()); normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_PERSISTENT_INDEX)));
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_SKIPLIST_INDEX)));
if (isCreation && !definition.hasKey("objectId")) { if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer()))); normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
} }
return EnhanceJsonIndexSkiplist(definition, normalized, isCreation); return EnhanceJsonIndexPersistent(definition, normalized, isCreation);
}); });
} else {
emplaceNormalizer("skiplist", [](
velocypack::Builder& normalized,
velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_SKIPLIST_INDEX)));
return EnhanceJsonIndexSkiplist(definition, normalized, isCreation); emplaceNormalizer("skiplist", [](
}); velocypack::Builder& normalized,
} velocypack::Slice definition,
bool isCreation
)->arangodb::Result {
TRI_ASSERT(normalized.isOpenObject());
normalized.add("type", VPackValue(Index::oldtypeName(Index::TRI_IDX_TYPE_SKIPLIST_INDEX)));
if (isCreation && !ServerState::instance()->isCoordinator() && !definition.hasKey("objectId")) {
normalized.add("objectId", velocypack::Value(std::to_string(TRI_NewTickServer())));
}
return EnhanceJsonIndexSkiplist(definition, normalized, isCreation);
});
} }
void RocksDBIndexFactory::fillSystemIndexes( void RocksDBIndexFactory::fillSystemIndexes(