diff -ur --exclude CVS globus_rls_server-4.9/server.c globus-rls-server-B5.0/server.c --- globus_rls_server-4.9/server.c 2009-11-13 19:17:29.000000000 +0100 +++ globus-rls-server-B5.0/server.c 2012-01-27 01:02:01.000000000 +0100 @@ -166,6 +166,7 @@ static int listresult(void *cv, char *s1, char *s2, char *s3, char *s4, int irc); static int getreslimit(char *areslimit); +static void bfresize(DBH *dbh); METHOD methods[] = { { "admin", rls_admin, 1, 0, 0 }, @@ -207,7 +208,7 @@ { "lrc_rli_get_part", lrc_rli_get_part, 2, P_LRCREAD, MF_NEEDLRC }, { "lrc_rli_info", lrc_rli_info, 1, P_LRCREAD, MF_NEEDLRC }, { "lrc_rli_list", lrc_rli_list, 0, P_LRCREAD, MF_NEEDLRC }, - { "rli_exists", rli_exists, 2, P_RLIREAD, MF_NEEDLRC }, + { "rli_exists", rli_exists, 2, P_RLIREAD, MF_NEEDRLI }, { "rli_exists_bulk", rli_exists_bulk, 0, P_RLIREAD, MF_NEEDRLI }, { "rli_get_lrc", rli_get_lrc, 3, P_RLIREAD, MF_NEEDRLI }, { "rli_get_lrc_bulk", rli_get_lrc_bulk, 0, P_RLIREAD, MF_NEEDRLI }, @@ -1885,7 +1886,7 @@ c->errmsg)) != GLOBUS_RLS_SUCCESS) { rrpc_error(c, rc, "%s", c->errmsg); return; - } else if (rc == GLOBUS_RLS_SUCCESS) { + } else { if (bloomfilter.bfsize) { globus_mutex_lock(&bloomfilter.mtx); bf_addlfn(&bloomfilter, arglist[0]); @@ -1894,21 +1895,11 @@ } rrpc_success(c); - if (update_immediate) - doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, arglist[0], NULL); - /* - * If we're using bloom filters to update, and the number of lfns has - * doubled in the db, then resize the bloom filter. - */ - if (bloomfilter.bfsize && - (table[T_LRCLFN].count >= bloomfilter.startlfns * 2) && - (table[T_LRCLFN].count * lrc_bloomfilter_ratio > bloomfilter.bfsize)) { - if (loglevel) - logit(LOG_DEBUG, "lrc_create: Resizing bloom filter, current %d new %d", - bloomfilter.bfsize, table[T_LRCLFN].count * lrc_bloomfilter_ratio); - bf_free(&bloomfilter); - bloomfilter.startlfns = table[T_LRCLFN].count; - lrc_getbf(dbh->lrc); + if (rc == GLOBUS_RLS_SUCCESS) { + if (update_immediate) + doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, arglist[0], NULL); + + bfresize(dbh); } } @@ -1935,10 +1926,21 @@ } if ((rc = db_lrc_create(dbh->lrc,lfn,pfn,c->errmsg)) != GLOBUS_RLS_SUCCESS) listresult(c, lfn, pfn, NULL, NULL, rc); - else if (update_immediate) - doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, lfn, NULL); + else { + if (bloomfilter.bfsize) { + globus_mutex_lock(&bloomfilter.mtx); + bf_addlfn(&bloomfilter, lfn); + globus_mutex_unlock(&bloomfilter.mtx); + } + if (update_immediate) + doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, lfn, NULL); + } } endstrcb(c, 0); + + /* Resize bf, if needed */ + bfresize(dbh); + if (loglevel > 1) logit(LOG_DEBUG, "lrc_create_bulk: end"); } @@ -1948,7 +1950,7 @@ { int rc; - int lfndeleted; + int lfndeleted = 0; if (!arglist[0] || !arglist[1]) { rrpc_error(c, GLOBUS_RLS_BADARG, ""); @@ -1958,7 +1960,7 @@ &lfndeleted, c->errmsg)) != GLOBUS_RLS_SUCCESS) { rrpc_error(c, rc, "%s", c->errmsg); return; - } else if (lfndeleted && rc == GLOBUS_RLS_SUCCESS) { + } else if (lfndeleted) { if (bloomfilter.bfsize) { globus_mutex_lock(&bloomfilter.mtx); bf_deletelfn(&bloomfilter, arglist[0]); @@ -1978,7 +1980,7 @@ int rc; char lfn[BUFLEN]; char pfn[BUFLEN]; - int lfndeleted; + int lfndeleted = 0; if (loglevel > 1) logit(LOG_DEBUG, "lrc_delete_bulk:"); @@ -1996,8 +1998,15 @@ if ((rc = db_lrc_delete(dbh->lrc, lfn, pfn, &lfndeleted, c->errmsg)) != GLOBUS_RLS_SUCCESS) listresult(c, lfn, pfn, NULL, NULL, rc); - else if (update_immediate && lfndeleted) - doimmediate(rliop_delete, lrc_rlilist, &lrc_rlilistlock, lfn, NULL); + else if (lfndeleted) { + if (bloomfilter.bfsize) { + globus_mutex_lock(&bloomfilter.mtx); + bf_deletelfn(&bloomfilter, lfn); + globus_mutex_unlock(&bloomfilter.mtx); + } + if (update_immediate) + doimmediate(rliop_delete, lrc_rlilist, &lrc_rlilistlock, lfn, NULL); + } } endstrcb(c, 0); if (loglevel > 1) @@ -2298,10 +2307,18 @@ } if ((rc = db_lrc_renamelfn(dbh->lrc,oldname,newname,c->errmsg)) != GLOBUS_RLS_SUCCESS) listresult(c, oldname, newname, NULL, NULL, rc); - else if (update_immediate) { - doimmediate(rliop_delete, lrc_rlilist, &lrc_rlilistlock, oldname, NULL); - doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, newname, NULL); - } + else { + if (bloomfilter.bfsize) { + globus_mutex_lock(&bloomfilter.mtx); + bf_deletelfn(&bloomfilter, oldname); + bf_addlfn(&bloomfilter, newname); + globus_mutex_unlock(&bloomfilter.mtx); + } + if (update_immediate) { + doimmediate(rliop_delete, lrc_rlilist, &lrc_rlilistlock, oldname, NULL); + doimmediate(rliop_add, lrc_rlilist, &lrc_rlilistlock, newname, NULL); + } + } } endstrcb(c, 0); if (loglevel > 1) @@ -2527,8 +2544,10 @@ break; } rls_lock_release(&senderlistlock, readlock); - if (!sender) + if (!sender) { rrpc_error(c, nferr, "%s", arglist[0]); + return; + } } else { if ((rc = db_exists(dbh->rli, arglist[0], objtype, c->errmsg)) != GLOBUS_RLS_SUCCESS) { @@ -3513,6 +3532,26 @@ } /* + * If we're using bloom filters to update, and the number of lfns has + * doubled in the db, then resize the bloom filter. + */ +static void +bfresize(DBH *dbh) +{ + if (bloomfilter.bfsize && + (table[T_LRCLFN].count >= bloomfilter.startlfns * 2) && + (table[T_LRCLFN].count * lrc_bloomfilter_ratio > bloomfilter.bfsize)) { + if (loglevel) + logit(LOG_DEBUG, "bfresize: Resizing bloom filter, current %d new %d", + bloomfilter.bfsize, table[T_LRCLFN].count * lrc_bloomfilter_ratio); + bf_free(&bloomfilter); + bloomfilter.startlfns = table[T_LRCLFN].count; + lrc_getbf(dbh->lrc); + } + return; +} + +/* * Start up thread to process requests. */ static int