]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb/trans.c
misc updates
[openldap] / servers / slapd / back-bdb / trans.c
1 /* trans.c - bdb backend transaction routines */
2 /* $OpenLDAP$ */
3
4 #include "portable.h"
5
6 #include <stdio.h>
7 #include <ac/string.h>
8
9 #include "back-bdb.h"
10 #include "external.h"
11 #include "lber_pvt.h"
12 #include "lutil.h"
13
14
15 /* Congestion avoidance code
16  * for Deadlock Rollback
17  */
18
19 void
20 bdb_trans_backoff( int num_retries )
21 {
22         int i;
23         int delay = 0;
24         int pow_retries = 1;
25         unsigned long key = 0;
26         unsigned long max_key = -1;
27         struct timeval timeout;
28
29         lutil_entropy( (unsigned char *) &key, sizeof( unsigned long ));
30
31         for ( i = 0; i < num_retries; i++ ) {
32                 if ( i >= 5 ) break;
33                 pow_retries *= 4;
34         }
35
36         delay = 16384 * (key * (double) pow_retries / (double) max_key);
37         delay = delay ? delay : 1;
38
39 #ifdef NEW_LOGGING
40         LDAP_LOG( OPERATION, ERR, "delay = %d, num_retries = %d\n", delay, num_retries, 0 );
41 #else
42         Debug( LDAP_DEBUG_TRACE,  "delay = %d, num_retries = %d\n", delay, num_retries, 0 );
43 #endif
44
45         timeout.tv_sec = delay / 1000000;
46         timeout.tv_usec = delay % 1000000;
47         select( 0, NULL, NULL, NULL, &timeout );
48 }