diff -Nur squid-2.6.STABLE9.orig/src/forward.c squid-2.6.STABLE9/src/forward.c --- squid-2.6.STABLE9.orig/src/forward.c 2007-01-18 22:21:01.000000000 -0200 +++ squid-2.6.STABLE9/src/forward.c 2007-01-30 16:31:56.000000000 -0200 @@ -67,6 +67,9 @@ static Logfile *logfile = NULL; #endif +static void fwdServerSetDead(FwdState * fwdState); +static void fwdServerSetAlive(FwdState * fwdState); + static peer * fwdStateServerPeer(FwdState * fwdState) { @@ -190,14 +193,16 @@ assert(fwdState->server_fd == fd); fwdState->server_fd = -1; if (EBIT_TEST(fwdState->entry->flags, ENTRY_DEFER_READ)) - storeResetDefer(fwdState->entry); + storeResetDefer(fwdState->entry); if (fwdCheckRetry(fwdState)) { - int originserver = (fwdState->servers->peer == NULL); - debug(17, 3) ("fwdServerClosed: re-forwarding (%d tries, %d secs)\n", + int originserver = (fwdState->servers->peer == NULL); + debug(17, 3) ("fwdServerClosed: re-forwarding (%d tries, %d secs)\n", fwdState->n_tries, - (int) (squid_curtime - fwdState->start)); + (int) (squid_curtime - fwdState->start)); + /* setting server dead */ + fwdServerSetDead (fwdState); if (fwdState->servers->next) { - /* use next, or cycle if origin server isn't last */ + /* use next, or cycle if origin server isn't last */ FwdServer *fs = fwdState->servers; FwdServer **T, *T2 = NULL; fwdState->servers = fs->next; @@ -878,6 +883,7 @@ if (!fwdState->request->flags.pinned) EBIT_SET(e->flags, ENTRY_FWD_HDR_WAIT); storeRegisterAbort(e, fwdAbort, fwdState); + fwdServerSetAlive(fwdState); peerSelect(r, e, fwdStartComplete, fwdState); } @@ -1132,3 +1138,35 @@ } #endif + +static void +fwdServerSetDead (FwdState * fwdState) +{ + assert (fwdState); + debug (17,3) ("fwdServerSetDead: setting %s (%s) dead\n", + fwdState->servers->peer->name, + fwdState->servers->peer->host); + fwdState->servers->peer->life.orig_weight = + fwdState->servers->peer->weight; + fwdState->servers->peer->life.death = squid_curtime; + fwdState->servers->peer->weight = 0; +} + +static void +fwdServerSetAlive (FwdState * fwdState) +{ + assert (fwdState); + /* + FwdServer **cur; + debug (17,3) ("fwdServerSetAlive: running:"); + for (*cur = fwdState->servers; *cur; cur = &(*cur)->next) { + if (((*cur)->peer->weight == 0) && + (5 < (squid_curtime - (*cur)->peer->life.death))) {*/ + debug (17,3) ("fwdServerSetAlive: setting %s (%s) alive\n", + (*cur)->peer->name, + (*cur)->peer->host); + (*cur)->peer->weight = (*cur)->peer->life.orig_weight; + } + } + */ +} diff -Nur squid-2.6.STABLE9.orig/src/structs.h squid-2.6.STABLE9/src/structs.h --- squid-2.6.STABLE9.orig/src/structs.h 2007-01-21 08:26:44.000000000 -0200 +++ squid-2.6.STABLE9/src/structs.h 2007-01-30 14:40:19.000000000 -0200 @@ -1439,6 +1439,10 @@ } options; int weight; struct { + int orig_weight; + time_t death; + } life; + struct { double avg_n_members; int n_times_counted; int n_replies_expected;