Tue Jan 15 16:23:44 CET 2008 kaplan+greyfix@kim-minh.com
* BUGFIX detect deadlocks during run_expiry.
Closes ticket #8 <URL:http://trac.kim-minh.com/greyfix/ticket/8>
diff -rN -u old-greyfix/greyfix.c new-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); |