bdb_begin_transaction(); // create our own for this operation.
}
- ret = bdb_table[cdb]->put(bdb_table[cdb], // db
- TSD->tid, // transaction ID
- &dkey, // key
- &ddata, // data
- 0 // flags
- );
-
- if (ret) {
- syslog(LOG_ERR, "bdb: bdb_store(%02x): %s", cdb, db_strerror(ret));
- bdb_abort();
- }
+ do {
+ ret = bdb_table[cdb]->put(bdb_table[cdb], // db
+ TSD->tid, // transaction ID
+ &dkey, // key
+ &ddata, // data
+ 0 // flags
+ );
+ if ((ret != 0) && (ret != DB_LOCK_DEADLOCK)) {
+ syslog(LOG_ERR, "bdb: bdb_store(%02x): error %d: %s", cdb, ret, db_strerror(ret));
+ bdb_abort();
+ }
+ if (ret == DB_LOCK_DEADLOCK) {
+ syslog(LOG_DEBUG, "bdb: bdb_store(%02x): would deadlock, trying again", cdb);
+ }
+ } while (ret == DB_LOCK_DEADLOCK);
if (!existing_txn) {
bdb_end_transaction();
dkey.data = (void *) key;
TSD->dbdata[cdb].flags = DB_DBT_REALLOC;
- ret = bdb_table[cdb]->get(bdb_table[cdb], TSD->tid, &dkey, &TSD->dbdata[cdb], 0);
- if ((ret != 0) && (ret != DB_NOTFOUND)) {
- syslog(LOG_ERR, "bdb: bdb_fetch(%d): %s", cdb, db_strerror(ret));
- bdb_abort();
- }
+ do {
+ ret = bdb_table[cdb]->get(bdb_table[cdb], TSD->tid, &dkey, &TSD->dbdata[cdb], 0);
+ if ((ret != 0) && (ret != DB_NOTFOUND) && (ret != DB_LOCK_DEADLOCK)) {
+ syslog(LOG_ERR, "bdb: bdb_fetch(%d): error %d: %s", cdb, ret, db_strerror(ret));
+ bdb_abort();
+ }
+ } while (ret == DB_LOCK_DEADLOCK);
if (ret == 0) {
bdb_decompress_if_necessary(&TSD->dbdata[cdb]);
}
}
-
// Calling this function activates the Berkeley DB back end.
void bdb_init_backend(void) {
);
if (array_len(tokens_in_this_message) > 0) {
+ begin_critical_section(S_INDEXER);
cdb_begin_transaction();
for (i=0; i<array_len(tokens_in_this_message); ++i) {
memcpy(newbucket, cdb_bucket.ptr, cdb_bucket.len);
for (j=0; j<nmsgs; ++j) {
if ((newbucket[j] == msgnum) || (newbucket[j] == 0)) {
- fprintf(stderr, "removing %ld\n", newbucket[j]);
memcpy(&newbucket[j], &newbucket[j+1], ((nmsgs-j)*sizeof(long)));
--j;
--nmsgs;
if (server_shutting_down) break;
}
cdb_end_transaction();
+ end_critical_section(S_INDEXER);
CtdlSetConfigLong("MMfulltext", msgnum);
}
array_free(tokens_in_this_message);