⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* init.c - initialize bdb backend *//* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/init.c,v 1.177.2.27 2007/01/25 12:42:38 hyc Exp $ *//* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * Copyright 2000-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted only as authorized by the OpenLDAP * Public License. * * A copy of this license is available in the file LICENSE in the * top-level directory of the distribution or, alternatively, at * <http://www.OpenLDAP.org/license.html>. */#include "portable.h"#include <stdio.h>#include <ac/string.h>#include <ac/unistd.h>#include <ac/stdlib.h>#include <ac/errno.h>#include <sys/stat.h>#include "back-bdb.h"#include <lutil.h>#include <ldap_rq.h>#include "alock.h"static const struct bdbi_database {	char *file;	char *name;	int type;	int flags;} bdbi_databases[] = {	{ "id2entry" BDB_SUFFIX, "id2entry", DB_BTREE, 0 },	{ "dn2id" BDB_SUFFIX, "dn2id", DB_BTREE, 0 },	{ NULL, NULL, 0, 0 }};typedef void * db_malloc(size_t);typedef void * db_realloc(void *, size_t);static intbdb_db_init( BackendDB *be ){	struct bdb_info	*bdb;	Debug( LDAP_DEBUG_TRACE,		LDAP_XSTRING(bdb_db_init) ": Initializing " BDB_UCTYPE " database\n",		0, 0, 0 );	/* allocate backend-database-specific stuff */	bdb = (struct bdb_info *) ch_calloc( 1, sizeof(struct bdb_info) );	/* DBEnv parameters */	bdb->bi_dbenv_home = ch_strdup( SLAPD_DEFAULT_DB_DIR );	bdb->bi_dbenv_xflags = 0;	bdb->bi_dbenv_mode = SLAPD_DEFAULT_DB_MODE;	bdb->bi_cache.c_maxsize = DEFAULT_CACHE_SIZE;	bdb->bi_cache.c_minfree = 1;	bdb->bi_lock_detect = DB_LOCK_DEFAULT;	bdb->bi_search_stack_depth = DEFAULT_SEARCH_STACK_DEPTH;	bdb->bi_search_stack = NULL;	ldap_pvt_thread_mutex_init( &bdb->bi_database_mutex );	ldap_pvt_thread_mutex_init( &bdb->bi_lastid_mutex );#ifdef BDB_HIER	ldap_pvt_thread_mutex_init( &bdb->bi_modrdns_mutex );#endif	ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_head_mutex );	ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_tail_mutex );	ldap_pvt_thread_mutex_init( &bdb->bi_cache.c_dntree.bei_kids_mutex );	ldap_pvt_thread_rdwr_init ( &bdb->bi_cache.c_rwlock );	ldap_pvt_thread_rdwr_init( &bdb->bi_idl_tree_rwlock );	ldap_pvt_thread_mutex_init( &bdb->bi_idl_tree_lrulock );	be->be_private = bdb;	be->be_cf_ocs = be->bd_info->bi_cf_ocs;	return 0;}static intbdb_db_close( BackendDB *be );static intbdb_db_open( BackendDB *be ){	int rc, i;	struct bdb_info *bdb = (struct bdb_info *) be->be_private;	struct stat stat1, stat2;	u_int32_t flags;	char path[MAXPATHLEN];	char *dbhome;	int do_recover = 0, do_alock_recover = 0, open_env = 1;	int alockt, quick = 0;	if ( be->be_suffix == NULL ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: need suffix\n",			0, 0, 0 );		return -1;	}	Debug( LDAP_DEBUG_ARGS,		"bdb_db_open: %s\n",		be->be_suffix[0].bv_val, 0, 0 );#ifndef BDB_MULTIPLE_SUFFIXES	if ( be->be_suffix[1].bv_val ) {	Debug( LDAP_DEBUG_ANY,		"bdb_db_open: only one suffix allowed\n", 0, 0, 0 );		return -1;	}#endif	/* Check existence of dbenv_home. Any error means trouble */	rc = stat( bdb->bi_dbenv_home, &stat1 );	if( rc !=0 ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: Cannot access database directory %s (%d)\n",			bdb->bi_dbenv_home, errno, 0 );			return -1;	}	/* Perform database use arbitration/recovery logic */	alockt = (slapMode & SLAP_TOOL_READONLY) ? ALOCK_LOCKED : ALOCK_UNIQUE;	if ( slapMode & SLAP_TOOL_QUICK ) {		alockt |= ALOCK_NOSAVE;		quick = 1;	}	rc = alock_open( &bdb->bi_alock_info, 				"slapd", 				bdb->bi_dbenv_home, alockt );	/* alockt is TRUE if the existing environment was created in Quick mode */	alockt = (rc & ALOCK_NOSAVE) ? 1 : 0;	rc &= ~ALOCK_NOSAVE;	if( rc == ALOCK_RECOVER ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: unclean shutdown detected;"			" attempting recovery.\n", 			0, 0, 0 );		do_alock_recover = 1;		do_recover = DB_RECOVER;	} else if( rc == ALOCK_BUSY ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: database already in use\n", 			0, 0, 0 );		return -1;	} else if( rc != ALOCK_CLEAN ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: alock package is unstable\n", 			0, 0, 0 );		return -1;	}	/*	 * The DB_CONFIG file may have changed. If so, recover the	 * database so that new settings are put into effect. Also	 * note the possible absence of DB_CONFIG in the log.	 */	if( stat( bdb->bi_db_config_path, &stat1 ) == 0 ) {		if ( !do_recover ) {			char *ptr = lutil_strcopy(path, bdb->bi_dbenv_home);			*ptr++ = LDAP_DIRSEP[0];			strcpy( ptr, "__db.001" );			if( stat( path, &stat2 ) == 0 ) {				if( stat2.st_mtime < stat1.st_mtime ) {					Debug( LDAP_DEBUG_ANY,						"bdb_db_open: DB_CONFIG for suffix %s has changed.\n"						"Performing database recovery to activate new settings.\n",						be->be_suffix[0].bv_val, 0, 0 );					do_recover = DB_RECOVER;				}			}		}	}	else {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: Warning - No DB_CONFIG file found "			"in directory %s: (%d)\n"			"Expect poor performance for suffix %s.\n",			bdb->bi_dbenv_home, errno, be->be_suffix[0].bv_val );	}	/* Always let slapcat run, regardless of environment state.	 * This can be used to cause a cache flush after an unclean	 * shutdown.	 */	if ( do_recover && ( slapMode & SLAP_TOOL_READONLY )) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: Recovery skipped in read-only mode. "			"Run manual recovery if errors are encountered.\n",			0, 0, 0 );		do_recover = 0;		quick = alockt;	}	/* An existing environment in Quick mode has nothing to recover. */	if ( alockt && do_recover ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: cannot recover, database must be reinitialized.\n", 			0, 0, 0 );		rc = -1;		goto fail;	}	rc = db_env_create( &bdb->bi_dbenv, 0 );	if( rc != 0 ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: db_env_create failed: %s (%d)\n",			db_strerror(rc), rc, 0 );		goto fail;	}#ifdef HAVE_EBCDIC	strcpy( path, bdb->bi_dbenv_home );	__atoe( path );	dbhome = path;#else	dbhome = bdb->bi_dbenv_home;#endif	/* If existing environment is clean but doesn't support	 * currently requested modes, remove it.	 */	if ( !do_recover && ( alockt ^ quick )) {		rc = bdb->bi_dbenv->remove( bdb->bi_dbenv, dbhome, DB_FORCE );		if ( rc ) {			Debug( LDAP_DEBUG_ANY,				"bdb_db_open: dbenv remove failed: %s (%d)\n",				db_strerror(rc), rc, 0 );			bdb->bi_dbenv = NULL;			goto fail;		}		rc = db_env_create( &bdb->bi_dbenv, 0 );		if( rc != 0 ) {			Debug( LDAP_DEBUG_ANY,				"bdb_db_open: db_env_create failed: %s (%d)\n",				db_strerror(rc), rc, 0 );			goto fail;		}	}	bdb->bi_dbenv->set_errpfx( bdb->bi_dbenv, be->be_suffix[0].bv_val );	bdb->bi_dbenv->set_errcall( bdb->bi_dbenv, bdb_errcall );	bdb->bi_dbenv->set_lk_detect( bdb->bi_dbenv, bdb->bi_lock_detect );	/* One long-lived TXN per thread, two TXNs per write op */	bdb->bi_dbenv->set_tx_max( bdb->bi_dbenv, connection_pool_max * 3 );	if( bdb->bi_dbenv_xflags != 0 ) {		rc = bdb->bi_dbenv->set_flags( bdb->bi_dbenv,			bdb->bi_dbenv_xflags, 1);		if( rc != 0 ) {			Debug( LDAP_DEBUG_ANY,				"bdb_db_open: dbenv_set_flags failed: %s (%d)\n",				db_strerror(rc), rc, 0 );			goto fail;		}	}#define	BDB_TXN_FLAGS	(DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN)	Debug( LDAP_DEBUG_TRACE,		"bdb_db_open: dbenv_open(%s)\n",		bdb->bi_dbenv_home, 0, 0);	flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD;	if ( !quick )		flags |= BDB_TXN_FLAGS;	/* If a key was set, use shared memory for the BDB environment */	if ( bdb->bi_shm_key ) {		bdb->bi_dbenv->set_shm_key( bdb->bi_dbenv, bdb->bi_shm_key );		flags |= DB_SYSTEM_MEM;	}	rc = bdb->bi_dbenv->open( bdb->bi_dbenv, dbhome,			flags | do_recover, bdb->bi_dbenv_mode );	if ( rc ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: Database cannot be %s, err %d. "			"Restore from backup!\n",				do_recover ? "recovered" : "opened", rc, 0);		goto fail;	}	if ( do_alock_recover && alock_recover (&bdb->bi_alock_info) != 0 ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: alock_recover failed\n",			0, 0, 0 );		rc = -1;		goto fail;	}#ifdef SLAP_ZONE_ALLOC	if ( bdb->bi_cache.c_maxsize ) {		bdb->bi_cache.c_zctx = slap_zn_mem_create(								SLAP_ZONE_INITSIZE,								SLAP_ZONE_MAXSIZE,								SLAP_ZONE_DELTA,								SLAP_ZONE_SIZE);	}#endif	if ( bdb->bi_idl_cache_max_size ) {		bdb->bi_idl_tree = NULL;		bdb->bi_idl_cache_size = 0;	}	flags = DB_THREAD | bdb->bi_db_opflags;#ifdef DB_AUTO_COMMIT	if ( !quick )		flags |= DB_AUTO_COMMIT;#endif	bdb->bi_databases = (struct bdb_db_info **) ch_malloc(		BDB_INDICES * sizeof(struct bdb_db_info *) );	/* open (and create) main database */	for( i = 0; bdbi_databases[i].name; i++ ) {		struct bdb_db_info *db;		db = (struct bdb_db_info *) ch_calloc(1, sizeof(struct bdb_db_info));		rc = db_create( &db->bdi_db, bdb->bi_dbenv, 0 );		if( rc != 0 ) {			Debug( LDAP_DEBUG_ANY,				"bdb_db_open: db_create(%s) failed: %s (%d)\n",				bdb->bi_dbenv_home, db_strerror(rc), rc );			goto fail;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -