]> git.sur5r.net Git - openldap/commitdiff
Added backend_group result caching.
authorHoward Chu <hyc@openldap.org>
Mon, 12 Nov 2001 19:25:41 +0000 (19:25 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 12 Nov 2001 19:25:41 +0000 (19:25 +0000)
servers/slapd/backend.c
servers/slapd/connection.c

index 31a031963d0cf1641019ddc94ca0f6f6ebc97c22..f1216f410a3f9bc576d55482cc892a566cd7c3c9 100644 (file)
@@ -953,6 +953,28 @@ backend_group(
        AttributeDescription *group_at
 )
 {
+       GroupAssertion *g;
+       int len = strlen(gr_ndn);
+       int i;
+
+       ldap_pvt_thread_mutex_lock( &op->o_abandonmutex );
+       i = op->o_abandon;
+       ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex );
+       if (i)
+               return SLAPD_ABANDON;
+
+       ldap_pvt_thread_mutex_lock( &conn->c_mutex );
+       for (g = conn->c_groups; g; g=g->next) {
+               if (g->be != be || g->oc != group_oc || g->at != group_at ||
+                   g->len != len)
+                       continue;
+               if (strcmp( g->ndn, gr_ndn ) == 0)
+                       break;
+       }
+       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+       if (g)
+               return g->res;
+
        if( strcmp( target->e_ndn, gr_ndn ) != 0 ) {
                /* we won't attempt to send it to a different backend */
                
@@ -964,9 +986,25 @@ backend_group(
        } 
 
        if( be->be_group ) {
-               return be->be_group( be, conn, op,
+               int res = be->be_group( be, conn, op,
                        target, gr_ndn, op_ndn,
                        group_oc, group_at );
+               
+               if (op->o_tag != LDAP_REQ_BIND) {
+                       g = ch_malloc(sizeof(GroupAssertion) + len);
+                       g->be = be;
+                       g->oc = group_oc;
+                       g->at = group_at;
+                       g->res = res;
+                       g->len = len;
+                       strcpy(g->ndn, gr_ndn);
+                       ldap_pvt_thread_mutex_lock( &conn->c_mutex );
+                       g->next = conn->c_groups;
+                       conn->c_groups = g;
+                       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+               }
+
+               return res;
        }
 
        return LDAP_UNWILLING_TO_PERFORM;
index dd58fd82c3285e997ac435504fc2218ed019955a..46d84cfd9c1775a7f60879eaec025b97faeb560f 100644 (file)
@@ -408,6 +408,7 @@ long connection_init(
                c->c_authmech = NULL;
                c->c_dn = NULL;
                c->c_cdn = NULL;
+               c->c_groups = NULL;
 
                c->c_listener_url = NULL;
                c->c_peer_domain = NULL;
@@ -444,6 +445,7 @@ long connection_init(
        assert( c->c_authmech == NULL );
     assert(    c->c_dn == NULL );
     assert(    c->c_cdn == NULL );
+    assert( c->c_groups == NULL );
     assert( c->c_listener_url == NULL );
     assert( c->c_peer_domain == NULL );
     assert( c->c_peer_name == NULL );
@@ -573,6 +575,17 @@ void connection2anonymous( Connection *c )
 
        c->c_authc_backend = NULL;
        c->c_authz_backend = NULL;
+    
+    {
+       GroupAssertion *g, *n;
+       for (g = c->c_groups; g; g=n)
+       {
+           n = g->next;
+           free(g);
+       }
+       c->c_groups = NULL;
+    }
+
 }
 
 static void