Index: squid/src/forward.c diff -c squid/src/forward.c:1.82.2.8 squid/src/forward.c:1.82.2.9 *** squid/src/forward.c:1.82.2.8 Sat Dec 13 09:48:39 2003 --- squid/src/forward.c Wed Dec 17 14:01:03 2003 *************** *** 42,47 **** --- 42,48 ---- static void fwdStateFree(FwdState * fwdState); static PF fwdConnectTimeout; static PF fwdServerClosed; + static PF fwdPeerClosed; static CNCB fwdConnectDone; static int fwdCheckRetry(FwdState * fwdState); static int fwdReforward(FwdState *); *************** *** 178,185 **** --- 179,190 ---- fwdServerClosed(int fd, void *data) { FwdState *fwdState = data; + peer *p; debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, storeUrl(fwdState->entry)); assert(fwdState->server_fd == fd); + p = fwdStateServerPeer(fwdState); + if (p) + p->stats.conn_open--; fwdState->server_fd = -1; if (fwdCheckRetry(fwdState)) { int originserver = (fwdState->servers->peer == NULL); *************** *** 239,246 **** err->dnsserver_msg = xstrdup(dns_error_message); err->request = requestLink(request); fwdFail(fwdState, err); - if (fs->peer) - fs->peer->stats.conn_open--; comm_close(server_fd); } else if (status != COMM_OK) { assert(fs); --- 244,249 ---- *************** *** 255,264 **** } err->request = requestLink(request); fwdFail(fwdState, err); ! if (fs->peer) { peerConnectFailed(fs->peer); - fs->peer->stats.conn_open--; - } comm_close(server_fd); } else { debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry)); --- 258,265 ---- } err->request = requestLink(request); fwdFail(fwdState, err); ! if (fs->peer) peerConnectFailed(fs->peer); comm_close(server_fd); } else { debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry)); *************** *** 283,289 **** FwdState *fwdState = data; StoreEntry *entry = fwdState->entry; ErrorState *err; - peer *p = fwdStateServerPeer(fwdState); debug(17, 2) ("fwdConnectTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); assert(fd == fwdState->server_fd); if (entry->mem_obj->inmem_hi == 0) { --- 284,289 ---- *************** *** 298,305 **** if (fwdState->servers->peer) peerConnectFailed(fwdState->servers->peer); } - if (p) - p->stats.conn_open--; comm_close(fd); } --- 298,303 ---- *************** *** 398,403 **** --- 396,403 ---- fwdState->n_tries++; if (!fs->peer) fwdState->origin_tries++; + else + comm_remove_close_handler(fd, fwdPeerClosed, fs->peer); comm_add_close_handler(fd, fwdServerClosed, fwdState); fwdConnectDone(fd, COMM_OK, fwdState); return; *************** *** 544,554 **** * transient (network) error; its a bug. */ fwdState->flags.dont_retry = 1; - /* - * this assertion exists because if we are connected to - * a peer, then we need to decrement p->stats.conn_open. - */ - assert(NULL == p); comm_close(fwdState->server_fd); break; } --- 544,549 ---- *************** *** 730,745 **** --- 725,754 ---- } /* + * Accounts for closed persistent connections + */ + static void + fwdPeerClosed(int fd, void *data) + { + peer *p = data; + p->stats.conn_open--; + } + + /* * Frees fwdState without closing FD or generating an abort */ void fwdUnregister(int fd, FwdState * fwdState) { + peer *p; debug(17, 3) ("fwdUnregister: %s\n", storeUrl(fwdState->entry)); assert(fd == fwdState->server_fd); assert(fd > -1); comm_remove_close_handler(fd, fwdServerClosed, fwdState); fwdState->server_fd = -1; + p = fwdStateServerPeer(fwdState); + if (p) + comm_add_close_handler(fd, fwdPeerClosed, p); } /*