1 Index: squid/src/forward.c
2 diff -c squid/src/forward.c:1.82.2.8 squid/src/forward.c:1.82.2.9
3 *** squid/src/forward.c:1.82.2.8 Sat Dec 13 09:48:39 2003
4 --- squid/src/forward.c Wed Dec 17 14:01:03 2003
8 static void fwdStateFree(FwdState * fwdState);
9 static PF fwdConnectTimeout;
10 static PF fwdServerClosed;
11 + static PF fwdPeerClosed;
12 static CNCB fwdConnectDone;
13 static int fwdCheckRetry(FwdState * fwdState);
14 static int fwdReforward(FwdState *);
18 fwdServerClosed(int fd, void *data)
20 FwdState *fwdState = data;
22 debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, storeUrl(fwdState->entry));
23 assert(fwdState->server_fd == fd);
24 + p = fwdStateServerPeer(fwdState);
26 + p->stats.conn_open--;
27 fwdState->server_fd = -1;
28 if (fwdCheckRetry(fwdState)) {
29 int originserver = (fwdState->servers->peer == NULL);
32 err->dnsserver_msg = xstrdup(dns_error_message);
33 err->request = requestLink(request);
34 fwdFail(fwdState, err);
36 - fs->peer->stats.conn_open--;
37 comm_close(server_fd);
38 } else if (status != COMM_OK) {
44 err->request = requestLink(request);
45 fwdFail(fwdState, err);
47 peerConnectFailed(fs->peer);
48 - fs->peer->stats.conn_open--;
50 comm_close(server_fd);
52 debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry));
55 err->request = requestLink(request);
56 fwdFail(fwdState, err);
58 peerConnectFailed(fs->peer);
59 comm_close(server_fd);
61 debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry));
64 FwdState *fwdState = data;
65 StoreEntry *entry = fwdState->entry;
67 - peer *p = fwdStateServerPeer(fwdState);
68 debug(17, 2) ("fwdConnectTimeout: FD %d: '%s'\n", fd, storeUrl(entry));
69 assert(fd == fwdState->server_fd);
70 if (entry->mem_obj->inmem_hi == 0) {
74 if (fwdState->servers->peer)
75 peerConnectFailed(fwdState->servers->peer);
78 - p->stats.conn_open--;
88 fwdState->origin_tries++;
90 + comm_remove_close_handler(fd, fwdPeerClosed, fs->peer);
91 comm_add_close_handler(fd, fwdServerClosed, fwdState);
92 fwdConnectDone(fd, COMM_OK, fwdState);
96 * transient (network) error; its a bug.
98 fwdState->flags.dont_retry = 1;
100 - * this assertion exists because if we are connected to
101 - * a peer, then we need to decrement p->stats.conn_open.
104 comm_close(fwdState->server_fd);
114 + * Accounts for closed persistent connections
117 + fwdPeerClosed(int fd, void *data)
120 + p->stats.conn_open--;
124 * Frees fwdState without closing FD or generating an abort
127 fwdUnregister(int fd, FwdState * fwdState)
130 debug(17, 3) ("fwdUnregister: %s\n", storeUrl(fwdState->entry));
131 assert(fd == fwdState->server_fd);
133 comm_remove_close_handler(fd, fwdServerClosed, fwdState);
134 fwdState->server_fd = -1;
135 + p = fwdStateServerPeer(fwdState);
137 + comm_add_close_handler(fd, fwdPeerClosed, p);