]>
Commit | Line | Data |
---|---|---|
684396e0 AM |
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 | |
5 | *************** | |
6 | *** 42,47 **** | |
7 | --- 42,48 ---- | |
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 *); | |
15 | *************** | |
16 | *** 178,185 **** | |
17 | --- 179,190 ---- | |
18 | fwdServerClosed(int fd, void *data) | |
19 | { | |
20 | FwdState *fwdState = data; | |
21 | + peer *p; | |
22 | debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, storeUrl(fwdState->entry)); | |
23 | assert(fwdState->server_fd == fd); | |
24 | + p = fwdStateServerPeer(fwdState); | |
25 | + if (p) | |
26 | + p->stats.conn_open--; | |
27 | fwdState->server_fd = -1; | |
28 | if (fwdCheckRetry(fwdState)) { | |
29 | int originserver = (fwdState->servers->peer == NULL); | |
30 | *************** | |
31 | *** 239,246 **** | |
32 | err->dnsserver_msg = xstrdup(dns_error_message); | |
33 | err->request = requestLink(request); | |
34 | fwdFail(fwdState, err); | |
35 | - if (fs->peer) | |
36 | - fs->peer->stats.conn_open--; | |
37 | comm_close(server_fd); | |
38 | } else if (status != COMM_OK) { | |
39 | assert(fs); | |
40 | --- 244,249 ---- | |
41 | *************** | |
42 | *** 255,264 **** | |
43 | } | |
44 | err->request = requestLink(request); | |
45 | fwdFail(fwdState, err); | |
46 | ! if (fs->peer) { | |
47 | peerConnectFailed(fs->peer); | |
48 | - fs->peer->stats.conn_open--; | |
49 | - } | |
50 | comm_close(server_fd); | |
51 | } else { | |
52 | debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry)); | |
53 | --- 258,265 ---- | |
54 | } | |
55 | err->request = requestLink(request); | |
56 | fwdFail(fwdState, err); | |
57 | ! if (fs->peer) | |
58 | peerConnectFailed(fs->peer); | |
59 | comm_close(server_fd); | |
60 | } else { | |
61 | debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry)); | |
62 | *************** | |
63 | *** 283,289 **** | |
64 | FwdState *fwdState = data; | |
65 | StoreEntry *entry = fwdState->entry; | |
66 | ErrorState *err; | |
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) { | |
71 | --- 284,289 ---- | |
72 | *************** | |
73 | *** 298,305 **** | |
74 | if (fwdState->servers->peer) | |
75 | peerConnectFailed(fwdState->servers->peer); | |
76 | } | |
77 | - if (p) | |
78 | - p->stats.conn_open--; | |
79 | comm_close(fd); | |
80 | } | |
81 | ||
82 | --- 298,303 ---- | |
83 | *************** | |
84 | *** 398,403 **** | |
85 | --- 396,403 ---- | |
86 | fwdState->n_tries++; | |
87 | if (!fs->peer) | |
88 | fwdState->origin_tries++; | |
89 | + else | |
90 | + comm_remove_close_handler(fd, fwdPeerClosed, fs->peer); | |
91 | comm_add_close_handler(fd, fwdServerClosed, fwdState); | |
92 | fwdConnectDone(fd, COMM_OK, fwdState); | |
93 | return; | |
94 | *************** | |
95 | *** 544,554 **** | |
96 | * transient (network) error; its a bug. | |
97 | */ | |
98 | fwdState->flags.dont_retry = 1; | |
99 | - /* | |
100 | - * this assertion exists because if we are connected to | |
101 | - * a peer, then we need to decrement p->stats.conn_open. | |
102 | - */ | |
103 | - assert(NULL == p); | |
104 | comm_close(fwdState->server_fd); | |
105 | break; | |
106 | } | |
107 | --- 544,549 ---- | |
108 | *************** | |
109 | *** 730,745 **** | |
110 | --- 725,754 ---- | |
111 | } | |
112 | ||
113 | /* | |
114 | + * Accounts for closed persistent connections | |
115 | + */ | |
116 | + static void | |
117 | + fwdPeerClosed(int fd, void *data) | |
118 | + { | |
119 | + peer *p = data; | |
120 | + p->stats.conn_open--; | |
121 | + } | |
122 | + | |
123 | + /* | |
124 | * Frees fwdState without closing FD or generating an abort | |
125 | */ | |
126 | void | |
127 | fwdUnregister(int fd, FwdState * fwdState) | |
128 | { | |
129 | + peer *p; | |
130 | debug(17, 3) ("fwdUnregister: %s\n", storeUrl(fwdState->entry)); | |
131 | assert(fd == fwdState->server_fd); | |
132 | assert(fd > -1); | |
133 | comm_remove_close_handler(fd, fwdServerClosed, fwdState); | |
134 | fwdState->server_fd = -1; | |
135 | + p = fwdStateServerPeer(fwdState); | |
136 | + if (p) | |
137 | + comm_add_close_handler(fd, fwdPeerClosed, p); | |
138 | } | |
139 | ||
140 | /* |