Ticket #8: greyfix-8.patch
| File greyfix-8.patch, 1.8 kB (added by kmkaplan, 10 months ago) |
|---|
-
old-greyfix/greyfix.c
old new 79 79 static DBT dbkey = { 0 }; 80 80 static DBT dbdata = { 0 }; 81 81 static struct triplet_data triplet_data; 82 static int deadlock_detect = 0; 82 83 83 84 static unsigned long greylist_delay = DELAY_MAIL_SECS; 84 85 static unsigned long bloc_max_idle = AUTO_RECORD_LIFE_SECS; … … 161 162 log_db_error("db_env_create", rc); 162 163 else { 163 164 dbenv->set_errcall(dbenv, db_errcall_fcn); 165 rc = dbenv->set_lk_detect(dbenv, DB_LOCK_YOUNGEST); 166 if (rc) 167 log_db_error("dbenv->set_lk_detect DB_LOCK_YOUNGEST, expired triplets will not be deleted", rc); 168 else 169 deadlock_detect = 1; 164 170 rc = dbenv->open(dbenv, db_home, 165 171 DB_INIT_LOCK | DB_INIT_MPOOL | DB_CREATE, 0); 166 172 if (rc) { … … 269 275 int rc; 270 276 time_t now; 271 277 unsigned int count = 0; 272 if (db == 0) 278 /* Cursor operations can hold several locks and therefore deadlock 279 so don't run expiry if deadlock detection does not work 280 http://www.oracle.com/technology/documentation/berkeley-db/db/ref/lock/notxn.html */ 281 if (db == 0 || deadlock_detect == 0) 273 282 return; 274 283 if (time(&now) == (time_t)-1) { 275 284 syslog(LOG_ERR, "time failed during run_expiry"); … … 303 312 count++; 304 313 } 305 314 } 306 if (rc != DB_NOTFOUND) 315 if (rc == DB_LOCK_DEADLOCK) 316 syslog(LOG_DEBUG, "skipping concurrent expiry avoids " 317 "deadlocks and unnecessary work"); 318 else if (rc != DB_NOTFOUND) 307 319 log_db_error("dbcp->c_get failed", rc); 308 320 if (rc = dbcp->c_close(dbcp)) 309 321 log_db_error("dbcp->c_close failed", rc);
