X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-bdb%2Fback-bdb.h;h=30640a0e455baeeb44118dd75df14952d4ac6a61;hb=d7a1eb0ea2a8bd8989459aae8caf02830d93281d;hp=70e40712d8ee998b0451324bf5001da9aa47c558;hpb=ff9e580d335da9089339b0483a6867af711b9f9d;p=openldap diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index 70e40712d8..30640a0e45 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -1,7 +1,7 @@ /* back-bdb.h - bdb back-end header file */ /* $OpenLDAP$ */ /* - * Copyright 2000-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 2000-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -9,9 +9,8 @@ #define _BACK_BDB_H_ #include -#include - #include "slap.h" +#include LDAP_BEGIN_DECL @@ -31,10 +30,12 @@ LDAP_BEGIN_DECL #define BDB_MAX_ADD_LOOP 30 +#define BDB_ALIASES 1 + #ifdef BDB_SUBDIRS -#define BDB_TMP_SUBDIR LDAP_DIRSEP "tmp" -#define BDB_LG_SUBDIR LDAP_DIRSEP "log" -#define BDB_DATA_SUBDIR LDAP_DIRSEP "data" +#define BDB_TMP_SUBDIR "tmp" +#define BDB_LG_SUBDIR "log" +#define BDB_DATA_SUBDIR "data" #endif #define BDB_SUFFIX ".bdb" @@ -61,16 +62,60 @@ LDAP_BEGIN_DECL #define DEFAULT_CACHE_SIZE 1000 +/* The default search IDL stack cache depth */ +#define DEFAULT_SEARCH_STACK_DEPTH 16 + +/* The minimum we can function with */ +#define MINIMUM_SEARCH_STACK_DEPTH 8 + +/* for the IDL cache */ +#define SLAP_IDL_CACHE 1 + +#ifdef SLAP_IDL_CACHE +typedef struct bdb_idl_cache_entry_s { + struct berval kstr; + ldap_pvt_thread_rdwr_t idl_entry_rwlock; + ID *idl; + DB *db; + struct bdb_idl_cache_entry_s* idl_lru_prev; + struct bdb_idl_cache_entry_s* idl_lru_next; +} bdb_idl_cache_entry_t; +#endif + +/* BDB backend specific entry info */ +typedef struct bdb_entry_info { + struct bdb_entry_info *bei_parent; + ID bei_id; + + int bei_state; +#define CACHE_ENTRY_DELETED 1 +#define CACHE_ENTRY_NO_KIDS 2 + + /* + * remaining fields require backend cache lock to access + */ + struct berval bei_nrdn; + struct berval bei_rdn; + Entry *bei_e; + Avlnode *bei_kids; + ldap_pvt_thread_mutex_t bei_kids_mutex; + + struct bdb_entry_info *bei_lrunext; /* for cache lru list */ + struct bdb_entry_info *bei_lruprev; +} EntryInfo; +#undef BEI +#define BEI(e) ((EntryInfo *) ((e)->e_private)) + /* for the in-core cache of entries */ typedef struct bdb_cache { - int c_maxsize; - int c_cursize; - Avlnode *c_dntree; - Avlnode *c_idtree; - Entry *c_lruhead; /* lru - add accessed entries here */ - Entry *c_lrutail; /* lru - rem lru entries from here */ - ldap_pvt_thread_rdwr_t c_rwlock; - ldap_pvt_thread_mutex_t lru_mutex; + int c_maxsize; + int c_cursize; + EntryInfo c_dntree; + Avlnode *c_idtree; + EntryInfo *c_lruhead; /* lru - add accessed entries here */ + EntryInfo *c_lrutail; /* lru - rem lru entries from here */ + ldap_pvt_thread_rdwr_t c_rwlock; + ldap_pvt_thread_mutex_t lru_mutex; } Cache; #define CACHE_READ_LOCK 0 @@ -94,12 +139,13 @@ struct bdb_info { int bi_ndatabases; struct bdb_db_info **bi_databases; - ldap_pvt_thread_mutex_t bi_database_mutex; int bi_db_opflags; /* db-specific flags */ slap_mask_t bi_defaultmask; Cache bi_cache; Avlnode *bi_attrs; + void *bi_search_stack; + int bi_search_stack_depth; #ifdef BDB_HIER Avlnode *bi_tree; ldap_pvt_thread_rdwr_t bi_tree_rdwr; @@ -111,12 +157,21 @@ struct bdb_info { u_int32_t bi_txn_cp_kbyte; int bi_lock_detect; -#ifdef NO_THREADS - int bi_locker_id; -#endif ID bi_lastid; ldap_pvt_thread_mutex_t bi_lastid_mutex; +#if defined(LDAP_CLIENT_UPDATE) || defined(LDAP_SYNC) + LDAP_LIST_HEAD(pl, slap_op) bi_psearch_list; +#endif +#ifdef SLAP_IDL_CACHE + int bi_idl_cache_max_size; + int bi_idl_cache_size; + Avlnode *bi_idl_tree; + bdb_idl_cache_entry_t *bi_idl_lru_head; + bdb_idl_cache_entry_t *bi_idl_lru_tail; + ldap_pvt_thread_rdwr_t bi_idl_tree_rwlock; + ldap_pvt_thread_mutex_t bi_idl_tree_lrulock; +#endif }; #define bi_id2entry bi_databases[BDB_ID2ENTRY] @@ -129,10 +184,13 @@ struct bdb_info { struct bdb_op_info { BackendDB* boi_bdb; DB_TXN* boi_txn; - int boi_err; + DB_LOCK boi_lock; /* used when no txn */ + u_int32_t boi_err; + u_int32_t boi_locker; + int boi_acl_cache; }; -#define DB_OPEN(db, file, name, type, flags, mode) \ +#define DB_OPEN(db, txn, file, name, type, flags, mode) \ (db)->open(db, file, name, type, flags, mode) #if DB_VERSION_MAJOR < 4 @@ -163,18 +221,15 @@ struct bdb_op_info { /* BDB 4.1.17 adds txn arg to db->open */ #if DB_VERSION_MINOR > 1 || DB_VERSION_PATCH >= 17 #undef DB_OPEN -#define DB_OPEN(db, file, name, type, flags, mode) \ - (db)->open(db, NULL, file, name, type, (flags)|DB_AUTO_COMMIT, mode) +#define DB_OPEN(db, txn, file, name, type, flags, mode) \ + (db)->open(db, txn, file, name, type, flags, mode) #endif #define BDB_REUSE_LOCKERS #ifdef BDB_REUSE_LOCKERS -/* Hack - we depend on "op" and "bdb" being the right variable names - * in each invoker. - */ #define LOCK_ID_FREE(env, locker) -#define LOCK_ID(env, locker) bdb_locker_id(op, bdb, locker) +#define LOCK_ID(env, locker) bdb_locker_id(op, env, locker) #else #define LOCK_ID_FREE(env, locker) XLOCK_ID_FREE(env, locker) #define LOCK_ID(env, locker) XLOCK_ID(env, locker)