static void slmdb_assert_cb(MDB_env *env, const char *text) { SLMDB *slmdb = (SLMDB *) mdb_env_get_userctx(env); if (slmdb->assert_fn) slmdb->assert_fn(slmdb->cb_context, text); }
/* perform kick/kill a laggard readers */ static int mdb_oom_handler(MDB_env *env, int pid, void* thread_id, size_t txnid, unsigned gap, int retry) { uint64_t now_ns = ldap_now_steady_ns(); struct mdb_info *mdb = mdb_env_get_userctx(env); if (retry < 0) { double elapsed = (now_ns - mdb->mi_oom_timestamp_ns) * 1e-9; const char* suffix = "s"; if (elapsed < 1) { elapsed *= 1000; suffix = "ms"; } if (gap) { Debug( LDAP_DEBUG_ANY, "oom-handler: done, txnid %zu, got/forward %u, elapsed/waited %.3f%s, %d retries\n", txnid, gap, elapsed, suffix, -retry ); } else { Debug( LDAP_DEBUG_ANY, "oom-handler: unable, txnid %zu, elapsed/waited %.3f%s, %d retries\n", txnid, elapsed, suffix, -retry ); } mdb->mi_oom_timestamp_ns = 0; return 0; } if (! mdb->mi_oom_flags) return -1; else if (! mdb->mi_oom_timestamp_ns) { mdb->mi_oom_timestamp_ns = now_ns; Debug( LDAP_DEBUG_ANY, "oom-handler: begin, txnid %zu lag %u\n", txnid, gap ); } if ( (mdb->mi_oom_flags & MDBX_OOM_KILL) && pid != getpid() ) { if ( kill( pid, SIGKILL ) == 0 ) { Debug( LDAP_DEBUG_ANY, "oom-handler: txnid %zu lag %u, KILLED pid %i\n", txnid, gap, pid ); ldap_pvt_thread_yield(); return 2; } if ( errno == ESRCH ) return 0; Debug( LDAP_DEBUG_ANY, "oom-handler: retry %d, UNABLE kill pid %i: %s\n", retry, pid, STRERROR(errno) ); } if ( (mdb->mi_oom_flags & MDBX_OOM_YIELD) && ! slapd_shutdown ) { if (retry == 0) Debug( LDAP_DEBUG_ANY, "oom-handler: txnid %zu lag %u, WAITING\n", txnid, gap ); if (retry < 42) ldap_pvt_thread_yield(); else usleep(retry); return 0; } mdb->mi_oom_timestamp_ns = 0; return -1; }