From: wessels <> Date: Tue, 19 Jan 1999 05:23:32 +0000 (+0000) Subject: sigh. Okay, this might work better. X-Git-Tag: SQUID_3_0_PRE1~2392 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e92e4e445bc84a5c4d599a1cac1f867bd148a525;p=thirdparty%2Fsquid.git sigh. Okay, this might work better. To "decouple" storeAbort calling into the server side (fwdAbort) and wreaking havoc, lets have the storeAbort callback done as an event, thus outside of comm_select loop. Hopefully this means we don't need the gross "flags.delayed_comm_close" and current_hdl_fd crap. Also, since we moved the abort callback to an event, we might end up doing a server read after the entry has been aborted, but before the event is called. Thus, the server modules need to check for ENTRY_ABORTED before reading. this commit also adds some (temp?) debugging to track open disk FDs --- diff --git a/src/comm.cc b/src/comm.cc index 94a2466857..b3aab7c316 100644 --- a/src/comm.cc +++ b/src/comm.cc @@ -1,6 +1,6 @@ /* - * $Id: comm.cc,v 1.298 1999/01/12 23:22:28 wessels Exp $ + * $Id: comm.cc,v 1.299 1999/01/18 22:23:32 wessels Exp $ * * DEBUG: section 5 Socket Functions * AUTHOR: Harvest Derived @@ -573,7 +573,6 @@ comm_close(int fd) #if USE_ASYNC_IO int doaioclose = 1; #endif - extern int current_hdl_fd; debug(5, 5) ("comm_close: FD %d\n", fd); assert(fd >= 0); assert(fd < Squid_MaxFD); @@ -582,10 +581,6 @@ comm_close(int fd) return; if (shutting_down && (!F->flags.open || F->type == FD_FILE)) return; - if (fd == current_hdl_fd) { - F->flags.delayed_comm_close = 1; - return; - } assert(F->flags.open); assert(F->type != FD_FILE); #ifdef USE_ASYNC_IO diff --git a/src/comm_select.cc b/src/comm_select.cc index 56009295af..005f9e4c59 100644 --- a/src/comm_select.cc +++ b/src/comm_select.cc @@ -1,6 +1,6 @@ /* - * $Id: comm_select.cc,v 1.28 1999/01/13 23:24:10 wessels Exp $ + * $Id: comm_select.cc,v 1.29 1999/01/18 22:23:33 wessels Exp $ * * DEBUG: section 5 Socket Functions * @@ -49,9 +49,6 @@ #define FD_MASK_BYTES sizeof(fd_mask) #define FD_MASK_BITS (FD_MASK_BYTES*NBBY) -/* GLOBAL */ -int current_hdl_fd = -1; - /* STATIC */ #if !HAVE_POLL static int examine_select(fd_set *, fd_set *); @@ -362,12 +359,9 @@ comm_poll(int msec) debug(5, 6) ("comm_poll: FD %d ready for reading\n", fd); if ((hdl = F->read_handler)) { F->read_handler = NULL; - hdl(current_hdl_fd = fd, F->read_data); - current_hdl_fd = -1; + hdl(fd, F->read_data); Counter.select_fds++; } - if (F->flags.delayed_comm_close) - comm_close(fd); if (commCheckICPIncoming) comm_poll_icp_incoming(); if (commCheckHTTPIncoming) @@ -377,12 +371,9 @@ comm_poll(int msec) debug(5, 5) ("comm_poll: FD %d ready for writing\n", fd); if ((hdl = F->write_handler)) { F->write_handler = NULL; - hdl(current_hdl_fd = fd, F->write_data); - current_hdl_fd = -1; + hdl(fd, F->write_data); Counter.select_fds++; } - if (F->flags.delayed_comm_close) - comm_close(fd); if (commCheckICPIncoming) comm_poll_icp_incoming(); if (commCheckHTTPIncoming) @@ -672,12 +663,9 @@ comm_select(int msec) hdl = F->read_handler; F->read_handler = NULL; commUpdateReadBits(fd, NULL); - hdl(current_hdl_fd = fd, F->read_data); - current_hdl_fd = -1; + hdl(fd, F->read_data); Counter.select_fds++; } - if (F->flags.delayed_comm_close) - comm_close(fd); if (commCheckICPIncoming) comm_select_icp_incoming(); if (commCheckHTTPIncoming) @@ -714,12 +702,9 @@ comm_select(int msec) hdl = F->write_handler; F->write_handler = NULL; commUpdateWriteBits(fd, NULL); - hdl(current_hdl_fd = fd, F->write_data); - current_hdl_fd = -1; + hdl(fd, F->write_data); Counter.select_fds++; } - if (F->flags.delayed_comm_close) - comm_close(fd); if (commCheckICPIncoming) comm_select_icp_incoming(); if (commCheckHTTPIncoming) diff --git a/src/fd.cc b/src/fd.cc index f4d7cb0fd6..3c7b4bb01d 100644 --- a/src/fd.cc +++ b/src/fd.cc @@ -1,6 +1,6 @@ /* - * $Id: fd.cc,v 1.30 1999/01/12 23:37:41 wessels Exp $ + * $Id: fd.cc,v 1.31 1999/01/18 22:23:34 wessels Exp $ * * DEBUG: section 51 Filedescriptor Functions * AUTHOR: Duane Wessels @@ -192,3 +192,15 @@ fdAdjustReserved(void) RESERVED_FD, new); RESERVED_FD = new; } + +void +fdTouchFL(int fd, const char *file, int line) +{ + fde *F; + if (fd < 0) + return; + F = &fd_table[fd]; + assert(F->flags.open); + F->last.file = file; + F->last.line = line; +} diff --git a/src/ftp.cc b/src/ftp.cc index 4697f0efa6..bcc5a3b1ae 100644 --- a/src/ftp.cc +++ b/src/ftp.cc @@ -1,6 +1,6 @@ /* - * $Id: ftp.cc,v 1.265 1999/01/15 00:16:19 wessels Exp $ + * $Id: ftp.cc,v 1.266 1999/01/18 22:23:35 wessels Exp $ * * DEBUG: section 9 File Transfer Protocol (FTP) * AUTHOR: Harvest Derived @@ -836,6 +836,10 @@ ftpDataRead(int fd, void *data) delay_id delay_id = delayMostBytesAllowed(mem); #endif assert(fd == ftpState->data.fd); + if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + comm_close(fd); + return; + } errno = 0; read_sz = ftpState->data.size - ftpState->data.offset; #if DELAY_POOLS diff --git a/src/gopher.cc b/src/gopher.cc index 19185975fd..d614b1df97 100644 --- a/src/gopher.cc +++ b/src/gopher.cc @@ -1,7 +1,7 @@ /* - * $Id: gopher.cc,v 1.145 1999/01/15 06:11:43 wessels Exp $ + * $Id: gopher.cc,v 1.146 1999/01/18 22:23:36 wessels Exp $ * * DEBUG: section 10 Gopher * AUTHOR: Harvest Derived @@ -600,6 +600,10 @@ gopherReadReply(int fd, void *data) #if DELAY_POOLS delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); #endif + if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + comm_close(fd); + return; + } errno = 0; buf = memAllocate(MEM_4K_BUF); read_sz = 4096 - 1; /* leave room for termination */ diff --git a/src/http.cc b/src/http.cc index 1eb591b132..b21e9bcf08 100644 --- a/src/http.cc +++ b/src/http.cc @@ -1,6 +1,6 @@ /* - * $Id: http.cc,v 1.340 1999/01/15 06:11:44 wessels Exp $ + * $Id: http.cc,v 1.341 1999/01/18 22:23:37 wessels Exp $ * * DEBUG: section 11 Hypertext Transfer Protocol (HTTP) * AUTHOR: Harvest Derived @@ -431,6 +431,10 @@ httpReadReply(int fd, void *data) #if DELAY_POOLS delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); #endif + if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + comm_close(fd); + return; + } /* check if we want to defer reading */ errno = 0; read_sz = SQUID_TCP_SO_RCVBUF; diff --git a/src/protos.h b/src/protos.h index 0cb2061cfd..96308c4318 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.303 1999/01/15 06:11:45 wessels Exp $ + * $Id: protos.h,v 1.304 1999/01/18 22:23:38 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -225,6 +225,7 @@ extern void fdFreeMemory(void); extern void fdDumpOpen(void); extern int fdNFree(void); extern void fdAdjustReserved(void); +extern void fdTouchFL(int, const char *, int); extern fileMap *file_map_create(int); extern int file_map_allocate(fileMap *, int); diff --git a/src/squid.h b/src/squid.h index af8f811e88..d679e1f18e 100644 --- a/src/squid.h +++ b/src/squid.h @@ -1,6 +1,6 @@ /* - * $Id: squid.h,v 1.183 1999/01/11 21:55:41 wessels Exp $ + * $Id: squid.h,v 1.184 1999/01/18 22:23:39 wessels Exp $ * * AUTHOR: Duane Wessels * @@ -310,6 +310,8 @@ struct rusage { #define leakFree(p) p #endif +#define fdTouch(f) fdTouchFL(f,__FILE__,__LINE__) + #if defined(_SQUID_NEXT_) && !defined(S_ISDIR) #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR)) #endif diff --git a/src/stat.cc b/src/stat.cc index 41918f479d..8d807ee085 100644 --- a/src/stat.cc +++ b/src/stat.cc @@ -1,6 +1,6 @@ /* - * $Id: stat.cc,v 1.307 1999/01/12 16:42:19 wessels Exp $ + * $Id: stat.cc,v 1.308 1999/01/18 22:23:40 wessels Exp $ * * DEBUG: section 18 Cache Manager Statistics * AUTHOR: Harvest Derived @@ -412,13 +412,15 @@ statFiledescriptors(StoreEntry * sentry) f = &fd_table[i]; if (!f->flags.open) continue; - storeAppendPrintf(sentry, "%4d %-6.6s %4d %7d %7d %-21s %s\n", + storeAppendPrintf(sentry, "%4d %-6.6s %4d %7d %7d %-21s %20s:%-5d %s\n", i, fdTypeStr[f->type], f->timeout_handler ? (int) (f->timeout - squid_curtime) / 60 : 0, f->bytes_read, f->bytes_written, fdRemoteAddr(f), + f->last.line ? f->last.file : null_string, + f->last.line, f->desc); } } diff --git a/src/store.cc b/src/store.cc index 097def9e4b..c4c6acb063 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1,6 +1,6 @@ /* - * $Id: store.cc,v 1.482 1999/01/15 06:30:10 wessels Exp $ + * $Id: store.cc,v 1.483 1999/01/18 22:23:42 wessels Exp $ * * DEBUG: section 20 Storage Manager * AUTHOR: Harvest Derived @@ -594,8 +594,6 @@ void storeAbort(StoreEntry * e) { MemObject *mem = e->mem_obj; - STABH *callback; - void *data; assert(e->store_status == STORE_PENDING); assert(mem != NULL); debug(20, 6) ("storeAbort: %s\n", storeKeyText(e->key)); @@ -614,11 +612,13 @@ storeAbort(StoreEntry * e) mem->object_sz = mem->inmem_hi; /* Notify the server side */ if (mem->abort.callback) { - callback = mem->abort.callback; - data = mem->abort.data; + eventAdd("mem->abort.callback", + mem->abort.callback, + mem->abort.data, + 0.0, + 0); mem->abort.callback = NULL; mem->abort.data = NULL; - callback(data); } /* Notify the client side */ InvokeHandlers(e); diff --git a/src/store_client.cc b/src/store_client.cc index bc569cd271..888db189a8 100644 --- a/src/store_client.cc +++ b/src/store_client.cc @@ -1,6 +1,6 @@ /* - * $Id: store_client.cc,v 1.54 1999/01/13 05:56:08 wessels Exp $ + * $Id: store_client.cc,v 1.55 1999/01/18 22:23:44 wessels Exp $ * * DEBUG: section 20 Storage Manager Client-Side Interface * AUTHOR: Duane Wessels @@ -295,6 +295,7 @@ storeClientFileOpened(int fd, void *data) callback(sc->callback_data, sc->copy_buf, -1); return; } + fdTouch(fd); sc->swapin_fd = fd; storeClientFileRead(sc); } @@ -307,6 +308,7 @@ storeClientFileRead(store_client * sc) #ifdef OPTIMISTIC_IO sc->flags.disk_io_pending = 1; #endif + fdTouch(sc->swapin_fd); if (mem->swap_hdr_sz == 0) { file_read(sc->swapin_fd, sc->copy_buf, @@ -335,6 +337,7 @@ storeClientReadBody(int fd, const char *buf, int len, int flagnotused, void *dat store_client *sc = data; MemObject *mem = sc->entry->mem_obj; STCB *callback = sc->callback; + fdTouch(fd); assert(sc->flags.disk_io_pending); sc->flags.disk_io_pending = 0; assert(sc->callback != NULL); @@ -356,6 +359,7 @@ storeClientReadHeader(int fd, const char *buf, int len, int flagnotused, void *d size_t body_sz; size_t copy_sz; tlv *tlv_list; + fdTouch(fd); assert(sc->flags.disk_io_pending); sc->flags.disk_io_pending = 0; assert(sc->callback != NULL); @@ -366,6 +370,7 @@ storeClientReadHeader(int fd, const char *buf, int len, int flagnotused, void *d callback(sc->callback_data, sc->copy_buf, len); return; } + fdTouch(fd); tlv_list = storeSwapMetaUnpack(buf, &swap_hdr_sz); if (tlv_list == NULL) { debug(20, 1) ("storeClientReadHeader: failed to unpack meta data\n"); @@ -373,6 +378,7 @@ storeClientReadHeader(int fd, const char *buf, int len, int flagnotused, void *d callback(sc->callback_data, sc->copy_buf, -1); return; } + fdTouch(fd); /* * XXX Here we should check the meta data and make sure we got * the right object. @@ -399,6 +405,7 @@ storeClientReadHeader(int fd, const char *buf, int len, int flagnotused, void *d callback(sc->callback_data, sc->copy_buf, copy_sz); return; } + fdTouch(fd); /* * we don't have what the client wants, but at least we now * know the swap header size. @@ -444,6 +451,7 @@ storeUnregister(StoreEntry * e, void *data) *S = sc->next; mem->nclients--; sc->flags.disk_io_pending = 0; + fdTouch(sc->swapin_fd); if (e->store_status == STORE_OK && e->swap_status != SWAPOUT_DONE) storeCheckSwapOut(e); if (sc->swapin_fd > -1) { diff --git a/src/store_swapin.cc b/src/store_swapin.cc index 13d5880199..3d1223b201 100644 --- a/src/store_swapin.cc +++ b/src/store_swapin.cc @@ -1,6 +1,6 @@ /* - * $Id: store_swapin.cc,v 1.14 1998/09/19 17:06:16 wessels Exp $ + * $Id: store_swapin.cc,v 1.15 1999/01/18 22:23:44 wessels Exp $ * * DEBUG: section 20 Storage Manager Swapin Functions * AUTHOR: Duane Wessels @@ -108,6 +108,7 @@ storeSwapInFileOpened(void *data, int fd, int errcode) xfree(ctrlp); return; } + fdTouch(fd); assert(mem != NULL); assert(e->mem_status == NOT_IN_MEMORY); assert(e->swap_status == SWAPOUT_WRITING || e->swap_status == SWAPOUT_DONE); diff --git a/src/store_swapout.cc b/src/store_swapout.cc index 60e3a912df..0342fdc309 100644 --- a/src/store_swapout.cc +++ b/src/store_swapout.cc @@ -1,6 +1,6 @@ /* - * $Id: store_swapout.cc,v 1.42 1999/01/12 23:37:51 wessels Exp $ + * $Id: store_swapout.cc,v 1.43 1999/01/18 22:23:45 wessels Exp $ * * DEBUG: section 20 Storage Manager Swapout Functions * AUTHOR: Duane Wessels @@ -74,6 +74,7 @@ storeSwapOutHandle(int fdnotused, int flag, size_t len, void *data) StoreEntry *e = ctrlp->e; MemObject *mem = e->mem_obj; debug(20, 3) ("storeSwapOutHandle: '%s', len=%d\n", storeKeyText(e->key), (int) len); + fdTouch(fdnotused); if (flag < 0) { debug(20, 1) ("storeSwapOutHandle: SwapOut failure (err code = %d).\n", flag); @@ -92,6 +93,7 @@ storeSwapOutHandle(int fdnotused, int flag, size_t len, void *data) storeSwapOutFileClose(e); return; } + fdTouch(fdnotused); #if USE_ASYNC_IO if (mem == NULL) { debug(20, 1) ("storeSwapOutHandle: mem == NULL : Cancelling swapout\n"); @@ -109,6 +111,7 @@ storeSwapOutHandle(int fdnotused, int flag, size_t len, void *data) storeCheckSwapOut(e); return; } + fdTouch(fdnotused); /* swapping complete */ debug(20, 5) ("storeSwapOutHandle: SwapOut complete: '%s' to %s.\n", storeUrl(e), storeSwapFullPath(e->swap_file_number, NULL)); @@ -119,6 +122,7 @@ storeSwapOutHandle(int fdnotused, int flag, size_t len, void *data) storeLog(STORE_LOG_SWAPOUT, e); storeDirSwapLog(e, SWAP_LOG_ADD); } + fdTouch(fdnotused); /* Note, we don't otherwise call storeReleaseRequest() here because * storeCheckCachable() does it for is if necessary */ storeSwapOutFileClose(e); @@ -248,6 +252,7 @@ storeCheckSwapOut(StoreEntry * e) debug(20, 3) ("storeCheckSwapOut: swapping out %d bytes from %d\n", swap_buf_len, (int) mem->swapout.queue_offset); mem->swapout.queue_offset += swap_buf_len - hdr_len; + fdTouch(mem->swapout.fd); file_write(mem->swapout.fd, -1, swap_buf, @@ -288,6 +293,7 @@ storeSwapOutFileOpened(void *data, int fd, int errcode) int swap_hdr_sz = 0; tlv *tlv_list; char *buf; + fdTouch(fd); if (fd == -2 && errcode == -2) { /* Cancelled - Clean up */ xfree(ctrlp->swapfilename); cbdataFree(ctrlp); diff --git a/src/structs.h b/src/structs.h index 1b12556ede..45a5d2cefe 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2,7 +2,7 @@ /* - * $Id: structs.h,v 1.260 1999/01/15 06:11:46 wessels Exp $ + * $Id: structs.h,v 1.261 1999/01/18 22:23:46 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -509,7 +509,6 @@ struct _fde { #ifdef OPTIMISTIC_IO unsigned int calling_io_handler:1; #endif - unsigned int delayed_comm_close:1; } flags; int bytes_read; int bytes_written; @@ -533,6 +532,10 @@ struct _fde { DEFER *defer_check; /* check if we should defer read */ void *defer_data; CommWriteStateData *rwstate; /* State data for comm_write */ + struct { + const char *file; + int line; + } last; }; struct _fileMap { diff --git a/src/wais.cc b/src/wais.cc index 5a586c5add..4b6b565b97 100644 --- a/src/wais.cc +++ b/src/wais.cc @@ -1,6 +1,6 @@ /* - * $Id: wais.cc,v 1.127 1999/01/15 06:11:47 wessels Exp $ + * $Id: wais.cc,v 1.128 1999/01/18 22:23:48 wessels Exp $ * * DEBUG: section 24 WAIS Relay * AUTHOR: Harvest Derived @@ -91,6 +91,10 @@ waisReadReply(int fd, void *data) #if DELAY_POOLS delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); #endif + if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + comm_close(fd); + return; + } errno = 0; read_sz = 4096; #if DELAY_POOLS