1
0
Fork 0

Fixed database/collection lookup in cluster. It did not get the correct vocbase when using a Database other than _system

This commit is contained in:
Michael Hackstein 2016-08-18 17:39:25 +02:00
parent 793a157b16
commit efce89e3f4
4 changed files with 28 additions and 3 deletions

View File

@ -430,7 +430,12 @@ void ClusterInfo::loadPlan() {
} }
DatabaseCollections databaseCollections; DatabaseCollections databaseCollections;
std::string const databaseName = databasePairSlice.key.copyString(); std::string const databaseName = databasePairSlice.key.copyString();
TRI_vocbase_t* vocbase = databaseFeature->lookupDatabase(databaseName); TRI_vocbase_t* vocbase = nullptr;
if (ServerState::instance()->isCoordinator()) {
vocbase = databaseFeature->lookupDatabaseCoordinator(databaseName);
} else {
vocbase = databaseFeature->lookupDatabase(databaseName);
}
TRI_ASSERT(vocbase != nullptr); TRI_ASSERT(vocbase != nullptr);
if (vocbase == nullptr) { if (vocbase == nullptr) {
// No database with this name found. // No database with this name found.

View File

@ -676,7 +676,9 @@ static void JS_GetCollectionInfoClusterInfo(
std::shared_ptr<LogicalCollection> ci = ClusterInfo::instance()->getCollection( std::shared_ptr<LogicalCollection> ci = ClusterInfo::instance()->getCollection(
TRI_ObjectToString(args[0]), TRI_ObjectToString(args[1])); TRI_ObjectToString(args[0]), TRI_ObjectToString(args[1]));
TRI_ASSERT(ci != nullptr); if (ci == nullptr) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND);
}
v8::Handle<v8::Object> result = v8::Object::New(isolate); v8::Handle<v8::Object> result = v8::Object::New(isolate);
std::string const cid = ci->cid_as_string(); std::string const cid = ci->cid_as_string();

View File

@ -468,7 +468,6 @@ int DatabaseFeature::createDatabaseCoordinator(TRI_voc_tick_t id, std::string co
result = vocbase.get(); result = vocbase.get();
vocbase.release(); vocbase.release();
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }
@ -884,6 +883,24 @@ TRI_vocbase_t* DatabaseFeature::useDatabase(TRI_voc_tick_t id) {
return nullptr; return nullptr;
} }
/// @brief lookup a database by its name, not increasing its reference count
TRI_vocbase_t* DatabaseFeature::lookupDatabaseCoordinator(
std::string const& name) {
auto unuser(_databasesProtector.use());
auto theLists = _databasesLists.load();
auto it = theLists->_coordinatorDatabases.find(name);
if (it != theLists->_coordinatorDatabases.end()) {
TRI_vocbase_t* vocbase = it->second;
return vocbase;
}
return nullptr;
}
/// @brief lookup a database by its name, not increasing its reference count /// @brief lookup a database by its name, not increasing its reference count
TRI_vocbase_t* DatabaseFeature::lookupDatabase(std::string const& name) { TRI_vocbase_t* DatabaseFeature::lookupDatabase(std::string const& name) {
auto unuser(_databasesProtector.use()); auto unuser(_databasesProtector.use());

View File

@ -95,6 +95,7 @@ class DatabaseFeature final : public application_features::ApplicationFeature {
TRI_vocbase_t* useDatabase(std::string const& name); TRI_vocbase_t* useDatabase(std::string const& name);
TRI_vocbase_t* useDatabase(TRI_voc_tick_t id); TRI_vocbase_t* useDatabase(TRI_voc_tick_t id);
TRI_vocbase_t* lookupDatabaseCoordinator(std::string const& name);
TRI_vocbase_t* lookupDatabase(std::string const& name); TRI_vocbase_t* lookupDatabase(std::string const& name);
void useSystemDatabase(); void useSystemDatabase();