From 8a22ea7ae7dc929ef00c437e29ccfd7e4d205fbf Mon Sep 17 00:00:00 2001 From: Ken Zangelin Date: Thu, 8 Feb 2024 15:48:27 +0100 Subject: [PATCH] One more fix for #1499 - protected mongocConnectionGet with a semaphore --- src/lib/orionld/common/orionldState.cpp | 1 + src/lib/orionld/common/orionldState.h | 1 + .../orionld/mongoc/mongocAttributeDelete.cpp | 5 +-- .../orionld/mongoc/mongocAttributeReplace.cpp | 5 +-- .../orionld/mongoc/mongocAttributesAdd.cpp | 5 +-- .../orionld/mongoc/mongocConnectionGet.cpp | 32 ++++++++++++++++++- src/lib/orionld/mongoc/mongocConnectionGet.h | 18 ++++++++++- .../mongoc/mongocContextCacheDelete.cpp | 6 ++-- .../orionld/mongoc/mongocContextCacheGet.cpp | 5 +-- .../mongoc/mongocContextCachePersist.cpp | 5 +-- .../orionld/mongoc/mongocEntitiesDelete.cpp | 5 +-- .../orionld/mongoc/mongocEntitiesExist.cpp | 5 +-- src/lib/orionld/mongoc/mongocEntitiesGet.cpp | 5 +-- .../orionld/mongoc/mongocEntitiesQuery.cpp | 5 +-- .../orionld/mongoc/mongocEntitiesQuery2.cpp | 5 +-- .../orionld/mongoc/mongocEntitiesUpsert.cpp | 6 +--- src/lib/orionld/mongoc/mongocEntityDelete.cpp | 5 +-- src/lib/orionld/mongoc/mongocEntityGet.cpp | 5 +-- src/lib/orionld/mongoc/mongocEntityInsert.cpp | 5 +-- src/lib/orionld/mongoc/mongocEntityLookup.cpp | 5 +-- .../orionld/mongoc/mongocEntityReplace.cpp | 5 +-- .../orionld/mongoc/mongocEntityRetrieve.cpp | 5 +-- .../orionld/mongoc/mongocEntityTypeGet.cpp | 5 +-- .../mongocEntityTypesFromRegistrationsGet.cpp | 5 +-- src/lib/orionld/mongoc/mongocEntityUpdate.cpp | 5 +-- .../orionld/mongoc/mongocGeoIndexCreate.cpp | 2 +- src/lib/orionld/mongoc/mongocGeoIndexInit.cpp | 2 +- .../orionld/mongoc/mongocIdIndexCreate.cpp | 2 +- src/lib/orionld/mongoc/mongocInit.cpp | 5 +++ .../mongoc/mongocRegistrationDelete.cpp | 7 ++-- .../mongoc/mongocRegistrationExists.cpp | 5 +-- .../orionld/mongoc/mongocRegistrationGet.cpp | 5 +-- .../mongoc/mongocRegistrationInsert.cpp | 5 +-- .../mongoc/mongocRegistrationLookup.cpp | 5 +-- .../mongoc/mongocRegistrationReplace.cpp | 5 +-- .../orionld/mongoc/mongocRegistrationsGet.cpp | 6 +--- .../mongoc/mongocRegistrationsIter.cpp | 2 +- .../orionld/mongoc/mongocServerVersionGet.cpp | 2 +- .../mongoc/mongocSubscriptionDelete.cpp | 5 +-- .../mongoc/mongocSubscriptionExists.cpp | 5 +-- .../mongoc/mongocSubscriptionInsert.cpp | 5 +-- .../mongoc/mongocSubscriptionLookup.cpp | 5 +-- .../mongoc/mongocSubscriptionReplace.cpp | 5 +-- .../orionld/mongoc/mongocSubscriptionsGet.cpp | 5 +-- src/lib/orionld/mongoc/mongocTenantExists.cpp | 4 +-- src/lib/orionld/mongoc/mongocTenantsGet.cpp | 2 +- 46 files changed, 99 insertions(+), 149 deletions(-) diff --git a/src/lib/orionld/common/orionldState.cpp b/src/lib/orionld/common/orionldState.cpp index 68d12ed049..1aa16c5006 100644 --- a/src/lib/orionld/common/orionldState.cpp +++ b/src/lib/orionld/common/orionldState.cpp @@ -118,6 +118,7 @@ bool entityMapsEnabled = false; mongoc_uri_t* mongocUri; mongoc_client_pool_t* mongocPool; sem_t mongocContextsSem; +sem_t mongocConnectionSem; char mongocServerVersion[128]; char postgresServerVersion[128]; diff --git a/src/lib/orionld/common/orionldState.h b/src/lib/orionld/common/orionldState.h index 34578b3094..5128655e75 100644 --- a/src/lib/orionld/common/orionldState.h +++ b/src/lib/orionld/common/orionldState.h @@ -639,6 +639,7 @@ extern mongoc_collection_t* mongoRegistrationsCollectionP; // Deprecated extern mongoc_uri_t* mongocUri; extern mongoc_client_pool_t* mongocPool; extern sem_t mongocContextsSem; +extern sem_t mongocConnectionSem; extern char mongocServerVersion[128]; extern char postgresServerVersion[128]; diff --git a/src/lib/orionld/mongoc/mongocAttributeDelete.cpp b/src/lib/orionld/mongoc/mongocAttributeDelete.cpp index 71e8306ef9..755f39cecd 100644 --- a/src/lib/orionld/mongoc/mongocAttributeDelete.cpp +++ b/src/lib/orionld/mongoc/mongocAttributeDelete.cpp @@ -54,10 +54,7 @@ extern "C" // bool mongocAttributeDelete(const char* entityId, const char* attrName) { - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_t selector; bson_init(&selector); diff --git a/src/lib/orionld/mongoc/mongocAttributeReplace.cpp b/src/lib/orionld/mongoc/mongocAttributeReplace.cpp index 6188a9cfc4..a162f82699 100644 --- a/src/lib/orionld/mongoc/mongocAttributeReplace.cpp +++ b/src/lib/orionld/mongoc/mongocAttributeReplace.cpp @@ -47,10 +47,7 @@ extern "C" // bool mongocAttributeReplace(const char* entityId, KjNode* dbAttrP, char** detailP) { - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_t selector; bson_init(&selector); diff --git a/src/lib/orionld/mongoc/mongocAttributesAdd.cpp b/src/lib/orionld/mongoc/mongocAttributesAdd.cpp index 73e8ff49a0..f88c4ed9f2 100644 --- a/src/lib/orionld/mongoc/mongocAttributesAdd.cpp +++ b/src/lib/orionld/mongoc/mongocAttributesAdd.cpp @@ -60,10 +60,7 @@ bool mongocAttributesAdd bool singleAttribute ) { - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_t selector; bson_init(&selector); diff --git a/src/lib/orionld/mongoc/mongocConnectionGet.cpp b/src/lib/orionld/mongoc/mongocConnectionGet.cpp index 6a24459e7f..8b42f6d425 100644 --- a/src/lib/orionld/mongoc/mongocConnectionGet.cpp +++ b/src/lib/orionld/mongoc/mongocConnectionGet.cpp @@ -23,9 +23,11 @@ * Author: Ken Zangelin */ #include // NULL +#include // sem_wait, sem_post #include // mongoc driver #include "orionld/common/orionldState.h" // orionldState, mongocPool +#include "orionld/types/OrionldTenant.h" // OrionldTenant #include "orionld/mongoc/mongocConnectionGet.h" // Own interface @@ -34,8 +36,36 @@ // // mongocConnectionGet - // -void mongocConnectionGet(void) +void mongocConnectionGet(OrionldTenant* tenantP, DbCollection dbCollection) { + sem_wait(&mongocConnectionSem); + if (orionldState.mongoc.client == NULL) orionldState.mongoc.client = mongoc_client_pool_pop(mongocPool); + + if ((dbCollection & DbEntities) == DbEntities) + { + if (orionldState.mongoc.entitiesP == NULL) + orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, tenantP->mongoDbName, "entities"); + } + + if ((dbCollection & DbSubscriptions) == DbSubscriptions) + { + if (orionldState.mongoc.subscriptionsP == NULL) + orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, tenantP->mongoDbName, "csubs"); + } + + if ((dbCollection & DbRegistrations) == DbRegistrations) + { + if (orionldState.mongoc.registrationsP == NULL) + orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, tenantP->mongoDbName, "registrations"); + } + + if ((dbCollection & DbContexts) == DbContexts) + { + if (orionldState.mongoc.contextsP == NULL) + orionldState.mongoc.contextsP = mongoc_client_get_collection(orionldState.mongoc.client, "orionld", "contexts"); + } + + sem_post(&mongocConnectionSem); } diff --git a/src/lib/orionld/mongoc/mongocConnectionGet.h b/src/lib/orionld/mongoc/mongocConnectionGet.h index 6a08fba1c1..13801e3f55 100644 --- a/src/lib/orionld/mongoc/mongocConnectionGet.h +++ b/src/lib/orionld/mongoc/mongocConnectionGet.h @@ -25,6 +25,22 @@ * * Author: Ken Zangelin */ +#include "orionld/types/OrionldTenant.h" // OrionldTenant + + + +// ----------------------------------------------------------------------------- +// +// DbCollection - move to orionld/types/DbCollection.h +// +typedef enum DbCollection +{ + DbNone = 1, + DbEntities = 2, + DbSubscriptions = 4, + DbRegistrations = 8, + DbContexts = 16 +} DbCollection; @@ -32,6 +48,6 @@ // // mongocConnectionGet - // -extern void mongocConnectionGet(void); +extern void mongocConnectionGet(OrionldTenant* tenantP, DbCollection dbCollection); #endif // SRC_LIB_ORIONLD_MONGOC_MONGOCCONNECTIONGET_H_ diff --git a/src/lib/orionld/mongoc/mongocContextCacheDelete.cpp b/src/lib/orionld/mongoc/mongocContextCacheDelete.cpp index fd83abd317..4c70b89dc0 100644 --- a/src/lib/orionld/mongoc/mongocContextCacheDelete.cpp +++ b/src/lib/orionld/mongoc/mongocContextCacheDelete.cpp @@ -22,6 +22,7 @@ * * Author: Ken Zangelin */ +#include // sem_wait, sem_post #include // bson_t, ... #include // mongoc driver @@ -46,10 +47,7 @@ void mongocContextCacheDelete(const char* id) { bson_t selector; - mongocConnectionGet(); - - if (orionldState.mongoc.contextsP == NULL) - orionldState.mongoc.contextsP = mongoc_client_get_collection(orionldState.mongoc.client, "orionld", "contexts"); + mongocConnectionGet(NULL, DbContexts); bson_init(&selector); bson_append_utf8(&selector, "_id", 3, id, -1); diff --git a/src/lib/orionld/mongoc/mongocContextCacheGet.cpp b/src/lib/orionld/mongoc/mongocContextCacheGet.cpp index 19ab15caf0..edbb1bc512 100644 --- a/src/lib/orionld/mongoc/mongocContextCacheGet.cpp +++ b/src/lib/orionld/mongoc/mongocContextCacheGet.cpp @@ -55,10 +55,7 @@ KjNode* mongocContextCacheGet(void) bson_t* query = bson_new(); // Empty - to find all the contexts in the DB KjNode* contextArray = kjArray(orionldState.kjsonP, NULL); - mongocConnectionGet(); - - if (orionldState.mongoc.contextsP == NULL) - orionldState.mongoc.contextsP = mongoc_client_get_collection(orionldState.mongoc.client, "orionld", "contexts"); + mongocConnectionGet(NULL, DbContexts); sem_wait(&mongocContextsSem); diff --git a/src/lib/orionld/mongoc/mongocContextCachePersist.cpp b/src/lib/orionld/mongoc/mongocContextCachePersist.cpp index 64ff5f4d5d..d0098c4124 100644 --- a/src/lib/orionld/mongoc/mongocContextCachePersist.cpp +++ b/src/lib/orionld/mongoc/mongocContextCachePersist.cpp @@ -49,10 +49,7 @@ void mongocContextCachePersist(KjNode* contextObject) mongocKjTreeToBson(contextObject, &bson); - mongocConnectionGet(); - - if (orionldState.mongoc.contextsP == NULL) - orionldState.mongoc.contextsP = mongoc_client_get_collection(orionldState.mongoc.client, "orionld", "contexts"); + mongocConnectionGet(NULL, DbContexts); sem_wait(&mongocContextsSem); diff --git a/src/lib/orionld/mongoc/mongocEntitiesDelete.cpp b/src/lib/orionld/mongoc/mongocEntitiesDelete.cpp index fa97d5036f..6812c2218d 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesDelete.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesDelete.cpp @@ -48,10 +48,7 @@ extern "C" // bool mongocEntitiesDelete(KjNode* entityIdArray) { - mongocConnectionGet(); // mongocConnectionGet(MONGO_ENTITIES) - do the mongoc_client_get_collection also - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); mongoc_bulk_operation_t* bulkP; diff --git a/src/lib/orionld/mongoc/mongocEntitiesExist.cpp b/src/lib/orionld/mongoc/mongocEntitiesExist.cpp index d4897ae52a..f8cb4a1d02 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesExist.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesExist.cpp @@ -117,10 +117,7 @@ KjNode* mongocEntitiesExist(KjNode* entityIdArray, bool entityType) bson_append_document(&options, "projection", 10, &projection); bson_destroy(&projection); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); mongoCursorP = mongoc_collection_find_with_opts(orionldState.mongoc.entitiesP, &mongoFilter, &options, readPrefs); bson_destroy(&options); diff --git a/src/lib/orionld/mongoc/mongocEntitiesGet.cpp b/src/lib/orionld/mongoc/mongocEntitiesGet.cpp index f9ed8293c8..737d0458d9 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesGet.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesGet.cpp @@ -96,10 +96,7 @@ KjNode* mongocEntitiesGet(char** fieldV, int fields, bool entityIdPresent) bson_t mongoFilter; bson_init(&mongoFilter); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocEntitiesQuery.cpp b/src/lib/orionld/mongoc/mongocEntitiesQuery.cpp index 7d2d7c0b83..48a104ec4a 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesQuery.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesQuery.cpp @@ -775,10 +775,7 @@ KjNode* mongocEntitiesQuery bson_append_document(&options, "projection", 10, &projection); bson_destroy(&projection); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // semTake(&mongoEntitiesSem); diff --git a/src/lib/orionld/mongoc/mongocEntitiesQuery2.cpp b/src/lib/orionld/mongoc/mongocEntitiesQuery2.cpp index fff07f9d54..2cd5ddba00 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesQuery2.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesQuery2.cpp @@ -347,10 +347,7 @@ KjNode* mongocEntitiesQuery2 bson_append_document(&options, "projection", 10, &projection); bson_destroy(&projection); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // count? if (orionldState.uriParams.count == true) diff --git a/src/lib/orionld/mongoc/mongocEntitiesUpsert.cpp b/src/lib/orionld/mongoc/mongocEntitiesUpsert.cpp index 82cea850a9..2dbd9d3ed1 100644 --- a/src/lib/orionld/mongoc/mongocEntitiesUpsert.cpp +++ b/src/lib/orionld/mongoc/mongocEntitiesUpsert.cpp @@ -48,13 +48,9 @@ extern "C" // bool mongocEntitiesUpsert(KjNode* createArrayP, KjNode* updateArrayP) { - mongocConnectionGet(); // mongocConnectionGet(MONGO_ENTITIES) - do the mongoc_client_get_collection also - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); mongoc_bulk_operation_t* bulkP; - bulkP = mongoc_collection_create_bulk_operation_with_opts(orionldState.mongoc.entitiesP, NULL); if (createArrayP != NULL) diff --git a/src/lib/orionld/mongoc/mongocEntityDelete.cpp b/src/lib/orionld/mongoc/mongocEntityDelete.cpp index 7e6ab15883..c1f2c07974 100644 --- a/src/lib/orionld/mongoc/mongocEntityDelete.cpp +++ b/src/lib/orionld/mongoc/mongocEntityDelete.cpp @@ -44,10 +44,7 @@ extern "C" // bool mongocEntityDelete(const char* entityId, char** detailP) { - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_t selector; bson_error_t error; diff --git a/src/lib/orionld/mongoc/mongocEntityGet.cpp b/src/lib/orionld/mongoc/mongocEntityGet.cpp index 505525fab5..4ef5660a30 100644 --- a/src/lib/orionld/mongoc/mongocEntityGet.cpp +++ b/src/lib/orionld/mongoc/mongocEntityGet.cpp @@ -91,10 +91,7 @@ KjNode* mongocEntityGet(const char* entityId, const char** projectionV, bool inc // // Get the connection // - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // // Perform the query diff --git a/src/lib/orionld/mongoc/mongocEntityInsert.cpp b/src/lib/orionld/mongoc/mongocEntityInsert.cpp index 46096cb806..d1a1737165 100644 --- a/src/lib/orionld/mongoc/mongocEntityInsert.cpp +++ b/src/lib/orionld/mongoc/mongocEntityInsert.cpp @@ -51,10 +51,7 @@ bool mongocEntityInsert(KjNode* dbEntityP, const char* entityId) bson_t document; bson_t reply; - mongocConnectionGet(); // mongocConnectionGet(MONGO_ENTITIES) - do the mongoc_client_get_collection also - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_init(&document); bson_init(&reply); diff --git a/src/lib/orionld/mongoc/mongocEntityLookup.cpp b/src/lib/orionld/mongoc/mongocEntityLookup.cpp index 1d3734af4c..a99cfa1e0c 100644 --- a/src/lib/orionld/mongoc/mongocEntityLookup.cpp +++ b/src/lib/orionld/mongoc/mongocEntityLookup.cpp @@ -78,10 +78,7 @@ KjNode* mongocEntityLookup(const char* entityId, const char* entityType, StringA if (entityType != NULL) bson_append_utf8(&mongoFilter, "_id.type", 8, entityType, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // // Projection (will be added to if attrList != NULL) diff --git a/src/lib/orionld/mongoc/mongocEntityReplace.cpp b/src/lib/orionld/mongoc/mongocEntityReplace.cpp index 7c34edbad4..f00e9d22c6 100644 --- a/src/lib/orionld/mongoc/mongocEntityReplace.cpp +++ b/src/lib/orionld/mongoc/mongocEntityReplace.cpp @@ -51,10 +51,7 @@ bool mongocEntityReplace(KjNode* dbEntityP, const char* entityId) bson_t replacement; bson_t reply; - mongocConnectionGet(); // mongocConnectionGet(MONGO_ENTITIES) - do the mongoc_client_get_collection also - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_init(&selector); bson_init(&replacement); diff --git a/src/lib/orionld/mongoc/mongocEntityRetrieve.cpp b/src/lib/orionld/mongoc/mongocEntityRetrieve.cpp index c093ac3d35..53d1858b70 100644 --- a/src/lib/orionld/mongoc/mongocEntityRetrieve.cpp +++ b/src/lib/orionld/mongoc/mongocEntityRetrieve.cpp @@ -412,10 +412,7 @@ KjNode* mongocEntityRetrieve bson_init(&mongoFilter); bson_append_utf8(&mongoFilter, "_id.id", 6, entityId, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocEntityTypeGet.cpp b/src/lib/orionld/mongoc/mongocEntityTypeGet.cpp index 216fff4e7f..ca4b5403de 100644 --- a/src/lib/orionld/mongoc/mongocEntityTypeGet.cpp +++ b/src/lib/orionld/mongoc/mongocEntityTypeGet.cpp @@ -79,10 +79,7 @@ KjNode* mongocEntityTypeGet(OrionldProblemDetails* pdP, const char* typeLongName mongoc_read_prefs_t* readPrefs = mongoc_read_prefs_new(MONGOC_READ_NEAREST); - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); mongoc_cursor_t* mongoCursorP; mongoCursorP = mongoc_collection_find_with_opts(orionldState.mongoc.entitiesP, &mongoFilter, &options, readPrefs); diff --git a/src/lib/orionld/mongoc/mongocEntityTypesFromRegistrationsGet.cpp b/src/lib/orionld/mongoc/mongocEntityTypesFromRegistrationsGet.cpp index 724fe1c475..0f2b2dd3ff 100644 --- a/src/lib/orionld/mongoc/mongocEntityTypesFromRegistrationsGet.cpp +++ b/src/lib/orionld/mongoc/mongocEntityTypesFromRegistrationsGet.cpp @@ -76,10 +76,7 @@ KjNode* mongocEntityTypesFromRegistrationsGet(bool details) bson_destroy(&projection); // Connection - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocEntityUpdate.cpp b/src/lib/orionld/mongoc/mongocEntityUpdate.cpp index 5a5696af53..e4ca518d25 100644 --- a/src/lib/orionld/mongoc/mongocEntityUpdate.cpp +++ b/src/lib/orionld/mongoc/mongocEntityUpdate.cpp @@ -270,10 +270,7 @@ static bool patchApply // bool mongocEntityUpdate(const char* entityId, KjNode* patchTree) { - mongocConnectionGet(); - - if (orionldState.mongoc.entitiesP == NULL) - orionldState.mongoc.entitiesP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "entities"); + mongocConnectionGet(orionldState.tenantP, DbEntities); bson_t selector; bson_init(&selector); diff --git a/src/lib/orionld/mongoc/mongocGeoIndexCreate.cpp b/src/lib/orionld/mongoc/mongocGeoIndexCreate.cpp index a4cc6346f2..aeb37d9b45 100644 --- a/src/lib/orionld/mongoc/mongocGeoIndexCreate.cpp +++ b/src/lib/orionld/mongoc/mongocGeoIndexCreate.cpp @@ -59,7 +59,7 @@ bool mongocGeoIndexCreate(OrionldTenant* tenantP, const char* attrLongName) bson_init(&key); BSON_APPEND_UTF8(&key, indexPath, "2dsphere"); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); mongoc_database_t* dbP = mongoc_client_get_database(orionldState.mongoc.client, tenantP->mongoDbName); char* indexName = mongoc_collection_keys_to_index_string(&key); diff --git a/src/lib/orionld/mongoc/mongocGeoIndexInit.cpp b/src/lib/orionld/mongoc/mongocGeoIndexInit.cpp index 5842ba3f7a..eb534323f1 100644 --- a/src/lib/orionld/mongoc/mongocGeoIndexInit.cpp +++ b/src/lib/orionld/mongoc/mongocGeoIndexInit.cpp @@ -55,7 +55,7 @@ bool mongocGeoIndexInit(void) // // DB Connection // - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); // // Loop over all tenants diff --git a/src/lib/orionld/mongoc/mongocIdIndexCreate.cpp b/src/lib/orionld/mongoc/mongocIdIndexCreate.cpp index 08975babe5..561f520dfd 100644 --- a/src/lib/orionld/mongoc/mongocIdIndexCreate.cpp +++ b/src/lib/orionld/mongoc/mongocIdIndexCreate.cpp @@ -52,7 +52,7 @@ bool mongocIdIndexCreate(OrionldTenant* tenantP) bson_init(&key); BSON_APPEND_INT32(&key, "_id.id", 1); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); mongoc_database_t* dbP = mongoc_client_get_database(orionldState.mongoc.client, tenantP->mongoDbName); char* indexName = mongoc_collection_keys_to_index_string(&key); diff --git a/src/lib/orionld/mongoc/mongocInit.cpp b/src/lib/orionld/mongoc/mongocInit.cpp index 0e027b627a..37a5b95b42 100644 --- a/src/lib/orionld/mongoc/mongocInit.cpp +++ b/src/lib/orionld/mongoc/mongocInit.cpp @@ -318,6 +318,11 @@ void mongocInit // sem_init(&mongocContextsSem, 0, 1); // 0: shared between threads of the same process. 1: free to be taken + // + // Semaphore for getting a connection/collection for mongo + // + sem_init(&mongocConnectionSem, 0, 1); // 0: shared between threads of the same process. 1: free to be taken + if (mongocTenantsGet() == false) LM_X(1, ("Unable to extract tenants from the database - fatal error")); diff --git a/src/lib/orionld/mongoc/mongocRegistrationDelete.cpp b/src/lib/orionld/mongoc/mongocRegistrationDelete.cpp index c851836c65..3c68527cff 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationDelete.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationDelete.cpp @@ -39,14 +39,11 @@ // bool mongocRegistrationDelete(const char* registrationId) { - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); - bson_t selector; bson_error_t error; + mongocConnectionGet(orionldState.tenantP, DbRegistrations); + // // Create the filter for the query // diff --git a/src/lib/orionld/mongoc/mongocRegistrationExists.cpp b/src/lib/orionld/mongoc/mongocRegistrationExists.cpp index 3e5055b4ff..736215203a 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationExists.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationExists.cpp @@ -52,10 +52,7 @@ bool mongocRegistrationExists(const char* registrationId, bool* foundP) bson_init(&mongoFilter); bson_append_utf8(&mongoFilter, "_id", 3, registrationId, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocRegistrationGet.cpp b/src/lib/orionld/mongoc/mongocRegistrationGet.cpp index db59e1015d..6623bb839b 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationGet.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationGet.cpp @@ -58,10 +58,7 @@ KjNode* mongocRegistrationGet(const char* registrationId) bson_init(&mongoFilter); bson_append_utf8(&mongoFilter, "_id", 3, registrationId, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocRegistrationInsert.cpp b/src/lib/orionld/mongoc/mongocRegistrationInsert.cpp index 56273dec0c..0246706168 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationInsert.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationInsert.cpp @@ -51,10 +51,7 @@ bool mongocRegistrationInsert(KjNode* dbRegistrationP, const char* registrationI bson_t document; bson_t reply; - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); bson_init(&document); bson_init(&reply); diff --git a/src/lib/orionld/mongoc/mongocRegistrationLookup.cpp b/src/lib/orionld/mongoc/mongocRegistrationLookup.cpp index 4b700d9a65..7db6efe322 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationLookup.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationLookup.cpp @@ -61,10 +61,7 @@ KjNode* mongocRegistrationLookup(const char* entityId, const char* attribute, in // { $or: [ { "contextRegistration.attrs": { $size: 0 }}, { "contextRegistration.attrs.name": 'attribute' } ] } ??? } - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocRegistrationReplace.cpp b/src/lib/orionld/mongoc/mongocRegistrationReplace.cpp index ec5f8700ef..5ea25ef773 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationReplace.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationReplace.cpp @@ -49,10 +49,7 @@ bool mongocRegistrationReplace(const char* registrationId, KjNode* dbRegistratio bson_t replacement; bson_t reply; - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); + mongocConnectionGet(orionldState.tenantP, DbRegistrations); bson_init(&selector); bson_init(&replacement); diff --git a/src/lib/orionld/mongoc/mongocRegistrationsGet.cpp b/src/lib/orionld/mongoc/mongocRegistrationsGet.cpp index 6dc6222668..9ab69b20ae 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationsGet.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationsGet.cpp @@ -79,11 +79,7 @@ KjNode* mongocRegistrationsGet(int64_t* countP) // bson_init(&mongoFilter); - mongocConnectionGet(); - - if (orionldState.mongoc.registrationsP == NULL) - orionldState.mongoc.registrationsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "registrations"); - + mongocConnectionGet(orionldState.tenantP, DbRegistrations); // count? if (orionldState.uriParams.count == true) diff --git a/src/lib/orionld/mongoc/mongocRegistrationsIter.cpp b/src/lib/orionld/mongoc/mongocRegistrationsIter.cpp index 42594f6ee8..57a0cb3601 100644 --- a/src/lib/orionld/mongoc/mongocRegistrationsIter.cpp +++ b/src/lib/orionld/mongoc/mongocRegistrationsIter.cpp @@ -62,7 +62,7 @@ int mongocRegistrationsIter(RegCache* rcP, RegCacheIterFunc callback) // bson_init(&mongoFilter); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); // // Can't use the "orionldState.mongoc.registrationsP" here, as we'll deal with not one single tenant but all of them diff --git a/src/lib/orionld/mongoc/mongocServerVersionGet.cpp b/src/lib/orionld/mongoc/mongocServerVersionGet.cpp index d72a99bf47..e8c7047eea 100644 --- a/src/lib/orionld/mongoc/mongocServerVersionGet.cpp +++ b/src/lib/orionld/mongoc/mongocServerVersionGet.cpp @@ -52,7 +52,7 @@ bool mongocServerVersionGet(char* serverVersionBuf) bson_init(&command); bson_init(&reply); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); bson_append_int32(&command, "buildinfo", 9, 1); diff --git a/src/lib/orionld/mongoc/mongocSubscriptionDelete.cpp b/src/lib/orionld/mongoc/mongocSubscriptionDelete.cpp index 54b6183a3e..1697260a9e 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionDelete.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionDelete.cpp @@ -39,10 +39,7 @@ // bool mongocSubscriptionDelete(const char* subscriptionId) { - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); bson_t selector; bson_error_t error; diff --git a/src/lib/orionld/mongoc/mongocSubscriptionExists.cpp b/src/lib/orionld/mongoc/mongocSubscriptionExists.cpp index 389933f78a..2eb5e42789 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionExists.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionExists.cpp @@ -51,10 +51,7 @@ bool mongocSubscriptionExists(const char* subscriptionId, char** detailP) bson_init(&mongoFilter); bson_append_utf8(&mongoFilter, "_id", 3, subscriptionId, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocSubscriptionInsert.cpp b/src/lib/orionld/mongoc/mongocSubscriptionInsert.cpp index 83915aa2f4..13cb72316b 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionInsert.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionInsert.cpp @@ -52,10 +52,7 @@ bool mongocSubscriptionInsert(KjNode* dbSubscriptionP, const char* subscriptionI bson_t document; bson_t reply; - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); bson_init(&document); bson_init(&reply); diff --git a/src/lib/orionld/mongoc/mongocSubscriptionLookup.cpp b/src/lib/orionld/mongoc/mongocSubscriptionLookup.cpp index ffccc7f427..7242fd4348 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionLookup.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionLookup.cpp @@ -59,10 +59,7 @@ KjNode* mongocSubscriptionLookup(const char* subscriptionId) bson_init(&mongoFilter); bson_append_utf8(&mongoFilter, "_id", 3, subscriptionId, -1); - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); // // Run the query diff --git a/src/lib/orionld/mongoc/mongocSubscriptionReplace.cpp b/src/lib/orionld/mongoc/mongocSubscriptionReplace.cpp index 64e9e06e64..60b5a965ca 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionReplace.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionReplace.cpp @@ -52,10 +52,7 @@ bool mongocSubscriptionReplace(const char* subscriptionId, KjNode* dbSubscriptio bson_t replacement; bson_t reply; - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); bson_init(&selector); bson_init(&replacement); diff --git a/src/lib/orionld/mongoc/mongocSubscriptionsGet.cpp b/src/lib/orionld/mongoc/mongocSubscriptionsGet.cpp index 4fa59224b8..0e118354db 100644 --- a/src/lib/orionld/mongoc/mongocSubscriptionsGet.cpp +++ b/src/lib/orionld/mongoc/mongocSubscriptionsGet.cpp @@ -79,10 +79,7 @@ KjNode* mongocSubscriptionsGet(int64_t* countP) // bson_init(&mongoFilter); - mongocConnectionGet(); - - if (orionldState.mongoc.subscriptionsP == NULL) - orionldState.mongoc.subscriptionsP = mongoc_client_get_collection(orionldState.mongoc.client, orionldState.tenantP->mongoDbName, "csubs"); + mongocConnectionGet(orionldState.tenantP, DbSubscriptions); // count? diff --git a/src/lib/orionld/mongoc/mongocTenantExists.cpp b/src/lib/orionld/mongoc/mongocTenantExists.cpp index 08cb1a345f..5e42cd3694 100644 --- a/src/lib/orionld/mongoc/mongocTenantExists.cpp +++ b/src/lib/orionld/mongoc/mongocTenantExists.cpp @@ -66,13 +66,13 @@ bool mongocTenantExists(const char* tenantName) bson_init(&command); bson_init(&reply); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); bson_append_int32(&command, "listDatabases", 13, 1); bool b = mongoc_client_read_command_with_opts(orionldState.mongoc.client, "admin", &command, NULL, NULL, &reply, &mcError); if (b == false) - LM_RE(false, ("Database Error ()", mcError.message)); + LM_RE(false, ("Database Error (%s)", mcError.message)); char* title; char* detail; diff --git a/src/lib/orionld/mongoc/mongocTenantsGet.cpp b/src/lib/orionld/mongoc/mongocTenantsGet.cpp index 661bf291a8..b33ca20b31 100644 --- a/src/lib/orionld/mongoc/mongocTenantsGet.cpp +++ b/src/lib/orionld/mongoc/mongocTenantsGet.cpp @@ -54,7 +54,7 @@ bool mongocTenantsGet(void) bson_init(&command); bson_init(&reply); - mongocConnectionGet(); + mongocConnectionGet(NULL, DbNone); bson_append_int32(&command, "listDatabases", 13, 1);