Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/nostrdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,32 @@ struct ndb_lmdb {
MDB_dbi dbs[NDB_DBS];
};

/**
* Clears stale LMDB reader slots after opening the environment.
*
* This protects startup on platforms where reader slots are not reclaimed
* automatically after process termination.
*
* @param[in] env The LMDB environment to inspect.
* @return 1 when the check succeeds, 0 when LMDB reports an error.
*/
static int ndb_lmdb_reader_check(MDB_env *env)
{
int rc;
int dead = 0;

rc = mdb_reader_check(env, &dead);
if (rc != MDB_SUCCESS) {
fprintf(stderr, "mdb_reader_check failed: %s\n", mdb_strerror(rc));
return 0;
}

if (dead > 0)
fprintf(stderr, "mdb_reader_check cleared %d stale reader(s)\n", dead);

return 1;
}

struct ndb_writer {
struct ndb_lmdb *lmdb;
struct ndb_monitor *monitor;
Expand Down Expand Up @@ -7751,6 +7777,12 @@ static int ndb_init_lmdb(const char *filename, struct ndb_lmdb *lmdb, size_t map
return 0;
}

if (!ndb_lmdb_reader_check(lmdb->env)) {
mdb_env_close(lmdb->env);
lmdb->env = NULL;
return 0;
}

// Initialize DBs
if ((rc = mdb_txn_begin(lmdb->env, NULL, 0, &txn))) {
fprintf(stderr, "mdb_txn_begin failed, error %d\n", rc);
Expand Down
Loading