예제 #1
0
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);
}
예제 #2
0
/* 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;
}