1 /* back-mdb.h - mdb back-end header file */ 2 /* $OpenLDAP$ */ 3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 4 * 5 * Copyright 2000-2021 The OpenLDAP Foundation. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted only as authorized by the OpenLDAP 10 * Public License. 11 * 12 * A copy of this license is available in the file LICENSE in the 13 * top-level directory of the distribution or, alternatively, at 14 * <http://www.OpenLDAP.org/license.html>. 15 */ 16 17 #ifndef _BACK_MDB_H_ 18 #define _BACK_MDB_H_ 19 20 #include <portable.h> 21 #include "slap.h" 22 #include "lmdb.h" 23 24 LDAP_BEGIN_DECL 25 26 #undef MDB_TOOL_IDL_CACHING /* currently broken */ 27 28 #define DN_BASE_PREFIX SLAP_INDEX_EQUALITY_PREFIX 29 #define DN_ONE_PREFIX '%' 30 #define DN_SUBTREE_PREFIX '@' 31 32 #define MDB_AD2ID 0 33 #define MDB_DN2ID 1 34 #define MDB_ID2ENTRY 2 35 #define MDB_NDB 3 36 37 /* The default search IDL stack cache depth */ 38 #define DEFAULT_SEARCH_STACK_DEPTH 16 39 40 /* The minimum we can function with */ 41 #define MINIMUM_SEARCH_STACK_DEPTH 8 42 43 #define MDB_INDICES 128 44 45 #define MDB_MAXADS 65536 46 47 /* Default to 10MB max */ 48 #define DEFAULT_MAPSIZE (10*1048576) 49 50 /* Most users will never see this */ 51 #define DEFAULT_RTXN_SIZE 10000 52 53 #ifdef LDAP_DEVEL 54 #define MDB_MONITOR_IDX 55 #endif /* LDAP_DEVEL */ 56 57 typedef struct mdb_monitor_t { 58 void *mdm_cb; 59 struct berval mdm_ndn; 60 } mdb_monitor_t; 61 62 /* From ldap_rq.h */ 63 struct re_s; 64 65 struct mdb_info { 66 MDB_env *mi_dbenv; 67 68 /* DB_ENV parameters */ 69 char *mi_dbenv_home; 70 unsigned mi_dbenv_flags; 71 int mi_dbenv_mode; 72 73 size_t mi_mapsize; 74 ID mi_nextid; 75 76 slap_mask_t mi_defaultmask; 77 int mi_nattrs; 78 struct mdb_attrinfo **mi_attrs; 79 void *mi_search_stack; 80 int mi_search_stack_depth; 81 int mi_readers; 82 83 unsigned mi_rtxn_size; 84 int mi_txn_cp; 85 unsigned mi_txn_cp_min; 86 unsigned mi_txn_cp_kbyte; 87 struct re_s *mi_txn_cp_task; 88 struct re_s *mi_index_task; 89 90 mdb_monitor_t mi_monitor; 91 92 #ifdef MDB_MONITOR_IDX 93 ldap_pvt_thread_mutex_t mi_idx_mutex; 94 Avlnode *mi_idx; 95 #endif /* MDB_MONITOR_IDX */ 96 97 int mi_flags; 98 #define MDB_IS_OPEN 0x01 99 #define MDB_OPEN_INDEX 0x02 100 #define MDB_DEL_INDEX 0x08 101 #define MDB_RE_OPEN 0x10 102 #define MDB_NEED_UPGRADE 0x20 103 104 int mi_numads; 105 106 MDB_dbi mi_dbis[MDB_NDB]; 107 AttributeDescription *mi_ads[MDB_MAXADS]; 108 int mi_adxs[MDB_MAXADS]; 109 }; 110 111 #define mi_id2entry mi_dbis[MDB_ID2ENTRY] 112 #define mi_dn2id mi_dbis[MDB_DN2ID] 113 #define mi_ad2id mi_dbis[MDB_AD2ID] 114 115 typedef struct mdb_op_info { 116 OpExtra moi_oe; 117 MDB_txn* moi_txn; 118 int moi_ref; 119 char moi_flag; 120 } mdb_op_info; 121 #define MOI_READER 0x01 122 #define MOI_FREEIT 0x02 123 124 /* Copy an ID "src" to pointer "dst" in big-endian byte order */ 125 #define MDB_ID2DISK( src, dst ) \ 126 do { int i0; ID tmp; unsigned char *_p; \ 127 tmp = (src); _p = (unsigned char *)(dst); \ 128 for ( i0=sizeof(ID)-1; i0>=0; i0-- ) { \ 129 _p[i0] = tmp & 0xff; tmp >>= 8; \ 130 } \ 131 } while(0) 132 133 /* Copy a pointer "src" to a pointer "dst" from big-endian to native order */ 134 #define MDB_DISK2ID( src, dst ) \ 135 do { unsigned i0; ID tmp = 0; unsigned char *_p; \ 136 _p = (unsigned char *)(src); \ 137 for ( i0=0; i0<sizeof(ID); i0++ ) { \ 138 tmp <<= 8; tmp |= *_p++; \ 139 } *(dst) = tmp; \ 140 } while (0) 141 142 LDAP_END_DECL 143 144 /* for the cache of attribute information (which are indexed, etc.) */ 145 typedef struct mdb_attrinfo { 146 AttributeDescription *ai_desc; /* attribute description cn;lang-en */ 147 slap_mask_t ai_indexmask; /* how the attr is indexed */ 148 slap_mask_t ai_newmask; /* new settings to replace old mask */ 149 #ifdef LDAP_COMP_MATCH 150 ComponentReference* ai_cr; /*component indexing*/ 151 #endif 152 Avlnode *ai_root; /* for tools */ 153 void *ai_flist; /* for tools */ 154 void *ai_clist; /* for tools */ 155 MDB_cursor *ai_cursor; /* for tools */ 156 int ai_idx; /* position in AI array */ 157 MDB_dbi ai_dbi; 158 } AttrInfo; 159 160 /* These flags must not clash with SLAP_INDEX flags or ops in slap.h! */ 161 #define MDB_INDEX_DELETING 0x8000U /* index is being modified */ 162 #define MDB_INDEX_UPDATE_OP 0x03 /* performing an index update */ 163 164 /* For slapindex to record which attrs in an entry belong to which 165 * index database 166 */ 167 typedef struct AttrList { 168 struct AttrList *next; 169 Attribute *attr; 170 } AttrList; 171 172 #ifndef CACHELINE 173 #define CACHELINE 64 174 #endif 175 176 #if defined(__i386) || defined(__x86_64) 177 #define MISALIGNED_OK 1 178 #else 179 #define ALIGNER (sizeof(size_t)-1) 180 #endif 181 182 typedef struct IndexRbody { 183 AttrInfo *ai; 184 AttrList *attrs; 185 void *tptr; 186 int i; 187 } IndexRbody; 188 189 typedef struct IndexRec { 190 union { 191 IndexRbody irb; 192 #define ir_ai iru.irb.ai 193 #define ir_attrs iru.irb.attrs 194 #define ir_tptr iru.irb.tptr 195 #define ir_i iru.irb.i 196 /* cache line alignment */ 197 char pad[(sizeof(IndexRbody)+CACHELINE-1) & (!CACHELINE-1)]; 198 } iru; 199 } IndexRec; 200 201 #define MAXRDNS SLAP_LDAPDN_MAXLEN/4 202 203 #include "proto-mdb.h" 204 205 #endif /* _BACK_MDB_H_ */ 206