diff --git a/management/univention-directory-listener/src/cache.c b/management/univention-directory-listener/src/cache.c index ae288c7757..cba4437ef8 100644 --- a/management/univention-directory-listener/src/cache.c +++ b/management/univention-directory-listener/src/cache.c @@ -397,7 +397,7 @@ int cache_get_master_entry(CacheMasterEntry *master_entry) { return MDB_SUCCESS; } -int cache_update_master_entry(CacheMasterEntry *master_entry) { +int cache_update_master_entry(CacheMasterEntry *master_entry, int retry) { int rv; MDB_txn *write_txn; MDB_val key, data; @@ -426,7 +426,24 @@ int cache_update_master_entry(CacheMasterEntry *master_entry) { univention_debug(UV_DEBUG_LISTENER, UV_DEBUG_ALL, "cache_update_master_entry: Transaction commit"); if ((rv = mdb_txn_commit(write_txn)) != MDB_SUCCESS) { univention_debug(UV_DEBUG_LISTENER, UV_DEBUG_ERROR, "cache_update_master_entry: storing master entry in database failed"); - ERROR_MDB_ABORT(rv, "mdb_txn_commit"); + if (rv == MDB_PAGE_NOTFOUND && retry == 1) { + univention_debug(UV_DEBUG_LISTENER, UV_DEBUG_ERROR, "cache_update_master_entry: retrying"); + cache_mdb_close(); + + /* TODO: pass these paths properly !! */ + char cache_dir[PATH_MAX] = "/var/lib/univention-directory-listener"; + char cache_mdb_dir[PATH_MAX]; + + rv = snprintf(cache_mdb_dir, PATH_MAX, "%s/cache", cache_dir); + if (rv < 0 || rv >= PATH_MAX) + abort(); + + if (cache_init(cache_mdb_dir, 0) != 0) + exit(1); + cache_update_master_entry(master_entry, 0); + } else { + ERROR_MDB_ABORT(rv, "mdb_txn_commit"); + } return rv; } diff --git a/management/univention-directory-listener/src/cache.h b/management/univention-directory-listener/src/cache.h index 13f9c5f8b0..bdc16f6834 100644 --- a/management/univention-directory-listener/src/cache.h +++ b/management/univention-directory-listener/src/cache.h @@ -46,7 +46,7 @@ int cache_lock(void); int cache_init(char *cache_mdb_dir, int mdb_flags); void cache_sync(void); int cache_get_master_entry(CacheMasterEntry *master_entry); -int cache_update_master_entry(CacheMasterEntry *master_entry); +int cache_update_master_entry(CacheMasterEntry *master_entry, int retry); int cache_update_entry(NotifierID id, char *dn, CacheEntry *entry); int cache_update_entry_lower(NotifierID id, char *dn, CacheEntry *entry); int cache_delete_entry(NotifierID id, char *dn); diff --git a/management/univention-directory-listener/src/main.c b/management/univention-directory-listener/src/main.c index 80accc64b3..4c56c5b15f 100644 --- a/management/univention-directory-listener/src/main.c +++ b/management/univention-directory-listener/src/main.c @@ -587,7 +587,7 @@ int main(int argc, char *argv[]) { cache_get_schema_id(&cache_master_entry.schema_id, 0); - rv = cache_update_master_entry(&cache_master_entry); + rv = cache_update_master_entry(&cache_master_entry, 0); } if (rv != 0) return rv; diff --git a/management/univention-directory-listener/src/notifier.c b/management/univention-directory-listener/src/notifier.c index 7bce309c34..0aeab605ac 100644 --- a/management/univention-directory-listener/src/notifier.c +++ b/management/univention-directory-listener/src/notifier.c @@ -239,7 +239,7 @@ int notifier_listen(univention_ldap_parameters_t *lp, bool write_transaction_fil goto out; cache_master_entry.id = id; - cache_update_master_entry(&cache_master_entry); + cache_update_master_entry(&cache_master_entry, 1); if (cache_set_int("notifier_id", id)) univention_debug(UV_DEBUG_LISTENER, UV_DEBUG_WARN, "failed to write notifier ID"); change_free_transaction_op(&trans.cur);