/*
- * $Id: forward.cc,v 1.117 2004/04/04 13:37:20 hno Exp $
+ * $Id: forward.cc,v 1.118 2004/04/04 13:46:49 hno Exp $
*
* DEBUG: section 17 Request Forwarding
* AUTHOR: Duane Wessels
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 *);
fwdState->server_fd = -1;
debug(17, 3) ("fwdStateFree: closing FD %d\n", sfd);
comm_close(sfd);
-
- if (p)
- p->stats.conn_open--;
}
cbdataFree(fwdState);
fwdFail(fwdState, err);
- if (fs->_peer)
- fs->_peer->stats.conn_open--;
-
comm_close(server_fd);
} else if (status != COMM_OK) {
assert(fs);
err->request = requestLink(request);
fwdFail(fwdState, err);
- if (fs->_peer) {
+ if (fs->_peer)
peerConnectFailed(fs->_peer);
- fs->_peer->stats.conn_open--;
- }
comm_close(server_fd);
} else {
FwdState *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);
peerConnectFailed(fwdState->servers->_peer);
}
- if (p)
- p->stats.conn_open--;
-
comm_close(fd);
}
* even if the connection may fail.
*/
- if (fs->_peer)
+ if (fs->_peer) {
fs->_peer->stats.conn_open++;
+ comm_add_close_handler(fd, fwdPeerClosed, fs->_peer);
+ }
comm_add_close_handler(fd, fwdServerClosed, fwdState);
* 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;
}
fwdStateFree(fwdState);
}
+/*
+ * Accounts for closed persistent connections
+ */
+static void
+fwdPeerClosed(int fd, void *data)
+{
+ peer *p = (peer *)data;
+ p->stats.conn_open--;
+}
+
/*
* Frees fwdState without closing FD or generating an abort
*/