Diff for /servers/slapd/overlays/pcache.c between versions 1.41.2.15 and 1.41.2.16

version 1.41.2.15, 2006/02/17 02:07:35 version 1.41.2.16, 2006/02/17 07:38:41
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/pcache.c,v 1.41.2.14 2006/01/23 23:52:17 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/pcache.c,v 1.41.2.15 2006/02/17 02:07:35 hyc Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2003-2006 The OpenLDAP Foundation.   * Copyright 2003-2006 The OpenLDAP Foundation.
Line 136  typedef struct cache_manager_s { Line 136  typedef struct cache_manager_s {
         query_manager*   qm;    /* query cache managed by the cache manager */          query_manager*   qm;    /* query cache managed by the cache manager */
 } cache_manager;  } cache_manager;
   
   static int pcache_debug;
   
 static AttributeDescription *ad_queryid;  static AttributeDescription *ad_queryid;
 static char *queryid_schema = "( 1.3.6.1.4.1.4203.666.1.12 NAME 'queryid' "  static char *queryid_schema = "( 1.3.6.1.4.1.4203.666.1.12 NAME 'queryid' "
                         "DESC 'list of queries the entry belongs to' "                          "DESC 'list of queries the entry belongs to' "
Line 263  add_query_on_top (query_manager* qm, Cac Line 265  add_query_on_top (query_manager* qm, Cac
   
         qc->lru_down = top;          qc->lru_down = top;
         qc->lru_up = NULL;          qc->lru_up = NULL;
         Debug( LDAP_DEBUG_CACHE, "Base of added query = %s\n",          Debug( pcache_debug, "Base of added query = %s\n",
                         q->base.bv_val, 0, 0 );                          q->base.bv_val, 0, 0 );
 }  }
   
Line 492  query_containment(Operation *op, query_m Line 494  query_containment(Operation *op, query_m
   
         MatchingRule* mrule = NULL;          MatchingRule* mrule = NULL;
         if (inputf != NULL) {          if (inputf != NULL) {
                 Debug( LDAP_DEBUG_CACHE, "Lock QC index = %d\n",                  Debug( pcache_debug, "Lock QC index = %d\n",
                                 template_index, 0, 0 );                                  template_index, 0, 0 );
                 ldap_pvt_thread_rdwr_rlock(&(templa[template_index].t_rwlock));                  ldap_pvt_thread_rdwr_rlock(&(templa[template_index].t_rwlock));
                 for(qc=templa[template_index].query; qc != NULL; qc= qc->next) {                  for(qc=templa[template_index].query; qc != NULL; qc= qc->next) {
Line 523  query_containment(Operation *op, query_m Line 525  query_containment(Operation *op, query_m
                                                         &(fs->f_ava->aa_value), &text);                                                          &(fs->f_ava->aa_value), &text);
                                                 if (rc != LDAP_SUCCESS) {                                                  if (rc != LDAP_SUCCESS) {
                                                         ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock));                                                          ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock));
                                                         Debug( LDAP_DEBUG_CACHE,                                                          Debug( pcache_debug,
                                                         "Unlock: Exiting QC index=%d\n",                                                          "Unlock: Exiting QC index=%d\n",
                                                         template_index, 0, 0 );                                                          template_index, 0, 0 );
                                                         return NULL;                                                          return NULL;
Line 594  query_containment(Operation *op, query_m Line 596  query_containment(Operation *op, query_m
                                 }                                  }
                         }                          }
                 }                  }
                 Debug( LDAP_DEBUG_CACHE,                  Debug( pcache_debug,
                         "Not answerable: Unlock QC index=%d\n",                          "Not answerable: Unlock QC index=%d\n",
                         template_index, 0, 0 );                          template_index, 0, 0 );
                 ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock));                  ldap_pvt_thread_rdwr_runlock(&(templa[template_index].t_rwlock));
Line 636  static void add_query( Line 638  static void add_query(
         }          }
         new_cached_query->lru_up = NULL;          new_cached_query->lru_up = NULL;
         new_cached_query->lru_down = NULL;          new_cached_query->lru_down = NULL;
         Debug( LDAP_DEBUG_CACHE, "Added query expires at %ld\n",          Debug( pcache_debug, "Added query expires at %ld\n",
                         (long) new_cached_query->expiry_time, 0, 0 );                          (long) new_cached_query->expiry_time, 0, 0 );
         new_query = (Query*)new_cached_query;          new_query = (Query*)new_cached_query;
   
Line 646  static void add_query( Line 648  static void add_query(
         new_query->attrs = query->attrs;          new_query->attrs = query->attrs;
   
         /* Adding a query    */          /* Adding a query    */
         Debug( LDAP_DEBUG_CACHE, "Lock AQ index = %d\n",          Debug( pcache_debug, "Lock AQ index = %d\n",
                         template_index, 0, 0 );                          template_index, 0, 0 );
         ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock);          ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock);
         if (templ->query == NULL)          if (templ->query == NULL)
Line 657  static void add_query( Line 659  static void add_query(
         new_cached_query->prev = NULL;          new_cached_query->prev = NULL;
         templ->query = new_cached_query;          templ->query = new_cached_query;
         templ->no_of_queries++;          templ->no_of_queries++;
         Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES++ %d\n",          Debug( pcache_debug, "TEMPLATE %d QUERIES++ %d\n",
                         template_index, templ->no_of_queries, 0 );                          template_index, templ->no_of_queries, 0 );
   
         Debug( LDAP_DEBUG_CACHE, "Unlock AQ index = %d \n",          Debug( pcache_debug, "Unlock AQ index = %d \n",
                         template_index, 0, 0 );                          template_index, 0, 0 );
         ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);          ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);
   
Line 702  static void cache_replacement(query_mana Line 704  static void cache_replacement(query_mana
         result->bv_len = 0;          result->bv_len = 0;
   
         if (!bottom) {          if (!bottom) {
                 Debug ( LDAP_DEBUG_CACHE,                  Debug ( pcache_debug,
                         "Cache replacement invoked without "                          "Cache replacement invoked without "
                         "any query in LRU list\n", 0, 0, 0 );                          "any query in LRU list\n", 0, 0, 0 );
                 ldap_pvt_thread_mutex_unlock(&qm->lru_mutex);                  ldap_pvt_thread_mutex_unlock(&qm->lru_mutex);
Line 716  static void cache_replacement(query_mana Line 718  static void cache_replacement(query_mana
         *result = bottom->q_uuid;          *result = bottom->q_uuid;
         bottom->q_uuid.bv_val = NULL;          bottom->q_uuid.bv_val = NULL;
   
         Debug( LDAP_DEBUG_CACHE, "Lock CR index = %d\n", temp_id, 0, 0 );          Debug( pcache_debug, "Lock CR index = %d\n", temp_id, 0, 0 );
         ldap_pvt_thread_rdwr_wlock(&(qm->templates[temp_id].t_rwlock));          ldap_pvt_thread_rdwr_wlock(&(qm->templates[temp_id].t_rwlock));
         remove_from_template(bottom, (qm->templates+temp_id));          remove_from_template(bottom, (qm->templates+temp_id));
         Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES-- %d\n",          Debug( pcache_debug, "TEMPLATE %d QUERIES-- %d\n",
                 temp_id, qm->templates[temp_id].no_of_queries, 0 );                  temp_id, qm->templates[temp_id].no_of_queries, 0 );
         Debug( LDAP_DEBUG_CACHE, "Unlock CR index = %d\n", temp_id, 0, 0 );          Debug( pcache_debug, "Unlock CR index = %d\n", temp_id, 0, 0 );
         ldap_pvt_thread_rdwr_wunlock(&(qm->templates[temp_id].t_rwlock));          ldap_pvt_thread_rdwr_wunlock(&(qm->templates[temp_id].t_rwlock));
         free_query(bottom);          free_query(bottom);
 }  }
Line 814  remove_query_data ( Line 816  remove_query_data (
                 op->o_req_ndn = qi->xdn;                  op->o_req_ndn = qi->xdn;
   
                 if ( qi->del) {                  if ( qi->del) {
                         Debug( LDAP_DEBUG_CACHE, "DELETING ENTRY TEMPLATE=%s\n",                          Debug( pcache_debug, "DELETING ENTRY TEMPLATE=%s\n",
                                 query_uuid->bv_val, 0, 0 );                                  query_uuid->bv_val, 0, 0 );
   
                         op->o_tag = LDAP_REQ_DELETE;                          op->o_tag = LDAP_REQ_DELETE;
Line 836  remove_query_data ( Line 838  remove_query_data (
                         mod.sml_values = vals;                          mod.sml_values = vals;
                         mod.sml_nvalues = NULL;                          mod.sml_nvalues = NULL;
                         mod.sml_next = NULL;                          mod.sml_next = NULL;
                         Debug( LDAP_DEBUG_CACHE,                          Debug( pcache_debug,
                                 "REMOVING TEMP ATTR : TEMPLATE=%s\n",                                  "REMOVING TEMP ATTR : TEMPLATE=%s\n",
                                 query_uuid->bv_val, 0, 0 );                                  query_uuid->bv_val, 0, 0 );
   
Line 978  cache_entries( Line 980  cache_entries(
         op_tmp.o_dn = cm->db.be_rootdn;          op_tmp.o_dn = cm->db.be_rootdn;
         op_tmp.o_ndn = cm->db.be_rootndn;          op_tmp.o_ndn = cm->db.be_rootndn;
   
         Debug( LDAP_DEBUG_CACHE, "UUID for query being added = %s\n",          Debug( pcache_debug, "UUID for query being added = %s\n",
                         uuidbuf, 0, 0 );                          uuidbuf, 0, 0 );
   
         for ( e=si->head; e; e=si->head ) {          for ( e=si->head; e; e=si->head ) {
Line 987  cache_entries( Line 989  cache_entries(
                 while ( cm->cur_entries > (cm->max_entries) ) {                  while ( cm->cur_entries > (cm->max_entries) ) {
                                 qm->crfunc(qm, &crp_uuid);                                  qm->crfunc(qm, &crp_uuid);
                                 if (crp_uuid.bv_val) {                                  if (crp_uuid.bv_val) {
                                         Debug( LDAP_DEBUG_CACHE,                                          Debug( pcache_debug,
                                                 "Removing query UUID %s\n",                                                  "Removing query UUID %s\n",
                                                 crp_uuid.bv_val, 0, 0 );                                                  crp_uuid.bv_val, 0, 0 );
                                         return_val = remove_query_data(&op_tmp, rs, &crp_uuid);                                          return_val = remove_query_data(&op_tmp, rs, &crp_uuid);
                                         Debug( LDAP_DEBUG_CACHE,                                          Debug( pcache_debug,
                                                 "QUERY REMOVED, SIZE=%d\n",                                                  "QUERY REMOVED, SIZE=%d\n",
                                                 return_val, 0, 0);                                                  return_val, 0, 0);
                                         ldap_pvt_thread_mutex_lock(                                          ldap_pvt_thread_mutex_lock(
                                                         &cm->cache_mutex );                                                          &cm->cache_mutex );
                                         cm->cur_entries -= return_val;                                          cm->cur_entries -= return_val;
                                         cm->num_cached_queries--;                                          cm->num_cached_queries--;
                                         Debug( LDAP_DEBUG_CACHE,                                          Debug( pcache_debug,
                                                 "STORED QUERIES = %lu\n",                                                  "STORED QUERIES = %lu\n",
                                                 cm->num_cached_queries, 0, 0 );                                                  cm->num_cached_queries, 0, 0 );
                                         ldap_pvt_thread_mutex_unlock(                                          ldap_pvt_thread_mutex_unlock(
                                                         &cm->cache_mutex );                                                          &cm->cache_mutex );
                                         Debug( LDAP_DEBUG_CACHE,                                          Debug( pcache_debug,
                                                 "QUERY REMOVED, CACHE ="                                                  "QUERY REMOVED, CACHE ="
                                                 "%d entries\n",                                                  "%d entries\n",
                                                 cm->cur_entries, 0, 0 );                                                  cm->cur_entries, 0, 0 );
Line 1013  cache_entries( Line 1015  cache_entries(
                 return_val = merge_entry(&op_tmp, e, query_uuid);                  return_val = merge_entry(&op_tmp, e, query_uuid);
                 ldap_pvt_thread_mutex_lock(&cm->cache_mutex);                  ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
                 cm->cur_entries += return_val;                  cm->cur_entries += return_val;
                 Debug( LDAP_DEBUG_CACHE,                  Debug( pcache_debug,
                         "ENTRY ADDED/MERGED, CACHED ENTRIES=%d\n",                          "ENTRY ADDED/MERGED, CACHED ENTRIES=%d\n",
                         cm->cur_entries, 0, 0 );                          cm->cur_entries, 0, 0 );
                 return_val = 0;                  return_val = 0;
Line 1075  pcache_response( Line 1077  pcache_response(
   
                         ldap_pvt_thread_mutex_lock(&cm->cache_mutex);                          ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
                         cm->num_cached_queries++;                          cm->num_cached_queries++;
                         Debug( LDAP_DEBUG_CACHE, "STORED QUERIES = %lu\n",                          Debug( pcache_debug, "STORED QUERIES = %lu\n",
                                         cm->num_cached_queries, 0, 0 );                                          cm->num_cached_queries, 0, 0 );
                         ldap_pvt_thread_mutex_unlock(&cm->cache_mutex);                          ldap_pvt_thread_mutex_unlock(&cm->cache_mutex);
   
Line 1178  pcache_chk_controls( Line 1180  pcache_chk_controls(
                 /* fallthru */                  /* fallthru */
   
         case SLAP_CONTROL_CRITICAL:          case SLAP_CONTROL_CRITICAL:
                 Debug( LDAP_DEBUG_CACHE, "%s: "                  Debug( pcache_debug, "%s: "
                         "%scritical pagedResults control "                          "%scritical pagedResults control "
                         "disabled with proxy cache%s.\n",                          "disabled with proxy cache%s.\n",
                         op->o_log_prefix, non, stripped );                          op->o_log_prefix, non, stripped );
Line 1229  pcache_op_search( Line 1231  pcache_op_search(
                 return SLAP_CB_CONTINUE;                  return SLAP_CB_CONTINUE;
         }          }
   
         Debug( LDAP_DEBUG_CACHE, "query template of incoming query = %s\n",          Debug( pcache_debug, "query template of incoming query = %s\n",
                                         tempstr.bv_val, 0, 0 );                                          tempstr.bv_val, 0, 0 );
   
         /* FIXME: cannot cache/answer requests with pagedResults control */          /* FIXME: cannot cache/answer requests with pagedResults control */
Line 1274  pcache_op_search( Line 1276  pcache_op_search(
                 BackendDB       *save_bd = op->o_bd;                  BackendDB       *save_bd = op->o_bd;
                 slap_callback   *save_cb = op->o_callback;                  slap_callback   *save_cb = op->o_callback;
   
                 Debug( LDAP_DEBUG_CACHE, "QUERY ANSWERABLE\n", 0, 0, 0 );                  Debug( pcache_debug, "QUERY ANSWERABLE\n", 0, 0, 0 );
                 op->o_tmpfree( filter_attrs, op->o_tmpmemctx );                  op->o_tmpfree( filter_attrs, op->o_tmpmemctx );
                 ldap_pvt_thread_rdwr_runlock(&qm->templates[i].t_rwlock);                  ldap_pvt_thread_rdwr_runlock(&qm->templates[i].t_rwlock);
                 if ( BER_BVISNULL( &answerable->q_uuid )) {                  if ( BER_BVISNULL( &answerable->q_uuid )) {
Line 1291  pcache_op_search( Line 1293  pcache_op_search(
                 return i;                  return i;
         }          }
   
         Debug( LDAP_DEBUG_CACHE, "QUERY NOT ANSWERABLE\n", 0, 0, 0 );          Debug( pcache_debug, "QUERY NOT ANSWERABLE\n", 0, 0, 0 );
   
         ldap_pvt_thread_mutex_lock(&cm->cache_mutex);          ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
         if (cm->num_cached_queries >= cm->max_queries) {          if (cm->num_cached_queries >= cm->max_queries) {
Line 1306  pcache_op_search( Line 1308  pcache_op_search(
                 slap_callback           *cb;                  slap_callback           *cb;
                 struct search_info      *si;                  struct search_info      *si;
   
                 Debug( LDAP_DEBUG_CACHE, "QUERY CACHEABLE\n", 0, 0, 0 );                  Debug( pcache_debug, "QUERY CACHEABLE\n", 0, 0, 0 );
                 query.filter = filter_dup(op->ors_filter, NULL);                  query.filter = filter_dup(op->ors_filter, NULL);
                 add_filter_attrs(op, &query.attrs, &qm->attr_sets[attr_set],                  add_filter_attrs(op, &query.attrs, &qm->attr_sets[attr_set],
                         filter_attrs, fattr_cnt, fattr_got_oc);                          filter_attrs, fattr_cnt, fattr_got_oc);
Line 1343  pcache_op_search( Line 1345  pcache_op_search(
                 }                  }
   
         } else {          } else {
                 Debug( LDAP_DEBUG_CACHE, "QUERY NOT CACHEABLE\n",                  Debug( pcache_debug, "QUERY NOT CACHEABLE\n",
                                         0, 0, 0);                                          0, 0, 0);
         }          }
   
Line 1423  consistency_check( Line 1425  consistency_check(
                 if ( query ) pause = 0;                  if ( query ) pause = 0;
                 op->o_time = slap_get_time();                  op->o_time = slap_get_time();
                 while (query && (query->expiry_time < op->o_time)) {                  while (query && (query->expiry_time < op->o_time)) {
                         Debug( LDAP_DEBUG_CACHE, "Lock CR index = %d\n",                          Debug( pcache_debug, "Lock CR index = %d\n",
                                         i, 0, 0 );                                          i, 0, 0 );
                         ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock);                          ldap_pvt_thread_rdwr_wlock(&templ->t_rwlock);
                         remove_from_template(query, templ);                          remove_from_template(query, templ);
                         Debug( LDAP_DEBUG_CACHE, "TEMPLATE %d QUERIES-- %d\n",                          Debug( pcache_debug, "TEMPLATE %d QUERIES-- %d\n",
                                         i, templ->no_of_queries, 0 );                                          i, templ->no_of_queries, 0 );
                         Debug( LDAP_DEBUG_CACHE, "Unlock CR index = %d\n",                          Debug( pcache_debug, "Unlock CR index = %d\n",
                                         i, 0, 0 );                                          i, 0, 0 );
                         ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);                          ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);
                         ldap_pvt_thread_mutex_lock(&qm->lru_mutex);                          ldap_pvt_thread_mutex_lock(&qm->lru_mutex);
Line 1439  consistency_check( Line 1441  consistency_check(
                                 return_val = 0;                                  return_val = 0;
                         else                          else
                                 return_val = remove_query_data(op, &rs, &query->q_uuid);                                  return_val = remove_query_data(op, &rs, &query->q_uuid);
                         Debug( LDAP_DEBUG_CACHE, "STALE QUERY REMOVED, SIZE=%d\n",                          Debug( pcache_debug, "STALE QUERY REMOVED, SIZE=%d\n",
                                                 return_val, 0, 0 );                                                  return_val, 0, 0 );
                         ldap_pvt_thread_mutex_lock(&cm->cache_mutex);                          ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
                         cm->cur_entries -= return_val;                          cm->cur_entries -= return_val;
                         cm->num_cached_queries--;                          cm->num_cached_queries--;
                         Debug( LDAP_DEBUG_CACHE, "STORED QUERIES = %lu\n",                          Debug( pcache_debug, "STORED QUERIES = %lu\n",
                                         cm->num_cached_queries, 0, 0 );                                          cm->num_cached_queries, 0, 0 );
                         ldap_pvt_thread_mutex_unlock(&cm->cache_mutex);                          ldap_pvt_thread_mutex_unlock(&cm->cache_mutex);
                         Debug( LDAP_DEBUG_CACHE,                          Debug( pcache_debug,
                                 "STALE QUERY REMOVED, CACHE ="                                  "STALE QUERY REMOVED, CACHE ="
                                 "%d entries\n",                                  "%d entries\n",
                                 cm->cur_entries, 0, 0 );                                  cm->cur_entries, 0, 0 );
Line 1729  pc_cf_gen( ConfigArgs *c ) Line 1731  pc_cf_gen( ConfigArgs *c )
                         return( 1 );                          return( 1 );
                 }                  }
                 cm->cc_period = (time_t)t;                  cm->cc_period = (time_t)t;
                 Debug( LDAP_DEBUG_CACHE,                  Debug( pcache_debug,
                                 "Total # of attribute sets to be cached = %d.\n",                                  "Total # of attribute sets to be cached = %d.\n",
                                 cm->numattrsets, 0, 0 );                                  cm->numattrsets, 0, 0 );
                 qm->attr_sets = ( struct attr_set * )ch_calloc( cm->numattrsets,                  qm->attr_sets = ( struct attr_set * )ch_calloc( cm->numattrsets,
Line 1830  pc_cf_gen( ConfigArgs *c ) Line 1832  pc_cf_gen( ConfigArgs *c )
                 temp->no_of_queries = 0;                  temp->no_of_queries = 0;
   
                 ber_str2bv( c->argv[1], 0, 1, &temp->querystr );                  ber_str2bv( c->argv[1], 0, 1, &temp->querystr );
                 Debug( LDAP_DEBUG_CACHE, "Template:\n", 0, 0, 0 );                  Debug( pcache_debug, "Template:\n", 0, 0, 0 );
                 Debug( LDAP_DEBUG_CACHE, "  query template: %s\n",                  Debug( pcache_debug, "  query template: %s\n",
                                 temp->querystr.bv_val, 0, 0 );                                  temp->querystr.bv_val, 0, 0 );
                 temp->attr_set_index = i;                  temp->attr_set_index = i;
                 qm->attr_sets[i].flags |= PC_REFERENCED;                  qm->attr_sets[i].flags |= PC_REFERENCED;
                 Debug( LDAP_DEBUG_CACHE, "  attributes: \n", 0, 0, 0 );                  Debug( pcache_debug, "  attributes: \n", 0, 0, 0 );
                 if ( ( attrarray = qm->attr_sets[i].attrs ) != NULL ) {                  if ( ( attrarray = qm->attr_sets[i].attrs ) != NULL ) {
                         for ( i=0; attrarray[i].an_name.bv_val; i++ )                          for ( i=0; attrarray[i].an_name.bv_val; i++ )
                                 Debug( LDAP_DEBUG_CACHE, "\t%s\n",                                  Debug( pcache_debug, "\t%s\n",
                                         attrarray[i].an_name.bv_val, 0, 0 );                                          attrarray[i].an_name.bv_val, 0, 0 );
                 }                  }
                 temp++;                   temp++; 
Line 2078  int pcache_initialize() Line 2080  int pcache_initialize()
         LDAPAttributeType *at;          LDAPAttributeType *at;
         int code;          int code;
         const char *err;          const char *err;
           struct berval debugbv = BER_BVC("pcache");
   
           if (( code = slap_loglevel_get( &debugbv, &pcache_debug )))
                   return code;
   
         at = ldap_str2attributetype( queryid_schema, &code, &err,          at = ldap_str2attributetype( queryid_schema, &code, &err,
                 LDAP_SCHEMA_ALLOW_ALL );                  LDAP_SCHEMA_ALLOW_ALL );

Removed from v.1.41.2.15  
changed lines
  Added in v.1.41.2.16


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org