]> git.sur5r.net Git - openldap/blob - servers/slapd/back-meta/cache.h
Finish proxy cache cleanup and API porting (on behalf of Apurva Kumar)
[openldap] / servers / slapd / back-meta / cache.h
1 /* Copyright (c) 2003 by International Business Machines, Inc.
2  *
3  * International Business Machines, Inc. (hereinafter called IBM) grants
4  * permission under its copyrights to use, copy, modify, and distribute 
5 this
6  * Software with or without fee, provided that the above copyright notice 
7 and
8  * all paragraphs of this notice appear in all copies, and that the name 
9 of IBM
10  * not be used in connection with the marketing of any product 
11 incorporating
12  * the Software or modifications thereof, without specific, written prior
13  * permission.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
16  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
17  * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
18  * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
19 ARISING
20  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, 
21 EVEN
22  * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
23  */
24
25
26 #ifndef META_CACHE_H
27 #define META_CACHE_H
28 #include "slap.h"
29
30 #ifdef LDAP_CACHING
31 /* cache specific errors */
32 enum type_of_result 
33
34     SUCCESS, 
35     CONN_ERR, 
36     RESULT_ERR, 
37     FILTER_ERR, 
38     REWRITING_ERR,
39     MERGE_ERR, 
40     REMOVE_ERR, 
41     SLIMIT_ERR, 
42     ABANDON_ERR, 
43     CREATE_ENTRY_ERR, 
44     TIMEOUT_ERR, 
45     SIZE_ERR, 
46     GET_SIZE_ERR
47 };   
48
49
50 struct exception {
51     enum type_of_result type; 
52     int  rc; 
53 };
54
55 /* query cache structs */
56 /* query */
57
58 typedef struct Query_s {
59         Filter*         filter;         /* Search Filter */
60         AttributeName*  attrs;          /* Projected attributes */
61         struct berval   base;           /* Search Base */
62         int             scope;          /* Search scope */
63 } Query;
64
65 /* struct representing a cached query */
66 typedef struct cached_query_s {
67         Query                           query;          /* LDAP query */ 
68         char*                           q_uuid;         /* query identifier */ 
69         int                             template_id;    /* template of the query */ 
70         time_t                          expiry_time;    /* time till the query is considered valid */ 
71         struct cached_query_s           *next;          /* next query in the template */
72         struct cached_query_s           *prev;          /* previous query in the template */
73         struct cached_query_s           *lru_up;        /* previous query in the LRU list */ 
74         struct cached_query_s           *lru_down;      /* next query in the LRU list */ 
75 } CachedQuery; 
76
77 /* struct representing a query template
78  * e.g. template string = &(cn=)(mail=) 
79  */
80 typedef struct query_template_s {
81         char*           querystr;       /* Filter string corresponding to the QT */
82         char*           base;           /* Search base */ 
83         int             attr_set_index; /* determines the projected attributes */ 
84
85         CachedQuery*    query;          /* most recent query cached for the template */ 
86         CachedQuery*    query_last;     /* oldest query cached for the template */              
87
88         int             no_of_queries;  /* Total number of queries in the template */
89         long            ttl;            /* TTL for the queries of this template */ 
90         ldap_pvt_thread_rdwr_t t_rwlock; /* Rd/wr lock for accessing queries in the template */ 
91 } QueryTemplate;
92
93 /* 
94  * Represents a set of projected attributes and any
95  * supersets among all specified sets of attributes. 
96  */
97
98 struct attr_set {
99         AttributeName*  attrs;          /* specifies the set */
100         int             count;          /* number of attributes */ 
101         int*            ID_array;       /* array of indices of supersets of 'attrs' */ 
102 };
103
104 struct query_manager_s; 
105
106 /* prototypes for functions for 1) query containment 
107  * 2) query addition, 3) cache replacement 
108  */
109 typedef int     (*QCfunc)(struct query_manager_s*, Query*, int );
110 typedef void    (*AddQueryfunc)(struct query_manager_s*, Query*, int, char*, struct exception* );
111 typedef char*   (*CRfunc)(struct query_manager_s* );
112
113 /* LDAP query cache */ 
114 typedef struct query_manager_s {
115         struct attr_set*        attr_sets;              /* possible sets of projected attributes */
116         QueryTemplate*          templates;              /* cacheable templates */
117
118         CachedQuery*            lru_top;                /* top and bottom of LRU list */
119         CachedQuery*            lru_bottom;
120
121         ldap_pvt_thread_mutex_t         lru_mutex;      /* mutex for accessing LRU list */
122
123         /* Query cache methods */
124         QCfunc                  qcfunc;                 /* Query containment*/  
125         CRfunc                  crfunc;                 /* cache replacement */
126         AddQueryfunc            addfunc;                /* add query */ 
127 } query_manager; 
128
129 /* LDAP query cache manager */ 
130 typedef struct cache_manager_s {
131         unsigned long   cache_size;                     /* current cache size (bytes) */ 
132         unsigned long   thresh_hi;                      /* cache capacity (bytes) */
133         unsigned long   thresh_lo;                      /* lower threshold for cache replacement */
134         unsigned long   num_cached_queries;             /* total number of cached queries */
135         unsigned long   max_queries;                    /* upper bound on # of cached queries */ 
136         int     caching; 
137
138         int     numattrsets;                    /* number of attribute sets */
139         int     numtemplates;                   /* number of cacheable templates */
140         int     total_entries;                  /* total number of entries cached */ 
141         int     num_entries_limit;              /* max # of entries in a cacheable query */ 
142         int     threads;                        /* number of threads currently in meta_back_search */ 
143
144         int     cc_period;              /* interval between successive consistency checks (sec) */ 
145         int     cc_thread_started; 
146         ldap_pvt_thread_t   cc_thread; 
147
148         ldap_pvt_thread_mutex_t         cache_mutex;            
149         ldap_pvt_thread_mutex_t         remove_mutex;
150         ldap_pvt_thread_mutex_t         cc_mutex;       
151
152         query_manager*   qm;    /* query cache managed by the cache manager */ 
153 } cache_manager; 
154
155 /* search-cache.c */
156 int
157 meta_back_cache_search(
158     Operation           *op,
159     SlapReply           *rs
160 ); 
161
162 /* config-cache.c */
163 int
164 meta_back_cache_config(
165         BackendDB       *be,
166         const char      *fname,
167         int             lineno,
168         int             argc,
169         char            **argv
170 ); 
171
172 /* query-cache.c */
173 int     query_containment(query_manager*, Query*, int); 
174 void    add_query(query_manager*, Query*, int, char*, struct exception*);
175 char*   cache_replacement(query_manager*);
176 void    remove_from_template (CachedQuery*, QueryTemplate*); 
177 void    remove_query (query_manager*, CachedQuery*);
178 void    free_query (CachedQuery*); 
179
180 /* substring.c */
181 int     substr_containment_substr(Filter*, Filter*); 
182 int     substr_containment_equality(Filter*, Filter*); 
183
184 /* template.c */
185 void 
186 filter2template( Filter *f, 
187                  struct berval *fstr, 
188                  AttributeName** filter_attrs, 
189                  int* filter_cnt, 
190                  struct exception* result
191 );
192
193 /* merge.c */
194
195 int
196 merge_entry (
197             Operation           *op, 
198             SlapReply           *rs,
199             struct berval       *query_uuid, 
200             struct exception    *result
201 ); 
202
203 int 
204 get_entry_size(Entry* e, 
205                int size_init, 
206                struct exception* result
207 ); 
208
209 /* remove.c */
210 int 
211 remove_query_data (
212                    Operation* conn,
213                    SlapReply *rs,
214                    struct berval* query_uuid, 
215                    struct exception* result
216 );
217 #endif
218 #endif