# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20120804121157-bb7qyx7czd4v1pnk # target_branch: ../trunk # testament_sha1: 9f17a91599d4c0b0f1ec41d685bc384582a958de # timestamp: 2012-08-04 14:19:02 +0200 # base_revision_id: squidadm@squid-cache.org-20120802001245-\ # wsbtuuvv3tq8ee06 # # Begin patch === modified file 'src/ClientDelayConfig.cc' --- src/ClientDelayConfig.cc 2012-07-20 15:31:04 +0000 +++ src/ClientDelayConfig.cc 2012-08-02 21:18:43 +0000 @@ -46,7 +46,7 @@ void ClientDelayConfig::parsePoolCount() { if (pools.size()) { - debugs(3, 0, "parse_client_delay_pool_count: multiple client_delay_pools lines, aborting all previous client_delay_pools config"); + debugs(3, DBG_CRITICAL, "parse_client_delay_pool_count: multiple client_delay_pools lines, aborting all previous client_delay_pools config"); clean(); } unsigned short pools_; @@ -62,7 +62,7 @@ ConfigParser::ParseUShort(&pool); if (pool < 1 || pool > pools.size()) { - debugs(3, 0, "parse_client_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << pools.size()); + debugs(3, DBG_CRITICAL, "parse_client_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << pools.size()); return; } @@ -79,7 +79,7 @@ ConfigParser::ParseUShort(&pool); if (pool < 1 || pool > pools.size()) { - debugs(3, 0, "parse_client_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << pools.size()); + debugs(3, DBG_CRITICAL, "parse_client_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << pools.size()); return; } === modified file 'src/ConfigParser.cc' --- src/ConfigParser.cc 2012-07-23 07:02:06 +0000 +++ src/ConfigParser.cc 2012-08-02 21:18:43 +0000 @@ -71,7 +71,7 @@ *t = '\0'; if ((wordFile = fopen(fn, "r")) == NULL) { - debugs(28, 0, "strtokFile: " << fn << " not found"); + debugs(28, DBG_CRITICAL, "strtokFile: " << fn << " not found"); return (NULL); } === modified file 'src/DelayConfig.cc' --- src/DelayConfig.cc 2012-07-20 15:31:04 +0000 +++ src/DelayConfig.cc 2012-08-02 21:18:43 +0000 @@ -65,7 +65,7 @@ ConfigParser::ParseUShort(&pool); if (pool < 1 || pool > DelayPools::pools()) { - debugs(3, 0, "parse_delay_pool_class: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); + debugs(3, DBG_CRITICAL, "parse_delay_pool_class: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); return; } @@ -73,7 +73,7 @@ ConfigParser::ParseUShort(&delay_class_); if (delay_class_ < 1 || delay_class_ > 5) { - debugs(3, 0, "parse_delay_pool_class: Ignoring pool " << pool << " class " << delay_class_ << " not in 1 .. 5"); + debugs(3, DBG_CRITICAL, "parse_delay_pool_class: Ignoring pool " << pool << " class " << delay_class_ << " not in 1 .. 5"); return; } @@ -89,14 +89,14 @@ ConfigParser::ParseUShort(&pool); if (pool < 1 || pool > DelayPools::pools()) { - debugs(3, 0, "parse_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); + debugs(3, DBG_CRITICAL, "parse_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); return; } --pool; if (!DelayPools::delay_data[pool].theComposite().getRaw()) { - debugs(3, 0, "parse_delay_pool_rates: Ignoring pool " << pool + 1 << " attempt to set rates with class not set"); + debugs(3, DBG_CRITICAL, "parse_delay_pool_rates: Ignoring pool " << pool + 1 << " attempt to set rates with class not set"); return; } @@ -111,7 +111,7 @@ ConfigParser::ParseUShort(&pool); if (pool < 1 || pool > DelayPools::pools()) { - debugs(3, 0, "parse_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); + debugs(3, DBG_CRITICAL, "parse_delay_pool_rates: Ignoring pool " << pool << " not in 1 .. " << DelayPools::pools()); return; } === modified file 'src/DiskIO/AIO/AIODiskFile.cc' --- src/DiskIO/AIO/AIODiskFile.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/AIO/AIODiskFile.cc 2012-08-02 21:10:18 +0000 @@ -127,7 +127,7 @@ if (slot < 0) { /* No free slot? Callback error, and return */ fatal("Aiee! out of aiocb slots! - FIXME and wrap file_read\n"); - debugs(79, 1, "WARNING: out of aiocb slots!"); + debugs(79, DBG_IMPORTANT, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ // file_read(fd, request->buf, request->len, request->offset, callback, data); return; @@ -164,7 +164,7 @@ /* Initiate aio */ if (aio_read(&qe->aq_e_aiocb) < 0) { fatalf("Aiee! aio_read() returned error (%d) FIXME and wrap file_read !\n", errno); - debugs(79, 1, "WARNING: aio_read() returned error: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "WARNING: aio_read() returned error: " << xstrerror()); /* fall back to blocking method */ // file_read(fd, request->buf, request->len, request->offset, callback, data); } @@ -185,7 +185,7 @@ if (slot < 0) { /* No free slot? Callback error, and return */ fatal("Aiee! out of aiocb slots FIXME and wrap file_write !\n"); - debugs(79, 1, "WARNING: out of aiocb slots!"); + debugs(79, DBG_IMPORTANT, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ // file_write(fd, offset, buf, len, callback, data, freefunc); return; @@ -222,7 +222,7 @@ /* Initiate aio */ if (aio_write(&qe->aq_e_aiocb) < 0) { fatalf("Aiee! aio_write() returned error (%d) FIXME and wrap file_write !\n", errno); - debugs(79, 1, "WARNING: aio_write() returned error: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "WARNING: aio_write() returned error: " << xstrerror()); /* fall back to blocking method */ // file_write(fd, offset, buf, len, callback, data, freefunc); } === modified file 'src/DiskIO/AIO/AIODiskFile.h' --- src/DiskIO/AIO/AIODiskFile.h 2010-11-21 04:40:05 +0000 +++ src/DiskIO/AIO/AIODiskFile.h 2012-08-04 12:11:57 +0000 @@ -71,7 +71,6 @@ virtual bool ioInProgress() const; private: - CBDATA_CLASS(AIODiskFile); void error(bool const &); int fd; String path; @@ -79,6 +78,7 @@ RefCount ioRequestor; bool closed; bool error_; + CBDATA_CLASS(AIODiskFile); }; #endif /* USE_DISKIO_AIO */ === modified file 'src/DiskIO/AIO/aio_win32.cc' --- src/DiskIO/AIO/aio_win32.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/AIO/aio_win32.cc 2012-08-02 21:10:18 +0000 @@ -100,7 +100,7 @@ /* Test to see if the I/O was queued successfully. */ if (!IoOperationStatus) { errno = GetLastError(); - debugs(81,1, "aio_read: GetLastError=" << errno ); + debugs(81, DBG_IMPORTANT, "aio_read: GetLastError=" << errno ); return -1; } @@ -152,7 +152,7 @@ /* Test to see if the I/O was queued successfully. */ if (!IoOperationStatus) { errno = GetLastError(); - debugs(81, 1, "aio_read: GetLastError=" << errno ); + debugs(81, DBG_IMPORTANT, "aio_read: GetLastError=" << errno ); return -1; } @@ -212,7 +212,7 @@ /* Test to see if the I/O was queued successfully. */ if (!IoOperationStatus) { errno = GetLastError(); - debugs(81, 1, "aio_write: GetLastError=" << errno ); + debugs(81, DBG_IMPORTANT, "aio_write: GetLastError=" << errno ); return -1; } @@ -264,7 +264,7 @@ /* Test to see if the I/O was queued successfully. */ if (!IoOperationStatus) { errno = GetLastError(); - debugs(81, 1, "aio_write: GetLastError=" << errno ); + debugs(81, DBG_IMPORTANT, "aio_write: GetLastError=" << errno ); return -1; } === modified file 'src/DiskIO/Blocking/BlockingFile.cc' --- src/DiskIO/Blocking/BlockingFile.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/Blocking/BlockingFile.cc 2012-08-02 21:18:43 +0000 @@ -223,7 +223,7 @@ writeRequest = NULL; if (errflag) { - debugs(79, 0, "storeUfsWriteDone: got failure (" << errflag << ")"); + debugs(79, DBG_CRITICAL, "storeUfsWriteDone: got failure (" << errflag << ")"); doClose(); ioRequestor->writeCompleted (DISK_ERROR,0, result); return; === modified file 'src/DiskIO/Blocking/BlockingFile.h' --- src/DiskIO/Blocking/BlockingFile.h 2009-01-21 03:47:47 +0000 +++ src/DiskIO/Blocking/BlockingFile.h 2012-08-04 12:11:57 +0000 @@ -62,7 +62,6 @@ private: static DRCB ReadDone; static DWCB WriteDone; - CBDATA_CLASS(BlockingFile); int fd; bool closed; void error (bool const &); @@ -74,6 +73,7 @@ void doClose(); void readDone(int fd, const char *buf, int len, int errflag); void writeDone(int fd, int errflag, size_t len); + CBDATA_CLASS(BlockingFile); }; #endif /* SQUID_BLOCKINGFILE_H */ === modified file 'src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc' --- src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc 2012-01-20 18:55:04 +0000 +++ src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc 2012-08-02 21:10:18 +0000 @@ -67,7 +67,7 @@ * the debug log is configured and we'll get the message on * stderr when doing things like 'squid -k reconfigure' */ - debugs(47, 1, "diskd started"); + debugs(47, DBG_IMPORTANT, "diskd started"); #endif initialised = true; === modified file 'src/DiskIO/DiskDaemon/DiskdFile.cc' --- src/DiskIO/DiskDaemon/DiskdFile.cc 2012-07-23 15:15:27 +0000 +++ src/DiskIO/DiskDaemon/DiskdFile.cc 2012-08-02 21:10:18 +0000 @@ -140,7 +140,7 @@ ioCompleted(); errorOccured = true; // IO->shm.put (shm_offset); - debugs(79, 1, "storeDiskdSend CREATE: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend CREATE: " << xstrerror()); notifyClient(); ioRequestor = NULL; return; @@ -169,7 +169,7 @@ ioCompleted(); errorOccured = true; // IO->shm.put (shm_offset); - debugs(79, 1, "storeDiskdSend READ: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend READ: " << xstrerror()); notifyClient(); ioRequestor = NULL; return; @@ -195,7 +195,7 @@ if (x < 0) { ioCompleted(); errorOccured = true; - debugs(79, 1, "storeDiskdSend CLOSE: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend CLOSE: " << xstrerror()); notifyClient(); ioRequestor = NULL; return; @@ -332,7 +332,7 @@ if (x < 0) { ioCompleted(); errorOccured = true; - debugs(79, 1, "storeDiskdSend WRITE: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend WRITE: " << xstrerror()); // IO->shm.put (shm_offset); notifyClient(); ioRequestor = NULL; === modified file 'src/DiskIO/DiskDaemon/DiskdFile.h' --- src/DiskIO/DiskDaemon/DiskdFile.h 2009-01-21 03:47:47 +0000 +++ src/DiskIO/DiskDaemon/DiskdFile.h 2012-08-04 12:11:57 +0000 @@ -74,7 +74,6 @@ bool errorOccured; DiskdIOStrategy *IO; RefCount ioRequestor; - CBDATA_CLASS(DiskdFile); void openDone(diomsg *); void createDone (diomsg *); void readDone (diomsg *); @@ -86,6 +85,7 @@ void ioAway(); void ioCompleted(); size_t inProgressIOs; + CBDATA_CLASS(DiskdFile); }; #endif === modified file 'src/DiskIO/DiskDaemon/DiskdIOStrategy.cc' --- src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-08-02 21:18:43 +0000 @@ -146,7 +146,7 @@ shm_offset); if (x < 0) { - debugs(79, 1, "storeDiskdSend UNLINK: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend UNLINK: " << xstrerror()); ::unlink(buf); /* XXX EWW! */ // shm.put (shm_offset); } @@ -172,14 +172,14 @@ smsgid = msgget((key_t) ikey, 0700 | IPC_CREAT); if (smsgid < 0) { - debugs(50, 0, "storeDiskdInit: msgget: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeDiskdInit: msgget: " << xstrerror()); fatal("msgget failed"); } rmsgid = msgget((key_t) (ikey + 1), 0700 | IPC_CREAT); if (rmsgid < 0) { - debugs(50, 0, "storeDiskdInit: msgget: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeDiskdInit: msgget: " << xstrerror()); fatal("msgget failed"); } @@ -270,14 +270,14 @@ nbufs * SHMBUF_BLKSZ, 0600 | IPC_CREAT); if (id < 0) { - debugs(50, 0, "storeDiskdInit: shmget: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeDiskdInit: shmget: " << xstrerror()); fatal("shmget failed"); } buf = (char *)shmat(id, NULL, 0); if (buf == (void *) -1) { - debugs(50, 0, "storeDiskdInit: shmat: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeDiskdInit: shmat: " << xstrerror()); fatal("shmat failed"); } @@ -393,7 +393,7 @@ M->seq_no = ++seq_no; if (M->seq_no < last_seq_no) - debugs(79, 1, "WARNING: sequencing out of order"); + debugs(79, DBG_IMPORTANT, "WARNING: sequencing out of order"); x = msgsnd(smsgid, M, diomsg::msg_snd_rcv_sz, IPC_NOWAIT); @@ -403,7 +403,7 @@ ++diskd_stats.sent_count; ++away; } else { - debugs(79, 1, "storeDiskdSend: msgsnd: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeDiskdSend: msgsnd: " << xstrerror()); cbdataReferenceDone(M->callback_data); assert(++send_errors < 100); if (shm_offset > -1) @@ -466,13 +466,13 @@ * will cause an assertion in storeDiskdShmGet(). */ /* TODO: have DiskdIO hold a link to the swapdir, to allow detailed reporting again */ - debugs(3, 1, "WARNING: cannot increase cache_dir Q1 value while Squid is running."); + debugs(3, DBG_IMPORTANT, "WARNING: cannot increase cache_dir Q1 value while Squid is running."); magic1 = old_magic1; return true; } if (old_magic1 != magic1) - debugs(3, 1, "cache_dir new Q1 value '" << magic1 << "'"); + debugs(3, DBG_IMPORTANT, "cache_dir new Q1 value '" << magic1 << "'"); return true; } @@ -498,13 +498,13 @@ if (old_magic2 < magic2) { /* See comments in Q1 function above */ - debugs(3, 1, "WARNING: cannot increase cache_dir Q2 value while Squid is running."); + debugs(3, DBG_IMPORTANT, "WARNING: cannot increase cache_dir Q2 value while Squid is running."); magic2 = old_magic2; return true; } if (old_magic2 != magic2) - debugs(3, 1, "cache_dir new Q2 value '" << magic2 << "'"); + debugs(3, DBG_IMPORTANT, "cache_dir new Q2 value '" << magic2 << "'"); return true; } @@ -526,7 +526,7 @@ while (away > 0) { if (squid_curtime > lastmsg) { - debugs(47, 1, "storeDiskdDirSync: " << away << " messages away"); + debugs(47, DBG_IMPORTANT, "storeDiskdDirSync: " << away << " messages away"); lastmsg = squid_curtime; } @@ -570,7 +570,7 @@ if (x < 0) break; else if (x != diomsg::msg_snd_rcv_sz) { - debugs(47, 1, "storeDiskdDirCallback: msgget returns " << x); + debugs(47, DBG_IMPORTANT, "storeDiskdDirCallback: msgget returns " << x); break; } === modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskFile.cc' --- src/DiskIO/DiskThreads/DiskThreadsDiskFile.cc 2012-07-20 15:31:04 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsDiskFile.cc 2012-08-02 21:18:43 +0000 @@ -185,8 +185,8 @@ if (errflag || fd < 0) { errno = errflag; - debugs(79, 0, "DiskThreadsDiskFile::openDone: " << xstrerror()); - debugs(79, 1, "\t" << path_); + debugs(79, DBG_CRITICAL, "DiskThreadsDiskFile::openDone: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "\t" << path_); errorOccured = true; } else { ++store_open_disk_fd; @@ -231,7 +231,7 @@ ioRequestor->closeCompleted(); return; } else { - debugs(79,0,HERE << "DiskThreadsDiskFile::close: " << + debugs(79, DBG_CRITICAL, HERE << "DiskThreadsDiskFile::close: " << "did NOT close because ioInProgress() is true. now what?"); } } === modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskFile.h' --- src/DiskIO/DiskThreads/DiskThreadsDiskFile.h 2009-01-21 03:47:47 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsDiskFile.h 2012-08-04 12:11:57 +0000 @@ -83,11 +83,12 @@ static AIOCB OpenDone; void openDone(int fd, const char *buf, int aio_return, int aio_errno); RefCount ioRequestor; - CBDATA_CLASS(DiskThreadsDiskFile); void doClose(); void readDone(int fd, const char *buf, int len, int errflag, RefCount request); void writeDone(int fd, int errflag, size_t len, RefCount request); +private: + CBDATA_CLASS(DiskThreadsDiskFile); }; #include "DiskIO/ReadRequest.h" === modified file 'src/DiskIO/DiskThreads/aiops.cc' --- src/DiskIO/DiskThreads/aiops.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/DiskThreads/aiops.cc 2012-08-02 21:18:43 +0000 @@ -527,7 +527,7 @@ if (++filter >= filter_limit) { filter_limit += filter; filter = 0; - debugs(43, 1, "squidaio_queue_request: WARNING - Queue congestion"); + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: WARNING - Queue congestion"); } } @@ -550,10 +550,10 @@ if (squid_curtime >= (last_warn + 15) && squid_curtime >= (high_start + 5)) { - debugs(43, 1, "squidaio_queue_request: WARNING - Disk I/O overloading"); + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: WARNING - Disk I/O overloading"); if (squid_curtime >= (high_start + 15)) - debugs(43, 1, "squidaio_queue_request: Queue Length: current=" << + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: Queue Length: current=" << request_queue_len << ", high=" << queue_high << ", low=" << queue_low << ", duration=" << (long int) (squid_curtime - high_start)); @@ -566,10 +566,10 @@ /* Warn if seriously overloaded */ if (request_queue_len > RIDICULOUS_LENGTH) { - debugs(43, 0, "squidaio_queue_request: Async request queue growing uncontrollably!"); - debugs(43, 0, "squidaio_queue_request: Syncing pending I/O operations.. (blocking)"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Async request queue growing uncontrollably!"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Syncing pending I/O operations.. (blocking)"); squidaio_sync(); - debugs(43, 0, "squidaio_queue_request: Synced"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Synced"); } } /* squidaio_queue_request */ === modified file 'src/DiskIO/DiskThreads/aiops_win32.cc' --- src/DiskIO/DiskThreads/aiops_win32.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/DiskThreads/aiops_win32.cc 2012-08-02 21:18:43 +0000 @@ -612,7 +612,7 @@ if (++filter >= filter_limit) { filter_limit += filter; filter = 0; - debugs(43, 1, "squidaio_queue_request: WARNING - Queue congestion"); + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: WARNING - Queue congestion"); } } @@ -635,10 +635,10 @@ if (squid_curtime >= (last_warn + 15) && squid_curtime >= (high_start + 5)) { - debugs(43, 1, "squidaio_queue_request: WARNING - Disk I/O overloading"); + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: WARNING - Disk I/O overloading"); if (squid_curtime >= (high_start + 15)) - debugs(43, 1, "squidaio_queue_request: Queue Length: current=" << + debugs(43, DBG_IMPORTANT, "squidaio_queue_request: Queue Length: current=" << request_queue_len << ", high=" << queue_high << ", low=" << queue_low << ", duration=" << (long int) (squid_curtime - high_start)); @@ -651,10 +651,10 @@ /* Warn if seriously overloaded */ if (request_queue_len > RIDICULOUS_LENGTH) { - debugs(43, 0, "squidaio_queue_request: Async request queue growing uncontrollably!"); - debugs(43, 0, "squidaio_queue_request: Syncing pending I/O operations.. (blocking)"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Async request queue growing uncontrollably!"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Syncing pending I/O operations.. (blocking)"); squidaio_sync(); - debugs(43, 0, "squidaio_queue_request: Synced"); + debugs(43, DBG_CRITICAL, "squidaio_queue_request: Synced"); } } /* squidaio_queue_request */ @@ -893,7 +893,7 @@ squidaio_do_close(squidaio_request_t * requestp) { if ((requestp->ret = close(requestp->fd)) < 0) { - debugs(43, 0, "squidaio_do_close: FD " << requestp->fd << ", errno " << errno); + debugs(43, DBG_CRITICAL, "squidaio_do_close: FD " << requestp->fd << ", errno " << errno); close(requestp->fd); } === modified file 'src/DiskIO/DiskThreads/async_io.cc' --- src/DiskIO/DiskThreads/async_io.cc 2012-07-12 09:08:16 +0000 +++ src/DiskIO/DiskThreads/async_io.cc 2012-08-02 21:10:18 +0000 @@ -110,7 +110,7 @@ AIOCB *callback = ctrlp->done_handler; void *cbdata; ctrlp->done_handler = NULL; - debugs(32, 1, "this be aioCancel. Danger ahead!"); + debugs(32, DBG_IMPORTANT, "this be aioCancel. Danger ahead!"); if (cbdataReferenceValidDone(ctrlp->done_handler_data, &cbdata)) callback(fd, cbdata, NULL, -2, -2); === modified file 'src/DiskIO/IpcIo/IpcIoFile.cc' --- src/DiskIO/IpcIo/IpcIoFile.cc 2012-07-20 15:31:04 +0000 +++ src/DiskIO/IpcIo/IpcIoFile.cc 2012-08-02 21:18:43 +0000 @@ -135,7 +135,7 @@ Must(diskId < 0); // we do not know our disker yet if (!response) { - debugs(79,1, HERE << "error: timeout"); + debugs(79, DBG_IMPORTANT, HERE << "error: timeout"); error_ = true; } else { diskId = response->strand.kidId; @@ -145,7 +145,7 @@ Must(inserted); } else { error_ = true; - debugs(79,1, HERE << "error: no disker claimed " << dbName); + debugs(79, DBG_IMPORTANT, HERE << "error: no disker claimed " << dbName); } } @@ -222,10 +222,10 @@ ioError = true; // I/O timeout does not warrant setting error_? } else { if (response->xerrno) { - debugs(79,1, HERE << "error: " << xstrerr(response->xerrno)); + debugs(79, DBG_IMPORTANT, HERE << "error: " << xstrerr(response->xerrno)); ioError = error_ = true; } else if (!response->page) { - debugs(79,1, HERE << "error: run out of shared memory pages"); + debugs(79, DBG_IMPORTANT, HERE << "error: run out of shared memory pages"); ioError = true; } else { const char *const buf = Ipc::Mem::PagePointer(response->page); @@ -268,10 +268,10 @@ debugs(79, 3, HERE << "error: timeout"); ioError = true; // I/O timeout does not warrant setting error_? } else if (response->xerrno) { - debugs(79,1, HERE << "error: " << xstrerr(response->xerrno)); + debugs(79, DBG_IMPORTANT, HERE << "error: " << xstrerr(response->xerrno)); ioError = error_ = true; } else if (response->len != writeRequest->len) { - debugs(79,1, HERE << "problem: " << response->len << " < " << writeRequest->len); + debugs(79, DBG_IMPORTANT, HERE << "problem: " << response->len << " < " << writeRequest->len); error_ = true; } @@ -788,7 +788,7 @@ IpcIoFile::DiskerHandleRequest(const int workerId, IpcIoMsg &ipcIo) { if (ipcIo.command != IpcIo::cmdRead && ipcIo.command != IpcIo::cmdWrite) { - debugs(0,0, HERE << "disker" << KidIdentifier << + debugs(0, DBG_CRITICAL, HERE << "disker" << KidIdentifier << " should not receive " << ipcIo.command << " ipcIo" << workerId << '.' << ipcIo.requestId); return; @@ -830,7 +830,7 @@ if (TheFile < 0) { const int xerrno = errno; - debugs(47,0, HERE << "rock db error opening " << path << ": " << + debugs(47, DBG_CRITICAL, HERE << "rock db error opening " << path << ": " << xstrerr(xerrno)); return false; } === modified file 'src/DiskIO/Mmapped/MmappedFile.cc' --- src/DiskIO/Mmapped/MmappedFile.cc 2012-07-20 15:31:04 +0000 +++ src/DiskIO/Mmapped/MmappedFile.cc 2012-08-02 21:10:18 +0000 @@ -187,10 +187,10 @@ const ssize_t written = pwrite(fd, aRequest->buf, aRequest->len, aRequest->offset); if (written < 0) { - debugs(79,1, HERE << "error: " << xstrerr(errno)); + debugs(79, DBG_IMPORTANT, HERE << "error: " << xstrerr(errno)); error_ = true; } else if (static_cast(written) != aRequest->len) { - debugs(79,1, HERE << "problem: " << written << " < " << aRequest->len); + debugs(79, DBG_IMPORTANT, HERE << "problem: " << written << " < " << aRequest->len); error_ = true; } === modified file 'src/DiskIO/Mmapped/MmappedFile.h' --- src/DiskIO/Mmapped/MmappedFile.h 2011-01-27 21:14:56 +0000 +++ src/DiskIO/Mmapped/MmappedFile.h 2012-08-04 12:11:57 +0000 @@ -26,7 +26,6 @@ virtual bool ioInProgress() const; private: - CBDATA_CLASS(MmappedFile); char const *path_; RefCount ioRequestor; @@ -41,6 +40,7 @@ bool error_; void doClose(); + CBDATA_CLASS(MmappedFile); }; #endif /* SQUID_MMAPPEDFILE_H */ === modified file 'src/EventLoop.cc' --- src/EventLoop.cc 2012-01-20 18:55:04 +0000 +++ src/EventLoop.cc 2012-08-02 21:18:43 +0000 @@ -134,7 +134,7 @@ if (error) { ++errcount; - debugs(1, 0, "Select loop Error. Retry " << errcount); + debugs(1, DBG_CRITICAL, "Select loop Error. Retry " << errcount); } else errcount = 0; === modified file 'src/HelperChildConfig.cc' --- src/HelperChildConfig.cc 2012-01-20 18:55:04 +0000 +++ src/HelperChildConfig.cc 2012-08-02 21:18:43 +0000 @@ -59,7 +59,7 @@ } else if (strncmp(token, "idle=", 5) == 0) { n_idle = atoi(token + 5); if (n_idle < 1) { - debugs(0,0,"WARNING OVERIDE: Using idle=0 for helpers causes request failures. Overiding to use idle=1 instead."); + debugs(0, DBG_CRITICAL, "WARNING OVERIDE: Using idle=0 for helpers causes request failures. Overiding to use idle=1 instead."); n_idle = 1; } } else if (strncmp(token, "concurrency=", 12) == 0) { @@ -72,12 +72,12 @@ /* simple sanity. */ if (n_startup > n_max) { - debugs(0,0,"WARNING OVERIDE: Capping startup=" << n_startup << " to the defined maximum (" << n_max <<")"); + debugs(0, DBG_CRITICAL, "WARNING OVERIDE: Capping startup=" << n_startup << " to the defined maximum (" << n_max <<")"); n_startup = n_max; } if (n_idle > n_max) { - debugs(0,0,"WARNING OVERIDE: Capping idle=" << n_idle << " to the defined maximum (" << n_max <<")"); + debugs(0, DBG_CRITICAL, "WARNING OVERIDE: Capping idle=" << n_idle << " to the defined maximum (" << n_max <<")"); n_idle = n_max; } } === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2012-07-23 15:34:12 +0000 +++ src/HttpHeader.cc 2012-08-02 21:18:43 +0000 @@ -456,7 +456,7 @@ /* tmp hack to try to avoid coredumps */ if (e->id < 0 || e->id >= HDR_ENUM_END) { - debugs(55, 0, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); + debugs(55, DBG_CRITICAL, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); } else { HttpHeaderStats[owner].fieldTypeDistr.count(e->id); /* yes, this deletion leaves us in an inconsistent state */ @@ -548,7 +548,7 @@ char *nulpos; if ((nulpos = (char*)memchr(header_start, '\0', header_end - header_start))) { - debugs(55, 1, "WARNING: HTTP header contains NULL characters {" << + debugs(55, DBG_IMPORTANT, "WARNING: HTTP header contains NULL characters {" << getStringPrefix(header_start, nulpos) << "}\nNULL\n{" << getStringPrefix(nulpos+1, header_end)); goto reset; } @@ -580,7 +580,7 @@ cr_only = false; } if (cr_only) { - debugs(55, 1, "WARNING: Rejecting HTTP request with a CR+ " + debugs(55, DBG_IMPORTANT, "WARNING: Rejecting HTTP request with a CR+ " "header field to prevent request smuggling attacks: {" << getStringPrefix(header_start, header_end) << "}"); goto reset; @@ -590,7 +590,7 @@ /* Barf on stray CR characters */ if (memchr(this_line, '\r', field_end - this_line)) { - debugs(55, 1, "WARNING: suspicious CR characters in HTTP header {" << + debugs(55, DBG_IMPORTANT, "WARNING: suspicious CR characters in HTTP header {" << getStringPrefix(field_start, field_end) << "}"); if (Config.onoff.relaxed_header_parser) { @@ -605,7 +605,7 @@ } if (this_line + 1 == field_end && this_line > field_start) { - debugs(55, 1, "WARNING: Blank continuation line in HTTP header {" << + debugs(55, DBG_IMPORTANT, "WARNING: Blank continuation line in HTTP header {" << getStringPrefix(header_start, header_end) << "}"); goto reset; } @@ -613,7 +613,7 @@ if (field_start == field_end) { if (field_ptr < header_end) { - debugs(55, 1, "WARNING: unparseable HTTP header field near {" << + debugs(55, DBG_IMPORTANT, "WARNING: unparseable HTTP header field near {" << getStringPrefix(field_start, header_end) << "}"); goto reset; } @@ -622,7 +622,7 @@ } if ((e = HttpHeaderEntry::parse(field_start, field_end)) == NULL) { - debugs(55, 1, "WARNING: unparseable HTTP header field {" << + debugs(55, DBG_IMPORTANT, "WARNING: unparseable HTTP header field {" << getStringPrefix(field_start, field_end) << "}"); debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2, " in {" << getStringPrefix(header_start, header_end) << "}"); @@ -646,11 +646,11 @@ } if (!httpHeaderParseOffset(e->value.termedBuf(), &l1)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e->value << "'"); + debugs(55, DBG_IMPORTANT, "WARNING: Unparseable content-length '" << e->value << "'"); delete e; continue; } else if (!httpHeaderParseOffset(e2->value.termedBuf(), &l2)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value << "'"); + debugs(55, DBG_IMPORTANT, "WARNING: Unparseable content-length '" << e2->value << "'"); delById(e2->id); } else if (l1 > l2) { delById(e2->id); @@ -1544,7 +1544,7 @@ if (name_len > 65534) { /* String must be LESS THAN 64K and it adds a terminating NULL */ - debugs(55, 1, "WARNING: ignoring header name of " << name_len << " bytes"); + debugs(55, DBG_IMPORTANT, "WARNING: ignoring header name of " << name_len << " bytes"); return NULL; } @@ -1590,7 +1590,7 @@ if (field_end - value_start > 65534) { /* String must be LESS THAN 64K and it adds a terminating NULL */ - debugs(55, 1, "WARNING: ignoring '" << name << "' header of " << (field_end - value_start) << " bytes"); + debugs(55, DBG_IMPORTANT, "WARNING: ignoring '" << name << "' header of " << (field_end - value_start) << " bytes"); if (id == HDR_OTHER) name.clean(); === modified file 'src/HttpMsg.cc' --- src/HttpMsg.cc 2012-07-20 15:31:04 +0000 +++ src/HttpMsg.cc 2012-08-02 21:10:18 +0000 @@ -164,7 +164,7 @@ // TODO: move to httpReplyParseStep() if (hdr_len > Config.maxReplyHeaderSize || (hdr_len <= 0 && (size_t)buf->contentSize() > Config.maxReplyHeaderSize)) { - debugs(58, 1, "HttpMsg::parse: Too large reply header (" << hdr_len << " > " << Config.maxReplyHeaderSize); + debugs(58, DBG_IMPORTANT, "HttpMsg::parse: Too large reply header (" << hdr_len << " > " << Config.maxReplyHeaderSize); *error = HTTP_HEADER_TOO_LARGE; return false; } @@ -196,7 +196,7 @@ debugs(58, 9, "HttpMsg::parse success (" << hdr_len << " bytes) near '" << buf->content() << "'"); if (hdr_sz != (int)hdr_len) { - debugs(58, 1, "internal HttpMsg::parse vs. headersEnd error: " << + debugs(58, DBG_IMPORTANT, "internal HttpMsg::parse vs. headersEnd error: " << hdr_sz << " != " << hdr_len); hdr_sz = (int)hdr_len; // because old http.cc code used hdr_len } === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2012-07-23 07:02:06 +0000 +++ src/HttpRequest.cc 2012-08-02 21:10:18 +0000 @@ -319,7 +319,7 @@ ++end; // back to space if (2 != sscanf(ver + 5, "%d.%d", &http_ver.major, &http_ver.minor)) { - debugs(73, 1, "parseRequestLine: Invalid HTTP identifier."); + debugs(73, DBG_IMPORTANT, "parseRequestLine: Invalid HTTP identifier."); return false; } } else { === modified file 'src/HttpRequestMethod.cc' --- src/HttpRequestMethod.cc 2012-07-17 17:38:50 +0000 +++ src/HttpRequestMethod.cc 2012-08-02 21:10:18 +0000 @@ -142,12 +142,12 @@ /* Don't free statically allocated "%EXTnn" string */ RequestMethodStr[method] = xstrdup(mstr); - debugs(23, 1, "Extension method '" << mstr << "' added, enum=" << method); + debugs(23, DBG_IMPORTANT, "Extension method '" << mstr << "' added, enum=" << method); return; } - debugs(23, 1, "WARNING: Could not add new extension method '" << mstr << "' due to lack of array space"); + debugs(23, DBG_IMPORTANT, "WARNING: Could not add new extension method '" << mstr << "' due to lack of array space"); #endif } === modified file 'src/LeakFinder.cc' --- src/LeakFinder.cc 2012-07-20 15:31:04 +0000 +++ src/LeakFinder.cc 2012-08-02 21:10:18 +0000 @@ -128,14 +128,14 @@ last_dump = squid_curtime; - debugs(45, 1, "Tracking " << count << " pointers"); + debugs(45, DBG_IMPORTANT, "Tracking " << count << " pointers"); hash_first(table); LeakFinderPtr *c; while ((c = (LeakFinderPtr *)hash_next(table))) { - debugs(45, 1, std::setw(20) << c->key << " last used " << std::setw(9) << (squid_curtime - c->when) << + debugs(45, DBG_IMPORTANT, std::setw(20) << c->key << " last used " << std::setw(9) << (squid_curtime - c->when) << " seconds ago by " << c->file << ":" << c->line); } } === modified file 'src/LoadableModules.cc' --- src/LoadableModules.cc 2012-01-20 18:55:04 +0000 +++ src/LoadableModules.cc 2012-08-02 21:10:18 +0000 @@ -6,7 +6,7 @@ static void LoadModule(const char *fname) { - debugs(1, 1, "Loading Squid module from '" << fname << "'"); + debugs(1, DBG_IMPORTANT, "Loading Squid module from '" << fname << "'"); LoadableModule *m = new LoadableModule(fname); m->load(); @@ -21,5 +21,5 @@ int count = 0; for (const wordlist *i = names; i; i = i->next, ++count) LoadModule(i->key); - debugs(1, 1, "Squid plugin modules loaded: " << count); + debugs(1, DBG_IMPORTANT, "Squid plugin modules loaded: " << count); } === modified file 'src/MemBuf.h' --- src/MemBuf.h 2009-12-26 00:25:57 +0000 +++ src/MemBuf.h 2012-08-04 12:11:57 +0000 @@ -134,8 +134,6 @@ void grow(mb_size_t min_cap); - CBDATA_CLASS2(MemBuf); - public: /** \deprecated use space*() and content*() methods to access safely instead. @@ -164,9 +162,10 @@ unsigned stolen:1; /* the buffer has been stolen for use by someone else */ #if 0 - unsigned valid:1; /* to be used for debugging only! */ #endif + + CBDATA_CLASS2(MemBuf); }; #if _USE_INLINE_ === modified file 'src/MemObject.cc' --- src/MemObject.cc 2012-07-20 12:44:39 +0000 +++ src/MemObject.cc 2012-08-02 21:10:18 +0000 @@ -171,16 +171,16 @@ data_hdr.dump(); #if 0 /* do we want this one? */ - debugs(20, 1, "MemObject->data.origin_offset: " << (data_hdr.head ? data_hdr.head->nodeBuffer.offset : 0)); + debugs(20, DBG_IMPORTANT, "MemObject->data.origin_offset: " << (data_hdr.head ? data_hdr.head->nodeBuffer.offset : 0)); #endif - debugs(20, 1, "MemObject->start_ping: " << start_ping.tv_sec << "."<< std::setfill('0') << std::setw(6) << start_ping.tv_usec); - debugs(20, 1, "MemObject->inmem_hi: " << data_hdr.endOffset()); - debugs(20, 1, "MemObject->inmem_lo: " << inmem_lo); - debugs(20, 1, "MemObject->nclients: " << nclients); - debugs(20, 1, "MemObject->reply: " << _reply); - debugs(20, 1, "MemObject->request: " << request); - debugs(20, 1, "MemObject->log_url: " << log_url << " " << checkNullString(log_url)); + debugs(20, DBG_IMPORTANT, "MemObject->start_ping: " << start_ping.tv_sec << "."<< std::setfill('0') << std::setw(6) << start_ping.tv_usec); + debugs(20, DBG_IMPORTANT, "MemObject->inmem_hi: " << data_hdr.endOffset()); + debugs(20, DBG_IMPORTANT, "MemObject->inmem_lo: " << inmem_lo); + debugs(20, DBG_IMPORTANT, "MemObject->nclients: " << nclients); + debugs(20, DBG_IMPORTANT, "MemObject->reply: " << _reply); + debugs(20, DBG_IMPORTANT, "MemObject->request: " << request); + debugs(20, DBG_IMPORTANT, "MemObject->log_url: " << log_url << " " << checkNullString(log_url)); } HttpReply const * === modified file 'src/Server.cc' --- src/Server.cc 2012-06-19 16:08:52 +0000 +++ src/Server.cc 2012-08-02 21:10:18 +0000 @@ -379,7 +379,7 @@ } if (io.flag) { - debugs(11, 1, "sentRequestBody error: FD " << io.fd << ": " << xstrerr(io.xerrno)); + debugs(11, DBG_IMPORTANT, "sentRequestBody error: FD " << io.fd << ": " << xstrerr(io.xerrno)); ErrorState *err; err = new ErrorState(ERR_WRITE_ERROR, HTTP_BAD_GATEWAY, fwd->request); err->xerrno = io.xerrno; === modified file 'src/StoreClient.h' --- src/StoreClient.h 2010-11-27 06:44:33 +0000 +++ src/StoreClient.h 2012-08-04 12:11:57 +0000 @@ -99,7 +99,6 @@ StoreIOBuffer copyInto; private: - CBDATA_CLASS(store_client); void fileRead(); void scheduleDiskRead(); void scheduleMemRead(); @@ -111,9 +110,7 @@ bool object_ok; /* Until we finish stuffing code into store_client */ - public: - struct Callback { Callback ():callback_handler(NULL), callback_data(NULL) {} @@ -122,6 +119,10 @@ STCB *callback_handler; void *callback_data; } _callback; + +private: + CBDATA_CLASS(store_client); + }; SQUIDCEXTERN void storeClientCopy(store_client *, StoreEntry *, StoreIOBuffer, STCB *, void *); === modified file 'src/StoreMeta.cc' --- src/StoreMeta.cc 2012-01-20 18:55:04 +0000 +++ src/StoreMeta.cc 2012-08-02 21:18:43 +0000 @@ -49,7 +49,7 @@ { /* VOID is reserved, and new types have to be added as classes */ if (type <= STORE_META_VOID || type >= STORE_META_END + 10) { - debugs(20, 0, "storeSwapMetaUnpack: bad type (" << type << ")!"); + debugs(20, DBG_CRITICAL, "storeSwapMetaUnpack: bad type (" << type << ")!"); return false; } @@ -66,7 +66,7 @@ type == STORE_META_KEY_SHA || type == STORE_META_HITMETERING || type == STORE_META_VALID) { - debugs(20, 0, "Obsolete and unused type (" << type << ") in disk metadata"); + debugs(20, DBG_CRITICAL, "Obsolete and unused type (" << type << ") in disk metadata"); return false; } @@ -104,7 +104,7 @@ StoreMeta::validLength(int aLength) const { if (!IntRange (MinimumTLVLength, MaximumTLVLength).includes(aLength)) { - debugs(20, 0, "storeSwapMetaUnpack: insane length (" << aLength << ")!"); + debugs(20, DBG_CRITICAL, "storeSwapMetaUnpack: insane length (" << aLength << ")!"); return false; } @@ -147,7 +147,7 @@ break; default: - debugs(20, 0, "Attempt to create unknown concrete StoreMeta"); + debugs(20, DBG_CRITICAL, "Attempt to create unknown concrete StoreMeta"); return NULL; } @@ -205,7 +205,7 @@ break; default: - debugs(20, 1, "WARNING: got unused STORE_META type " << getType()); + debugs(20, DBG_IMPORTANT, "WARNING: got unused STORE_META type " << getType()); break; } === modified file 'src/StoreMetaMD5.cc' --- src/StoreMetaMD5.cc 2012-01-20 18:55:04 +0000 +++ src/StoreMetaMD5.cc 2012-08-02 21:10:18 +0000 @@ -59,7 +59,7 @@ debugs(20, 2, "\t" << e->getMD5Text()); if (isPowTen(++md5_mismatches)) - debugs(20, 1, "WARNING: " << md5_mismatches << " swapin MD5 mismatches"); + debugs(20, DBG_IMPORTANT, "WARNING: " << md5_mismatches << " swapin MD5 mismatches"); return false; } === modified file 'src/StoreMetaURL.cc' --- src/StoreMetaURL.cc 2012-01-20 18:55:04 +0000 +++ src/StoreMetaURL.cc 2012-08-02 21:10:18 +0000 @@ -47,8 +47,8 @@ return true; if (strcasecmp(e->mem_obj->url, (char *)value)) { - debugs(20, 1, "storeClientReadHeader: URL mismatch"); - debugs(20, 1, "\t{" << (char *) value << "} != {" << e->mem_obj->url << "}"); + debugs(20, DBG_IMPORTANT, "storeClientReadHeader: URL mismatch"); + debugs(20, DBG_IMPORTANT, "\t{" << (char *) value << "} != {" << e->mem_obj->url << "}"); return false; } === modified file 'src/StoreMetaUnpacker.cc' --- src/StoreMetaUnpacker.cc 2012-07-23 19:37:47 +0000 +++ src/StoreMetaUnpacker.cc 2012-08-02 21:18:43 +0000 @@ -110,8 +110,8 @@ getLength(); if (position + length > *hdr_len) { - debugs(20, 0, "storeSwapMetaUnpack: overflow!"); - debugs(20, 0, "\ttype=" << type << ", length=" << length << ", *hdr_len=" << *hdr_len << ", offset=" << position); + debugs(20, DBG_CRITICAL, "storeSwapMetaUnpack: overflow!"); + debugs(20, DBG_CRITICAL, "\ttype=" << type << ", length=" << length << ", *hdr_len=" << *hdr_len << ", offset=" << position); return false; } === modified file 'src/SwapDir.cc' --- src/SwapDir.cc 2012-07-23 19:37:47 +0000 +++ src/SwapDir.cc 2012-08-02 21:10:18 +0000 @@ -266,7 +266,7 @@ if (isaReconfig) { if (old_read_only != flags.read_only) { - debugs(3, 1, "Cache dir '" << path << "' now " << (flags.read_only ? "No-Store" : "Read-Write")); + debugs(3, DBG_IMPORTANT, "Cache dir '" << path << "' now " << (flags.read_only ? "No-Store" : "Read-Write")); } } } === modified file 'src/WinSvc.cc' --- src/WinSvc.cc 2012-07-19 13:49:54 +0000 +++ src/WinSvc.cc 2012-08-02 21:10:18 +0000 @@ -457,10 +457,10 @@ while (1) { Result = NotifyAddrChange(NULL, NULL); if (Result != NO_ERROR) { - debugs(1, 1, "NotifyAddrChange error " << Result); + debugs(1, DBG_IMPORTANT, "NotifyAddrChange error " << Result); return 1; } - debugs(1, 1, "Notification of IP address change received, requesting Squid reconfiguration ..."); + debugs(1, DBG_IMPORTANT, "Notification of IP address change received, requesting Squid reconfiguration ..."); reconfigure(SIGHUP); } return 0; @@ -478,7 +478,7 @@ if (NotifyAddrChange_thread == NULL) { status = GetLastError(); NotifyAddrChange_thread = INVALID_HANDLE_VALUE; - debugs(1, 1, "Failed to start IP monitor thread."); + debugs(1, DBG_IMPORTANT, "Failed to start IP monitor thread."); } else debugs(1, 2, "Starting IP monitor thread [" << threadID << "] ..."); } @@ -628,10 +628,10 @@ if (!SetServiceStatus(svcHandle, &svcStatus)) { status = GetLastError(); - debugs(1, 1, "SetServiceStatus error " << status); + debugs(1, DBG_IMPORTANT, "SetServiceStatus error " << status); } - debugs(1, 1, "Leaving Squid service"); + debugs(1, DBG_IMPORTANT, "Leaving Squid service"); return; case _WIN_SQUID_SERVICE_CONTROL_INTERROGATE: @@ -639,7 +639,7 @@ if (!SetServiceStatus(svcHandle, &svcStatus)) { status = GetLastError(); - debugs(1, 1, "SetServiceStatus error " << status); + debugs(1, DBG_IMPORTANT, "SetServiceStatus error " << status); } break; @@ -666,14 +666,14 @@ if (!SetServiceStatus(svcHandle, &svcStatus)) { status = GetLastError(); - debugs(1, 1, "SetServiceStatus error " << status); + debugs(1, DBG_IMPORTANT, "SetServiceStatus error " << status); } - debugs(1, 1, "Leaving Squid service"); + debugs(1, DBG_IMPORTANT, "Leaving Squid service"); break; default: - debugs(1, 1, "Unrecognized opcode " << Opcode); + debugs(1, DBG_IMPORTANT, "Unrecognized opcode " << Opcode); } return; === modified file 'src/acl/Acl.cc' --- src/acl/Acl.cc 2012-06-19 16:08:52 +0000 +++ src/acl/Acl.cc 2012-08-02 21:18:43 +0000 @@ -99,13 +99,13 @@ /* snarf the ACL name */ if ((t = strtok(NULL, w_space)) == NULL) { - debugs(28, 0, "aclParseAclLine: missing ACL name."); + debugs(28, DBG_CRITICAL, "aclParseAclLine: missing ACL name."); parser.destruct(); return; } if (strlen(t) >= ACL_NAME_SZ) { - debugs(28, 0, "aclParseAclLine: aclParseAclLine: ACL name '" << t << + debugs(28, DBG_CRITICAL, "aclParseAclLine: aclParseAclLine: ACL name '" << t << "' too long, max " << ACL_NAME_SZ - 1 << " characters supported"); parser.destruct(); return; @@ -116,7 +116,7 @@ const char *theType; if ((theType = strtok(NULL, w_space)) == NULL) { - debugs(28, 0, "aclParseAclLine: missing ACL type."); + debugs(28, DBG_CRITICAL, "aclParseAclLine: missing ACL type."); parser.destruct(); return; } @@ -160,7 +160,7 @@ new_acl = 1; } else { if (strcmp (A->typeString(),theType) ) { - debugs(28, 0, "aclParseAclLine: ACL '" << A->name << "' already exists with different type."); + debugs(28, DBG_CRITICAL, "aclParseAclLine: ACL '" << A->name << "' already exists with different type."); parser.destruct(); return; } @@ -187,7 +187,7 @@ return; if (A->empty()) { - debugs(28, 0, "Warning: empty ACL: " << A->cfgline); + debugs(28, DBG_CRITICAL, "Warning: empty ACL: " << A->cfgline); } if (!A->valid()) { @@ -303,12 +303,12 @@ int rv; if (!checklist->hasRequest() && requiresRequest()) { - debugs(28, 1, "ACL::checklistMatches WARNING: '" << name << "' ACL is used but there is no HTTP request -- not matching."); + debugs(28, DBG_IMPORTANT, "ACL::checklistMatches WARNING: '" << name << "' ACL is used but there is no HTTP request -- not matching."); return 0; } if (!checklist->hasReply() && requiresReply()) { - debugs(28, 1, "ACL::checklistMatches WARNING: '" << name << "' ACL is used but there is no HTTP reply -- not matching."); + debugs(28, DBG_IMPORTANT, "ACL::checklistMatches WARNING: '" << name << "' ACL is used but there is no HTTP reply -- not matching."); return 0; } === modified file 'src/acl/Arp.cc' --- src/acl/Arp.cc 2012-01-20 18:55:04 +0000 +++ src/acl/Arp.cc 2012-08-02 21:18:43 +0000 @@ -115,14 +115,14 @@ debugs(28, 5, "aclParseArpData: " << t); if (sscanf(t, "%[0-9a-fA-F:]", buf) != 1) { - debugs(28, 0, "aclParseArpData: Bad ethernet address: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseArpData: Bad ethernet address: '" << t << "'"); safe_free(q); return NULL; } if (!q->decode(buf)) { - debugs(28, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseArpData: Ignoring invalid ARP acl entry: can't parse '" << buf << "'"); + debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseArpData: Ignoring invalid ARP acl entry: can't parse '" << buf << "'"); safe_free(q); return NULL; } === modified file 'src/acl/Asn.cc' --- src/acl/Asn.cc 2012-07-02 12:28:10 +0000 +++ src/acl/Asn.cc 2012-08-02 21:10:18 +0000 @@ -295,11 +295,11 @@ asStateFree(asState); return; } else if (result.flags.error) { - debugs(53, 1, "asHandleReply: Called with Error set and size=" << (unsigned int) result.length); + debugs(53, DBG_IMPORTANT, "asHandleReply: Called with Error set and size=" << (unsigned int) result.length); asStateFree(asState); return; } else if (HTTP_OK != e->getReply()->sline.status) { - debugs(53, 1, "WARNING: AS " << asState->as_number << " whois request failed"); + debugs(53, DBG_IMPORTANT, "WARNING: AS " << asState->as_number << " whois request failed"); asStateFree(asState); return; } === modified file 'src/acl/Eui64.cc' --- src/acl/Eui64.cc 2012-01-20 18:55:04 +0000 +++ src/acl/Eui64.cc 2012-08-02 21:18:43 +0000 @@ -89,14 +89,14 @@ debugs(28, 5, "aclParseEuiData: " << t); if (sscanf(t, "%[0-9a-fA-F:]", buf) != 1) { - debugs(28, 0, "aclParseEuiData: Bad EUI-64 address: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseEuiData: Bad EUI-64 address: '" << t << "'"); safe_free(q); return NULL; } if (!q->decode(buf)) { - debugs(28, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseEuiData: Ignoring invalid EUI-64 acl entry: can't parse '" << buf << "'"); + debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseEuiData: Ignoring invalid EUI-64 acl entry: can't parse '" << buf << "'"); safe_free(q); return NULL; } === modified file 'src/acl/FilledChecklist.h' --- src/acl/FilledChecklist.h 2012-06-28 18:26:44 +0000 +++ src/acl/FilledChecklist.h 2012-08-04 12:11:57 +0000 @@ -73,18 +73,17 @@ ExternalACLEntry *extacl_entry; private: - CBDATA_CLASS(ACLFilledChecklist); - ConnStateData * conn_; /**< hack for ident and NTLM */ int fd_; /**< may be available when conn_ is not */ bool destinationDomainChecked_; bool sourceDomainChecked_; -private: /// not implemented; will cause link failures if used ACLFilledChecklist(const ACLFilledChecklist &); /// not implemented; will cause link failures if used ACLFilledChecklist &operator=(const ACLFilledChecklist &); +private: + CBDATA_CLASS(ACLFilledChecklist); }; /// convenience and safety wrapper for dynamic_cast === modified file 'src/acl/Gadgets.cc' --- src/acl/Gadgets.cc 2012-07-02 12:28:10 +0000 +++ src/acl/Gadgets.cc 2012-08-02 21:18:43 +0000 @@ -120,8 +120,8 @@ /* first expect a page name */ if ((t = strtok(NULL, w_space)) == NULL) { - debugs(28, 0, "aclParseDenyInfoLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseDenyInfoLine: missing 'error page' parameter."); + debugs(28, DBG_CRITICAL, "aclParseDenyInfoLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseDenyInfoLine: missing 'error page' parameter."); return; } @@ -140,8 +140,8 @@ } if (A->acl_list == NULL) { - debugs(28, 0, "aclParseDenyInfoLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseDenyInfoLine: deny_info line contains no ACL's, skipping"); + debugs(28, DBG_CRITICAL, "aclParseDenyInfoLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseDenyInfoLine: deny_info line contains no ACL's, skipping"); memFree(A, MEM_ACL_DENY_INFO_LIST); return; } @@ -163,8 +163,8 @@ /* first expect either 'allow' or 'deny' */ if ((t = strtok(NULL, w_space)) == NULL) { - debugs(28, 0, "aclParseAccessLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseAccessLine: missing 'allow' or 'deny'."); + debugs(28, DBG_CRITICAL, "aclParseAccessLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseAccessLine: missing 'allow' or 'deny'."); return; } @@ -175,8 +175,8 @@ else if (!strcmp(t, "deny")) A->allow = ACCESS_DENIED; else { - debugs(28, 0, "aclParseAccessLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseAccessLine: expecting 'allow' or 'deny', got '" << t << "'."); + debugs(28, DBG_CRITICAL, "aclParseAccessLine: " << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseAccessLine: expecting 'allow' or 'deny', got '" << t << "'."); delete A; return; } @@ -184,8 +184,8 @@ aclParseAclList(parser, &A->aclList); if (A->aclList == NULL) { - debugs(28, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseAccessLine: Access line contains no ACL's, skipping"); + debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(28, DBG_CRITICAL, "aclParseAccessLine: Access line contains no ACL's, skipping"); delete A; return; } @@ -221,7 +221,7 @@ a = ACL::FindByName(t); if (a == NULL) { - debugs(28, 0, "aclParseAclList: ACL name '" << t << "' not found."); + debugs(28, DBG_CRITICAL, "aclParseAclList: ACL name '" << t << "' not found."); delete L; parser.destruct(); continue; === modified file 'src/acl/HttpStatus.cc' --- src/acl/HttpStatus.cc 2012-01-20 18:55:04 +0000 +++ src/acl/HttpStatus.cc 2012-08-02 21:18:43 +0000 @@ -76,9 +76,9 @@ char bufb[8]; a->toStr(bufa, sizeof(bufa)); b->toStr(bufb, sizeof(bufb)); - debugs(28, 0, "WARNING: '" << bufa << "' is a subrange of '" << bufb << "'"); - debugs(28, 0, "WARNING: because of this '" << bufa << "' is ignored to keep splay tree searching predictable"); - debugs(28, 0, "WARNING: You should probably remove '" << bufb << "' from the ACL named '" << AclMatchedName << "'"); + debugs(28, DBG_CRITICAL, "WARNING: '" << bufa << "' is a subrange of '" << bufb << "'"); + debugs(28, DBG_CRITICAL, "WARNING: because of this '" << bufa << "' is ignored to keep splay tree searching predictable"); + debugs(28, DBG_CRITICAL, "WARNING: You should probably remove '" << bufb << "' from the ACL named '" << AclMatchedName << "'"); } return ret; === modified file 'src/acl/IntRange.cc' --- src/acl/IntRange.cc 2012-07-23 15:15:27 +0000 +++ src/acl/IntRange.cc 2012-08-02 21:18:43 +0000 @@ -71,7 +71,7 @@ temp.end = port2+1; ranges.push_back(temp); } else { - debugs(28, 0, "ACLIntRange::parse: Invalid port value"); + debugs(28, DBG_CRITICAL, "ACLIntRange::parse: Invalid port value"); self_destruct(); } } === modified file 'src/acl/Ip.cc' --- src/acl/Ip.cc 2012-07-02 12:28:10 +0000 +++ src/acl/Ip.cc 2012-08-02 21:18:43 +0000 @@ -179,9 +179,9 @@ a->toStr(buf_n1, 3*(MAX_IPSTRLEN+1)); b->toStr(buf_n2, 3*(MAX_IPSTRLEN+1)); } - debugs(28, 0, "WARNING: (" << (bina?'B':'A') << ") '" << buf_n1 << "' is a subnetwork of (" << (bina?'A':'B') << ") '" << buf_n2 << "'"); - debugs(28, 0, "WARNING: because of this '" << (bina?buf_n2:buf_n1) << "' is ignored to keep splay tree searching predictable"); - debugs(28, 0, "WARNING: You should probably remove '" << buf_n1 << "' from the ACL named '" << AclMatchedName << "'"); + debugs(28, DBG_CRITICAL, "WARNING: (" << (bina?'B':'A') << ") '" << buf_n1 << "' is a subnetwork of (" << (bina?'A':'B') << ") '" << buf_n2 << "'"); + debugs(28, DBG_CRITICAL, "WARNING: because of this '" << (bina?buf_n2:buf_n1) << "' is ignored to keep splay tree searching predictable"); + debugs(28, DBG_CRITICAL, "WARNING: You should probably remove '" << buf_n1 << "' from the ACL named '" << AclMatchedName << "'"); } return ret; @@ -422,7 +422,7 @@ int errcode = getaddrinfo(addr1,NULL,&hints,&hp); if (hp == NULL) { - debugs(28, 0, "aclIpParseIpData: Bad host/IP: '" << addr1 << + debugs(28, DBG_CRITICAL, "aclIpParseIpData: Bad host/IP: '" << addr1 << "' in '" << t << "', flags=" << hints.ai_flags << " : (" << errcode << ") " << gai_strerror(errcode) ); self_destruct(); @@ -458,7 +458,7 @@ } if (*Q != NULL) { - debugs(28, 0, "aclIpParseIpData: Bad host/IP: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclIpParseIpData: Bad host/IP: '" << t << "'"); self_destruct(); return NULL; } @@ -476,7 +476,7 @@ /* Decode addr1 */ if (!*addr1 || !(q->addr1 = addr1)) { - debugs(28, 0, "aclIpParseIpData: unknown first address in '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclIpParseIpData: unknown first address in '" << t << "'"); delete q; self_destruct(); return NULL; @@ -486,7 +486,7 @@ if (!*addr2) q->addr2.SetAnyAddr(); else if (!(q->addr2=addr2) ) { - debugs(28, 0, "aclIpParseIpData: unknown second address in '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclIpParseIpData: unknown second address in '" << t << "'"); delete q; self_destruct(); return NULL; @@ -494,7 +494,7 @@ /* Decode mask (NULL or empty means a exact host mask) */ if (!DecodeMask(mask, q->mask, iptype)) { - debugs(28, 0, "aclParseIpData: unknown netmask '" << mask << "' in '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseIpData: unknown netmask '" << mask << "' in '" << t << "'"); delete q; self_destruct(); return NULL; @@ -505,7 +505,7 @@ changed += q->addr2.ApplyMask(q->mask); if (changed) - debugs(28, 0, "aclIpParseIpData: WARNING: Netmask masks away part of the specified IP in '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclIpParseIpData: WARNING: Netmask masks away part of the specified IP in '" << t << "'"); debugs(28,9, HERE << "Parsed: " << q->addr1 << "-" << q->addr2 << "/" << q->mask << "(/" << q->mask.GetCIDR() <<")"); === modified file 'src/acl/MaxConnection.cc' --- src/acl/MaxConnection.cc 2012-01-20 18:55:04 +0000 +++ src/acl/MaxConnection.cc 2012-08-02 21:18:43 +0000 @@ -120,5 +120,5 @@ if (0 != Config.onoff.client_db) return; - debugs(22, 0, "WARNING: 'maxconn' ACL (" << name << ") won't work with client_db disabled"); + debugs(22, DBG_CRITICAL, "WARNING: 'maxconn' ACL (" << name << ") won't work with client_db disabled"); } === modified file 'src/acl/Random.cc' --- src/acl/Random.cc 2012-01-20 18:55:04 +0000 +++ src/acl/Random.cc 2012-08-02 21:18:43 +0000 @@ -88,7 +88,7 @@ int a = xatoi(bufa); int b = xatoi(bufb); if (a == 0 || b == 0) { - debugs(28, 0, "aclParseRandomData: Bad Pattern: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseRandomData: Bad Pattern: '" << t << "'"); self_destruct(); } else data = a / (double)(a+b); @@ -96,14 +96,14 @@ int a = xatoi(bufa); int b = xatoi(bufb); if (a == 0 || b == 0) { - debugs(28, 0, "aclParseRandomData: Bad Pattern: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseRandomData: Bad Pattern: '" << t << "'"); self_destruct(); } else data = (double) a / (double) b; } else if (sscanf(t, "0.%[0-9]", bufa) == 1) { data = atof(t); } else { - debugs(28, 0, "aclParseRandomData: Bad Pattern: '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseRandomData: Bad Pattern: '" << t << "'"); self_destruct(); } === modified file 'src/acl/TimeData.cc' --- src/acl/TimeData.cc 2012-01-20 18:55:04 +0000 +++ src/acl/TimeData.cc 2012-08-02 21:18:43 +0000 @@ -178,9 +178,9 @@ break; default: - debugs(28, 0, "" << cfg_filename << " line " << config_lineno << + debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(28, 0, "aclParseTimeSpec: Bad Day '" << *t << "'" ); + debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Bad Day '" << *t << "'" ); break; } } @@ -188,7 +188,7 @@ /* assume its time-of-day spec */ if ((sscanf(t, "%d:%d-%d:%d", &h1, &m1, &h2, &m2) < 4) || (!((h1 >= 0 && h1 < 24) && ((h2 >= 0 && h2 < 24) || (h2 == 24 && m2 == 0)) && (m1 >= 0 && m1 < 60) && (m2 >= 0 && m2 < 60)))) { - debugs(28, 0, "aclParseTimeSpec: Bad time range '" << t << "'"); + debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Bad time range '" << t << "'"); self_destruct(); if (q != this) @@ -211,7 +211,7 @@ parsed_weekbits = 0; if (q->start > q->stop) { - debugs(28, 0, "aclParseTimeSpec: Reversed time range"); + debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Reversed time range"); self_destruct(); if (q != this) === modified file 'src/adaptation/AccessRule.cc' --- src/adaptation/AccessRule.cc 2012-01-20 18:55:04 +0000 +++ src/adaptation/AccessRule.cc 2012-08-02 21:18:43 +0000 @@ -39,7 +39,7 @@ } if (!group()) { - debugs(93,0, "ERROR: Unknown adaptation service or group name: '" << + debugs(93, DBG_CRITICAL, "ERROR: Unknown adaptation service or group name: '" << groupId << "'"); // TODO: fail on failures } } === modified file 'src/adaptation/Config.cc' --- src/adaptation/Config.cc 2012-07-02 12:28:10 +0000 +++ src/adaptation/Config.cc 2012-08-02 21:18:43 +0000 @@ -219,7 +219,7 @@ for (VISCI i = configs.begin(); i != configs.end(); ++i) { const ServiceConfigPointer cfg = *i; if (FindService(cfg->key) != NULL) { - debugs(93,0, "ERROR: Duplicate adaptation service name: " << + debugs(93, DBG_CRITICAL, "ERROR: Duplicate adaptation service name: " << cfg->key); continue; // TODO: make fatal } @@ -253,7 +253,7 @@ Adaptation::Config::Finalize(bool enabled) { Enabled = enabled; - debugs(93,1, "Adaptation support is " << (Enabled ? "on" : "off.")); + debugs(93, DBG_IMPORTANT, "Adaptation support is " << (Enabled ? "on" : "off.")); FinalizeEach(AllServices(), "message adaptation services"); FinalizeEach(AllGroups(), "message adaptation service groups"); === modified file 'src/adaptation/ServiceConfig.cc' --- src/adaptation/ServiceConfig.cc 2012-07-02 12:28:10 +0000 +++ src/adaptation/ServiceConfig.cc 2012-08-02 21:18:43 +0000 @@ -155,7 +155,7 @@ // AYJ: most of this is duplicate of urlParse() in src/url.cc if (!value || !*value) { - debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " << + debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " << "empty adaptation service URI"); return false; } @@ -240,7 +240,7 @@ len = e - s; if (len > 1024) { - debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " << + debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " << "long resource name (>1024), probably wrong"); } @@ -257,7 +257,7 @@ else if (!strcmp(value, "1") || !strcmp(value, "on")) var = true; else { - debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " << + debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " << "wrong value for boolean " << name << "; " << "'0', '1', 'on', or 'off' expected but got: " << value); return false; === modified file 'src/adaptation/ServiceGroups.cc' --- src/adaptation/ServiceGroups.cc 2012-01-20 18:55:04 +0000 +++ src/adaptation/ServiceGroups.cc 2012-08-02 21:18:43 +0000 @@ -75,7 +75,7 @@ baselineKey = service->cfg().key; baselineBypass = service->cfg().bypass; } else if (baselineBypass != service->cfg().bypass) { - debugs(93,0, "WARNING: Inconsistent bypass in " << kind << + debugs(93, DBG_CRITICAL, "WARNING: Inconsistent bypass in " << kind << ' ' << id << " may produce surprising results: " << baselineKey << " vs. " << serviceId); } === modified file 'src/adaptation/ecap/ServiceRep.cc' --- src/adaptation/ecap/ServiceRep.cc 2012-01-20 18:55:04 +0000 +++ src/adaptation/ecap/ServiceRep.cc 2012-08-02 21:10:18 +0000 @@ -264,7 +264,7 @@ found = (*cfged)->cfg().uri == (*loaded)->uri().c_str(); } if (!found) - debugs(93, 1, "Warning: loaded eCAP service has no matching " << + debugs(93, DBG_IMPORTANT, "Warning: loaded eCAP service has no matching " << "ecap_service config option: " << (*loaded)->uri()); } } === modified file 'src/adaptation/icap/History.cc' --- src/adaptation/icap/History.cc 2012-01-20 18:55:04 +0000 +++ src/adaptation/icap/History.cc 2012-08-02 21:10:18 +0000 @@ -21,7 +21,7 @@ void Adaptation::Icap::History::stop(const char *context) { if (!concurrencyLevel) { - debugs(93,1, HERE << "Internal error: poor history accounting " << this); + debugs(93, DBG_IMPORTANT, HERE << "Internal error: poor history accounting " << this); return; } === modified file 'src/adaptation/icap/ServiceRep.cc' --- src/adaptation/icap/ServiceRep.cc 2012-07-10 15:44:23 +0000 +++ src/adaptation/icap/ServiceRep.cc 2012-08-02 21:10:18 +0000 @@ -254,7 +254,7 @@ debugs(93,4, HERE << "keeping suspended, also for " << reason); } else { isSuspended = reason; - debugs(93,1, "suspending ICAP service for " << reason); + debugs(93, DBG_IMPORTANT, "suspending ICAP service for " << reason); scheduleUpdate(squid_curtime + TheConfig.service_revival_delay); announceStatusChange("suspended", true); } @@ -455,7 +455,7 @@ return; if (!theOptions->valid()) { - debugs(93,1, "WARNING: Squid got an invalid ICAP OPTIONS response " << + debugs(93, DBG_IMPORTANT, "WARNING: Squid got an invalid ICAP OPTIONS response " << "from service " << cfg().uri << "; error: " << theOptions->error); return; } @@ -483,7 +483,7 @@ } if (!method_found) { - debugs(93,1, "WARNING: Squid is configured to use ICAP method " << + debugs(93, DBG_IMPORTANT, "WARNING: Squid is configured to use ICAP method " << cfg().methodStr() << " for service " << cfg().uri << " but OPTIONS response declares the methods are " << method_list); @@ -498,7 +498,7 @@ if (abs(skew) > theOptions->ttl()) { // TODO: If skew is negative, the option will be considered down // because of stale options. We should probably change this. - debugs(93, 1, "ICAP service's clock is skewed by " << skew << + debugs(93, DBG_IMPORTANT, "ICAP service's clock is skewed by " << skew << " seconds: " << cfg().uri); } } @@ -540,7 +540,7 @@ newOptions = new Adaptation::Icap::Options; newOptions->configure(r); } else { - debugs(93,1, "ICAP service got wrong options message " << status()); + debugs(93, DBG_IMPORTANT, "ICAP service got wrong options message " << status()); } handleNewOptions(newOptions); @@ -599,7 +599,7 @@ if (eventFind(&ServiceRep_noteTimeToUpdate, this)) eventDelete(&ServiceRep_noteTimeToUpdate, this); else - debugs(93,1, "XXX: ICAP service lost an update event."); + debugs(93, DBG_IMPORTANT, "XXX: ICAP service lost an update event."); updateScheduled = false; } === modified file 'src/auth/AclMaxUserIp.cc' --- src/auth/AclMaxUserIp.cc 2012-06-19 16:08:52 +0000 +++ src/auth/AclMaxUserIp.cc 2012-08-02 21:10:18 +0000 @@ -79,7 +79,7 @@ ACLMaxUserIP::parse() { if (maximum) { - debugs(28, 1, "Attempting to alter already set User max IP acl"); + debugs(28, DBG_IMPORTANT, "Attempting to alter already set User max IP acl"); return; } @@ -123,7 +123,7 @@ if (authenticateAuthUserRequestIPCount(auth_user_request) <= maximum) return 0; - debugs(28, 1, "aclMatchUserMaxIP: user '" << auth_user_request->username() << "' tries to use too many IP addresses (max " << maximum << " allowed)!"); + debugs(28, DBG_IMPORTANT, "aclMatchUserMaxIP: user '" << auth_user_request->username() << "' tries to use too many IP addresses (max " << maximum << " allowed)!"); /* this is a match */ if (flags.strict) { === modified file 'src/auth/AclProxyAuth.cc' --- src/auth/AclProxyAuth.cc 2012-07-18 16:21:47 +0000 +++ src/auth/AclProxyAuth.cc 2012-08-02 21:18:43 +0000 @@ -117,12 +117,12 @@ ACLProxyAuth::valid () const { if (authenticateSchemeCount() == 0) { - debugs(28, 0, "Can't use proxy auth because no authentication schemes were compiled."); + debugs(28, DBG_CRITICAL, "Can't use proxy auth because no authentication schemes were compiled."); return false; } if (authenticateActiveSchemeCount() == 0) { - debugs(28, 0, "Can't use proxy auth because no authentication schemes are fully configured."); + debugs(28, DBG_CRITICAL, "Can't use proxy auth because no authentication schemes are fully configured."); return false; } === modified file 'src/auth/digest/auth_digest.cc' --- src/auth/digest/auth_digest.cc 2012-07-23 15:15:27 +0000 +++ src/auth/digest/auth_digest.cc 2012-08-02 21:18:43 +0000 @@ -322,7 +322,7 @@ if (nonce->references > 0) { -- nonce->references; } else { - debugs(29, 1, "authDigestNonceUnlink; Attempt to lower nonce " << nonce << " refcount below 0!"); + debugs(29, DBG_IMPORTANT, "authDigestNonceUnlink; Attempt to lower nonce " << nonce << " refcount below 0!"); } debugs(29, 9, "authDigestNonceUnlink: nonce '" << nonce << "' now at '" << nonce->references << "'."); @@ -667,7 +667,7 @@ } else if (strcasecmp(param_str, "utf8") == 0) { parse_onoff(&utf8); } else { - debugs(29, 0, "unrecognised digest auth scheme parameter '" << param_str << "'"); + debugs(29, DBG_CRITICAL, "unrecognised digest auth scheme parameter '" << param_str << "'"); } } === modified file 'src/auth/negotiate/UserRequest.cc' --- src/auth/negotiate/UserRequest.cc 2012-07-23 15:15:27 +0000 +++ src/auth/negotiate/UserRequest.cc 2012-08-02 21:10:18 +0000 @@ -203,7 +203,7 @@ break; case Auth::Pending: - debugs(29, 1, HERE << "need to ask helper"); + debugs(29, DBG_IMPORTANT, HERE << "need to ask helper"); break; case Auth::Handshake: === modified file 'src/auth/ntlm/UserRequest.cc' --- src/auth/ntlm/UserRequest.cc 2012-07-02 12:28:10 +0000 +++ src/auth/ntlm/UserRequest.cc 2012-08-02 21:10:18 +0000 @@ -197,7 +197,7 @@ break; case Auth::Pending: - debugs(29, 1, HERE << "need to ask helper"); + debugs(29, DBG_IMPORTANT, HERE << "need to ask helper"); break; case Auth::Handshake: === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2012-07-23 15:34:12 +0000 +++ src/cache_cf.cc 2012-08-02 21:18:43 +0000 @@ -425,7 +425,7 @@ int err_count = 0; int is_pipe = 0; - debugs(3, 1, "Processing Configuration File: " << file_name << " (depth " << depth << ")"); + debugs(3, DBG_IMPORTANT, "Processing Configuration File: " << file_name << " (depth " << depth << ")"); if (depth > 16) { fatalf("WARNING: can't include %s: includes are nested too deeply (>16)!\n", file_name); return 1; @@ -537,7 +537,7 @@ if (tmp_line_len >= 9 && strncmp(tmp_line, "include", 7) == 0 && xisspace(tmp_line[7])) { err_count += parseManyConfigFiles(tmp_line + 8, depth + 1); } else if (!parse_line(tmp_line)) { - debugs(3, 0, HERE << cfg_filename << ":" << config_lineno << " unrecognized: '" << tmp_line << "'"); + debugs(3, DBG_CRITICAL, HERE << cfg_filename << ":" << config_lineno << " unrecognized: '" << tmp_line << "'"); ++err_count; } } @@ -633,7 +633,7 @@ #if SIZEOF_OFF_T <= 4 if (Config.Store.maxObjectSize > 0x7FFF0000) { - debugs(3, 0, "WARNING: This Squid binary can not handle files larger than 2GB. Limiting maximum_object_size to just below 2GB"); + debugs(3, DBG_CRITICAL, "WARNING: This Squid binary can not handle files larger than 2GB. Limiting maximum_object_size to just below 2GB"); Config.Store.maxObjectSize = 0x7FFF0000; } #endif @@ -642,7 +642,7 @@ (void) 0; else if (Store::Root().maxSize() < Config.memMaxSize) /* This is bogus. folk with NULL caches will want this */ - debugs(3, 0, "WARNING cache_mem is larger than total disk cache space!"); + debugs(3, DBG_CRITICAL, "WARNING cache_mem is larger than total disk cache space!"); if (Config.Announce.period > 0) { Config.onoff.announce = 1; @@ -744,7 +744,7 @@ if (!R->flags.override_expire) continue; - debugs(22, 1, "WARNING: use of 'override-expire' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'override-expire' in 'refresh_pattern' violates HTTP"); break; } @@ -753,7 +753,7 @@ if (!R->flags.override_lastmod) continue; - debugs(22, 1, "WARNING: use of 'override-lastmod' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'override-lastmod' in 'refresh_pattern' violates HTTP"); break; } @@ -762,7 +762,7 @@ if (!R->flags.reload_into_ims) continue; - debugs(22, 1, "WARNING: use of 'reload-into-ims' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'reload-into-ims' in 'refresh_pattern' violates HTTP"); break; } @@ -771,7 +771,7 @@ if (!R->flags.ignore_reload) continue; - debugs(22, 1, "WARNING: use of 'ignore-reload' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-reload' in 'refresh_pattern' violates HTTP"); break; } @@ -780,7 +780,7 @@ if (!R->flags.ignore_no_cache) continue; - debugs(22, 1, "WARNING: use of 'ignore-no-cache' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-no-cache' in 'refresh_pattern' violates HTTP"); break; } @@ -789,7 +789,7 @@ if (!R->flags.ignore_no_store) continue; - debugs(22, 1, "WARNING: use of 'ignore-no-store' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-no-store' in 'refresh_pattern' violates HTTP"); break; } @@ -797,7 +797,7 @@ for (R = Config.Refresh; R; R = R->next) { if (!R->flags.ignore_must_revalidate) continue; - debugs(22, 1, "WARNING: use of 'ignore-must-revalidate' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-must-revalidate' in 'refresh_pattern' violates HTTP"); break; } @@ -805,7 +805,7 @@ if (!R->flags.ignore_private) continue; - debugs(22, 1, "WARNING: use of 'ignore-private' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-private' in 'refresh_pattern' violates HTTP"); break; } @@ -814,7 +814,7 @@ if (!R->flags.ignore_auth) continue; - debugs(22, 1, "WARNING: use of 'ignore-auth' in 'refresh_pattern' violates HTTP"); + debugs(22, DBG_IMPORTANT, "WARNING: use of 'ignore-auth' in 'refresh_pattern' violates HTTP"); break; } @@ -826,7 +826,7 @@ #else if (!Config.onoff.via) - debugs(22, 1, "WARNING: HTTP requires the use of Via"); + debugs(22, DBG_IMPORTANT, "WARNING: HTTP requires the use of Via"); #endif @@ -893,13 +893,13 @@ HttpRequestMethod::Configure(Config); #if USE_SSL - debugs(3, 1, "Initializing https proxy context"); + debugs(3, DBG_IMPORTANT, "Initializing https proxy context"); Config.ssl_client.sslContext = sslCreateClientContext(Config.ssl_client.cert, Config.ssl_client.key, Config.ssl_client.version, Config.ssl_client.cipher, Config.ssl_client.options, Config.ssl_client.flags, Config.ssl_client.cafile, Config.ssl_client.capath, Config.ssl_client.crlfile); for (peer *p = Config.peers; p != NULL; p = p->next) { if (p->use_ssl) { - debugs(3, 1, "Initializing cache_peer " << p->name << " SSL context"); + debugs(3, DBG_IMPORTANT, "Initializing cache_peer " << p->name << " SSL context"); p->sslContext = sslCreateClientContext(p->sslcert, p->sslkey, p->sslversion, p->sslcipher, p->ssloptions, p->sslflags, p->sslcafile, p->sslcapath, p->sslcrlfile); } } @@ -908,12 +908,12 @@ if (!s->sslBump) continue; - debugs(3, 1, "Initializing http_port " << s->s << " SSL context"); + debugs(3, DBG_IMPORTANT, "Initializing http_port " << s->s << " SSL context"); s->configureSslServerContext(); } for (AnyP::PortCfg *s = Config.Sockaddr.https; s != NULL; s = s->next) { - debugs(3, 1, "Initializing https_port " << s->s << " SSL context"); + debugs(3, DBG_IMPORTANT, "Initializing https_port " << s->s << " SSL context"); s->configureSslServerContext(); } @@ -987,7 +987,7 @@ if (0 == d) (void) 0; else if ((token = strtok(NULL, w_space)) == NULL) - debugs(3, 0, "WARNING: No units on '" << + debugs(3, DBG_CRITICAL, "WARNING: No units on '" << config_input_line << "', assuming " << d << " " << units ); else if ((m = parseTimeUnits(token, allowMsec)) == 0) @@ -1029,7 +1029,7 @@ if (!strncasecmp(unit, T_DECADE_STR, strlen(T_DECADE_STR))) return static_cast(86400 * 1000 * 365.2522 * 10); - debugs(3, 1, "parseTimeUnits: unknown time unit '" << unit << "'"); + debugs(3, DBG_IMPORTANT, "parseTimeUnits: unknown time unit '" << unit << "'"); return 0; } @@ -1064,7 +1064,7 @@ if (0.0 == d) (void) 0; else if ((token = strtok(NULL, w_space)) == NULL) - debugs(3, 0, "WARNING: No units on '" << + debugs(3, DBG_CRITICAL, "WARNING: No units on '" << config_input_line << "', assuming " << d << " " << units ); else if ((m = parseBytesUnits(token)) == 0) { @@ -1109,7 +1109,7 @@ if (0.0 == d) (void) 0; else if ((token = strtok(NULL, w_space)) == NULL) - debugs(3, 0, "WARNING: No units on '" << + debugs(3, DBG_CRITICAL, "WARNING: No units on '" << config_input_line << "', assuming " << d << " " << units ); else if ((m = parseBytesUnits(token)) == 0) { @@ -1154,7 +1154,7 @@ if (0.0 == d) (void) 0; else if ((token = strtok(NULL, w_space)) == NULL) - debugs(3, 0, "WARNING: No units on '" << + debugs(3, DBG_CRITICAL, "WARNING: No units on '" << config_input_line << "', assuming " << d << " " << units ); else if ((m = parseBytesUnits(token)) == 0) { @@ -1699,8 +1699,8 @@ char *t = NULL; if ((t = strtok(NULL, w_space)) == NULL) { - debugs(3, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(3, 0, "parse_http_header_access: missing header name."); + debugs(3, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(3, DBG_CRITICAL, "parse_http_header_access: missing header name."); return; } @@ -1735,8 +1735,8 @@ char *t = NULL; if ((t = strtok(NULL, w_space)) == NULL) { - debugs(3, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(3, 0, "parse_http_header_replace: missing header name."); + debugs(3, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(3, DBG_CRITICAL, "parse_http_header_replace: missing header name."); return; } @@ -1880,7 +1880,7 @@ sd = dynamic_cast(swap->swapDirs[i].getRaw()); if (strcmp(sd->type(), StoreFileSystem::FileSystems().items[fs]->type()) != 0) { - debugs(3, 0, "ERROR: Can't change type of existing cache_dir " << + debugs(3, DBG_CRITICAL, "ERROR: Can't change type of existing cache_dir " << sd->type() << " " << sd->path << " to " << type_str << ". Restart required"); return; } @@ -2283,7 +2283,7 @@ } else if (strcmp(token, "connection-auth=auto") == 0) { p->connection_auth = 2; } else { - debugs(3, 0, "parse_peer: token='" << token << "'"); + debugs(3, DBG_CRITICAL, "parse_peer: token='" << token << "'"); self_destruct(); } } @@ -2391,7 +2391,7 @@ if (strcmp(w->key, u->key)) continue; - debugs(0, 0, "WARNING: action '" << u->key << "' (line " << config_lineno << ") already has a password"); + debugs(0, DBG_CRITICAL, "WARNING: action '" << u->key << "' (line " << config_lineno << ") already has a password"); } } } @@ -2468,7 +2468,7 @@ self_destruct(); if ((p = peerFindByName(host)) == NULL) { - debugs(15, 0, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); + debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); return; } @@ -2490,7 +2490,7 @@ peer *p; if ((p = peerFindByName(host)) == NULL) { - debugs(15, 0, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); + debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); continue; } @@ -2528,7 +2528,7 @@ peer *p; if ((p = peerFindByName(host)) == NULL) { - debugs(15, 0, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); + debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); return; } @@ -2792,14 +2792,14 @@ #endif } else - debugs(22, 0, "refreshAddToList: Unknown option '" << pattern << "': " << token); + debugs(22, DBG_CRITICAL, "refreshAddToList: Unknown option '" << pattern << "': " << token); } if ((errcode = regcomp(&comp, pattern, flags)) != 0) { char errbuf[256]; regerror(errcode, &comp, errbuf, sizeof errbuf); - debugs(22, 0, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); - debugs(22, 0, "refreshAddToList: Invalid regular expression '" << pattern << "': " << errbuf); + debugs(22, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line); + debugs(22, DBG_CRITICAL, "refreshAddToList: Invalid regular expression '" << pattern << "': " << errbuf); return; } @@ -3372,7 +3372,7 @@ if (!strcasecmp(s, "multicast")) return PEER_MULTICAST; - debugs(15, 0, "WARNING: Unknown neighbor type: " << s); + debugs(15, DBG_CRITICAL, "WARNING: Unknown neighbor type: " << s); return PEER_SIBLING; } @@ -4005,7 +4005,7 @@ cl->type = Log::Format::CLF_CUSTOM; cl->logFormat = lf; } else if (strcmp(logdef_name, "auto") == 0) { - debugs(0,0, "WARNING: Log format 'auto' no longer exists. Using 'squid' instead."); + debugs(0, DBG_CRITICAL, "WARNING: Log format 'auto' no longer exists. Using 'squid' instead."); cl->type = Log::Format::CLF_SQUID; } else if (strcmp(logdef_name, "squid") == 0) { cl->type = Log::Format::CLF_SQUID; @@ -4022,7 +4022,7 @@ } else if (strcmp(logdef_name, "referrer") == 0) { cl->type = Log::Format::CLF_REFERER; } else { - debugs(3, 0, "Log format '" << logdef_name << "' is not defined"); + debugs(3, DBG_CRITICAL, "Log format '" << logdef_name << "' is not defined"); self_destruct(); return; } @@ -4254,7 +4254,7 @@ static void parse_icap_class_type() { - debugs(93, 0, "WARNING: 'icap_class' is depricated. " << + debugs(93, DBG_CRITICAL, "WARNING: 'icap_class' is depricated. " << "Use 'adaptation_service_set' instead"); Adaptation::Config::ParseServiceSet(); } @@ -4262,7 +4262,7 @@ static void parse_icap_access_type() { - debugs(93, 0, "WARNING: 'icap_access' is depricated. " << + debugs(93, DBG_CRITICAL, "WARNING: 'icap_access' is depricated. " << "Use 'adaptation_access' instead"); Adaptation::Config::ParseAccess(LegacyParser); } @@ -4304,7 +4304,7 @@ return; if (strcmp(token,"in") != 0) { - debugs(3, 0, "expecting 'in' on'" << config_input_line << "'"); + debugs(3, DBG_CRITICAL, "expecting 'in' on'" << config_input_line << "'"); self_destruct(); } @@ -4319,7 +4319,7 @@ if (0 == d) (void) 0; else if ((token = strtok(NULL, w_space)) == NULL) { - debugs(3, 0, "No time-units on '" << config_input_line << "'"); + debugs(3, DBG_CRITICAL, "No time-units on '" << config_input_line << "'"); self_destruct(); } else if ((m = parseTimeUnits(token, false)) == 0) self_destruct(); === modified file 'src/client_db.cc' --- src/client_db.cc 2012-07-16 09:55:32 +0000 +++ src/client_db.cc 2012-08-02 21:18:43 +0000 @@ -137,7 +137,7 @@ c = (ClientInfo *) hash_lookup(client_table, key); if (c==NULL) { - debugs(77,1,"Client db does not contain information for given IP address "<<(const char*)key); + debugs(77, DBG_IMPORTANT,"Client db does not contain information for given IP address "<<(const char*)key); return NULL; } return c; @@ -255,12 +255,12 @@ if (p < 95.0) return 0; - debugs(1, 0, "WARNING: Probable misconfigured neighbor at " << key); + debugs(1, DBG_CRITICAL, "WARNING: Probable misconfigured neighbor at " << key); - debugs(1, 0, "WARNING: " << ND << " of the last " << NR << + debugs(1, DBG_CRITICAL, "WARNING: " << ND << " of the last " << NR << " ICP replies are DENIED"); - debugs(1, 0, "WARNING: No replies will be sent for the next " << + debugs(1, DBG_CRITICAL, "WARNING: No replies will be sent for the next " << CUTOFF_SECONDS << " seconds"); c->cutoff.time = squid_curtime; === modified file 'src/client_side.cc' --- src/client_side.cc 2012-07-23 15:34:12 +0000 +++ src/client_side.cc 2012-08-02 21:10:18 +0000 @@ -802,10 +802,10 @@ debugs(33, 3, HERE << clientConnection); if (isOpen()) - debugs(33, 1, "BUG: ConnStateData did not close " << clientConnection); + debugs(33, DBG_IMPORTANT, "BUG: ConnStateData did not close " << clientConnection); if (!flags.swanSang) - debugs(33, 1, "BUG: ConnStateData was not destroyed properly; " << clientConnection); + debugs(33, DBG_IMPORTANT, "BUG: ConnStateData was not destroyed properly; " << clientConnection); cbdataReferenceDone(port); @@ -1200,7 +1200,7 @@ return 0; /* entity has no etag to compare with! */ if (spec.tag.weak || rep_tag.weak) { - debugs(33, 1, "clientIfRangeMatch: Weak ETags are not allowed in If-Range: " << spec.tag.str << " ? " << rep_tag.str); + debugs(33, DBG_IMPORTANT, "clientIfRangeMatch: Weak ETags are not allowed in If-Range: " << spec.tag.str << " ? " << rep_tag.str); return 0; /* must use strong validator for sub-range requests */ } @@ -2206,7 +2206,7 @@ if (*method_p == METHOD_NONE) { /* XXX need a way to say "this many character length string" */ - debugs(33, 1, "clientParseRequestMethod: Unsupported method in request '" << hp->buf << "'"); + debugs(33, DBG_IMPORTANT, "clientParseRequestMethod: Unsupported method in request '" << hp->buf << "'"); hp->request_parse_status = HTTP_METHOD_NOT_ALLOWED; return parseHttpRequestAbort(csd, "error:unsupported-request-method"); } @@ -3275,7 +3275,7 @@ static int reported = 0; if (!reported) { - debugs(33, 1, "Notice: httpd_accel_no_pmtu_disc not supported on your platform"); + debugs(33, DBG_IMPORTANT, "Notice: httpd_accel_no_pmtu_disc not supported on your platform"); reported = 1; } #endif @@ -3459,12 +3459,12 @@ } case SSL_ERROR_ZERO_RETURN: - debugs(83, 1, "clientNegotiateSSL: Error negotiating SSL connection on FD " << fd << ": Closed by client"); + debugs(83, DBG_IMPORTANT, "clientNegotiateSSL: Error negotiating SSL connection on FD " << fd << ": Closed by client"); comm_close(fd); return; default: - debugs(83, 1, "clientNegotiateSSL: Error negotiating SSL connection on FD " << + debugs(83, DBG_IMPORTANT, "clientNegotiateSSL: Error negotiating SSL connection on FD " << fd << ": " << ERR_error_string(ERR_get_error(), NULL) << " (" << ssl_error << "/" << ret << ")"); comm_close(fd); @@ -3678,7 +3678,7 @@ ConnStateData::sslCrtdHandleReply(const char * reply) { if (!reply) { - debugs(1, 1, HERE << "\"ssl_crtd\" helper return reply"); + debugs(1, DBG_IMPORTANT, HERE << "\"ssl_crtd\" helper return reply"); } else { Ssl::CrtdMessage reply_message; if (reply_message.parse(reply, strlen(reply)) != Ssl::CrtdMessage::OK) { @@ -3865,7 +3865,7 @@ // If generated ssl context = NULL, try to use static ssl context. if (!sslContext) { if (!port->staticSslContext) { - debugs(83, 1, "Closing SSL " << clientConnection->remote << " as lacking SSL context"); + debugs(83, DBG_IMPORTANT, "Closing SSL " << clientConnection->remote << " as lacking SSL context"); clientConnection->close(); return; } else { @@ -3991,8 +3991,8 @@ for (s = Config.Sockaddr.http; s; s = s->next) { if (MAXTCPLISTENPORTS == NHttpSockets) { - debugs(1, 1, "WARNING: You have too many 'http_port' lines."); - debugs(1, 1, " The limit is " << MAXTCPLISTENPORTS << " HTTP ports."); + debugs(1, DBG_IMPORTANT, "WARNING: You have too many 'http_port' lines."); + debugs(1, DBG_IMPORTANT, " The limit is " << MAXTCPLISTENPORTS << " HTTP ports."); continue; } @@ -4040,13 +4040,13 @@ for (s = Config.Sockaddr.https; s; s = s->next) { if (MAXTCPLISTENPORTS == NHttpSockets) { - debugs(1, 1, "Ignoring 'https_port' lines exceeding the limit."); - debugs(1, 1, "The limit is " << MAXTCPLISTENPORTS << " HTTPS ports."); + debugs(1, DBG_IMPORTANT, "Ignoring 'https_port' lines exceeding the limit."); + debugs(1, DBG_IMPORTANT, "The limit is " << MAXTCPLISTENPORTS << " HTTPS ports."); continue; } if (!s->staticSslContext) { - debugs(1, 1, "Ignoring https_port " << s->s << + debugs(1, DBG_IMPORTANT, "Ignoring https_port " << s->s << " due to SSL initialization failure."); continue; } @@ -4101,7 +4101,7 @@ // TCP: setup a job to handle accept() with subscribed handler AsyncJob::Start(new Comm::TcpAcceptor(s->listenConn, FdNote(portTypeNote), sub)); - debugs(1, 1, "Accepting " << + debugs(1, DBG_IMPORTANT, "Accepting " << (s->intercepted ? "NAT intercepted " : "") << (s->spoof_client_ip ? "TPROXY spoofing " : "") << (s->sslBump ? "SSL bumped " : "") << @@ -4129,7 +4129,7 @@ { for (AnyP::PortCfg *s = Config.Sockaddr.http; s; s = s->next) { if (s->listenConn != NULL) { - debugs(1, 1, "Closing HTTP port " << s->listenConn->local); + debugs(1, DBG_IMPORTANT, "Closing HTTP port " << s->listenConn->local); s->listenConn->close(); s->listenConn = NULL; } @@ -4138,7 +4138,7 @@ #if USE_SSL for (AnyP::PortCfg *s = Config.Sockaddr.https; s; s = s->next) { if (s->listenConn != NULL) { - debugs(1, 1, "Closing HTTPS port " << s->listenConn->local); + debugs(1, DBG_IMPORTANT, "Closing HTTPS port " << s->listenConn->local); s->listenConn->close(); s->listenConn = NULL; } @@ -4167,7 +4167,7 @@ if (!has_vary || !entry->mem_obj->vary_headers) { if (vary) { /* Oops... something odd is going on here.. */ - debugs(33, 1, "varyEvaluateMatch: Oops. Not a Vary object on second attempt, '" << + debugs(33, DBG_IMPORTANT, "varyEvaluateMatch: Oops. Not a Vary object on second attempt, '" << entry->mem_obj->url << "' '" << vary << "'"); safe_free(request->vary_headers); return VARY_CANCEL; @@ -4209,7 +4209,7 @@ /* Oops.. we have already been here and still haven't * found the requested variant. Bail out */ - debugs(33, 1, "varyEvaluateMatch: Oops. Not a Vary match on second attempt, '" << + debugs(33, DBG_IMPORTANT, "varyEvaluateMatch: Oops. Not a Vary match on second attempt, '" << entry->mem_obj->url << "' '" << vary << "'"); return VARY_CANCEL; } === modified file 'src/client_side.h' --- src/client_side.h 2012-07-19 00:12:22 +0000 +++ src/client_side.h 2012-08-04 12:11:57 +0000 @@ -147,7 +147,6 @@ void wroteControlMsg(const Comm::ConnectionPointer &conn, char *bufnotused, size_t size, comm_err_t errflag, int xerrno); private: - CBDATA_CLASS(ClientSocketContext); void prepareReply(HttpReply * rep); void packChunk(const StoreIOBuffer &bodyData, MemBuf &mb); void packRange(StoreIOBuffer const &, MemBuf * mb); @@ -159,6 +158,7 @@ bool mayUseConnection_; /* This request may use the connection. Don't read anymore requests for now */ bool connRegistered_; + CBDATA_CLASS(ClientSocketContext); }; @@ -380,7 +380,6 @@ HttpParser parser_; // XXX: CBDATA plays with public/private and leaves the following 'private' fields all public... :( - CBDATA_CLASS2(ConnStateData); #if USE_SSL bool switchedToHttps_; @@ -401,6 +400,7 @@ AsyncCall::Pointer reader; ///< set when we are reading BodyPipe::Pointer bodyPipe; // set when we are reading request body + CBDATA_CLASS2(ConnStateData); }; /* convenience class while splitting up body handling */ === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2012-07-22 03:15:02 +0000 +++ src/client_side_reply.cc 2012-08-02 21:18:43 +0000 @@ -300,7 +300,7 @@ /* Register with storage manager to receive updates when data comes in. */ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) - debugs(88, 0, "clientReplyContext::processExpired: Found ENTRY_ABORTED object"); + debugs(88, DBG_CRITICAL, "clientReplyContext::processExpired: Found ENTRY_ABORTED object"); { /* start counting the length from 0 */ @@ -493,7 +493,7 @@ assert(http->logType == LOG_TCP_HIT); if (strcmp(e->mem_obj->url, urlCanonical(r)) != 0) { - debugs(33, 1, "clientProcessHit: URL mismatch, '" << e->mem_obj->url << "' != '" << urlCanonical(r) << "'"); + debugs(33, DBG_IMPORTANT, "clientProcessHit: URL mismatch, '" << e->mem_obj->url << "' != '" << urlCanonical(r) << "'"); processMiss(); return; } @@ -524,7 +524,7 @@ case VARY_CANCEL: /* varyEvaluateMatch found a object loop. Process as miss */ - debugs(88, 1, "clientProcessHit: Vary object loop!"); + debugs(88, DBG_IMPORTANT, "clientProcessHit: Vary object loop!"); processMiss(); return; } @@ -623,8 +623,8 @@ */ if (http->storeEntry()) { if (EBIT_TEST(http->storeEntry()->flags, ENTRY_SPECIAL)) { - debugs(88, 0, "clientProcessMiss: miss on a special object (" << url << ")."); - debugs(88, 0, "\tlog_type = " << Format::log_tags[http->logType]); + debugs(88, DBG_CRITICAL, "clientProcessMiss: miss on a special object (" << url << ")."); + debugs(88, DBG_CRITICAL, "\tlog_type = " << Format::log_tags[http->logType]); http->storeEntry()->dump(1); } @@ -1120,18 +1120,18 @@ { #if SIZEOF_INT64_T == 4 if (http->out.size > 0x7FFF0000) { - debugs(88, 1, "WARNING: closing FD " << fd << " to prevent out.size counter overflow"); - debugs(88, 1, "\tclient " << http->getConn()->peer); - debugs(88, 1, "\treceived " << http->out.size << " bytes"); - debugs(88, 1, "\tURI " << http->log_uri); + debugs(88, DBG_IMPORTANT, "WARNING: closing FD " << fd << " to prevent out.size counter overflow"); + debugs(88, DBG_IMPORTANT, "\tclient " << http->getConn()->peer); + debugs(88, DBG_IMPORTANT, "\treceived " << http->out.size << " bytes"); + debugs(88, DBG_IMPORTANT, "\tURI " << http->log_uri); return 1; } if (http->out.offset > 0x7FFF0000) { - debugs(88, 1, "WARNING: closing FD " << fd < " to prevent out.offset counter overflow"); - debugs(88, 1, "\tclient " << http->getConn()->peer); - debugs(88, 1, "\treceived " << http->out.size << " bytes, offset " << http->out.offset); - debugs(88, 1, "\tURI " << http->log_uri); + debugs(88, DBG_IMPORTANT, "WARNING: closing FD " << fd < " to prevent out.offset counter overflow"); + debugs(88, DBG_IMPORTANT, "\tclient " << http->getConn()->peer); + debugs(88, DBG_IMPORTANT, "\treceived " << http->out.size << " bytes, offset " << http->out.offset); + debugs(88, DBG_IMPORTANT, "\tURI " << http->log_uri); return 1; } === modified file 'src/client_side_reply.h' --- src/client_side_reply.h 2012-06-19 21:51:49 +0000 +++ src/client_side_reply.h 2012-08-04 12:11:57 +0000 @@ -120,7 +120,6 @@ clientStreamNode *ourNode; /* This will go away if/when this file gets refactored some more */ private: - CBDATA_CLASS(clientReplyContext); clientStreamNode *getNextNode() const; void makeThisHead(); bool errorInStream(StoreIOBuffer const &result, size_t const &sizeToProcess)const ; @@ -153,6 +152,7 @@ StoreEntry *old_entry; store_client *old_sc; /* ... for entry to be validated */ bool deleting; + CBDATA_CLASS(clientReplyContext); }; #endif /* SQUID_CLIENTSIDEREPLY_H */ === modified file 'src/client_side_request.h' --- src/client_side_request.h 2012-07-18 16:21:47 +0000 +++ src/client_side_request.h 2012-08-04 12:11:57 +0000 @@ -148,7 +148,6 @@ #endif private: - CBDATA_CLASS(ClientHttpRequest); int64_t maxReplyBodySize_; StoreEntry *entry_; StoreEntry *loggingEntry_; @@ -200,6 +199,8 @@ bool request_satisfaction_mode; int64_t request_satisfaction_offset; #endif +private: + CBDATA_CLASS(ClientHttpRequest); }; /* client http based routines */ === modified file 'src/comm.cc' --- src/comm.cc 2012-07-17 17:38:50 +0000 +++ src/comm.cc 2012-08-02 21:10:18 +0000 @@ -385,7 +385,7 @@ temp.InitAddrInfo(addr); if (getsockname(fd, addr->ai_addr, &(addr->ai_addrlen)) ) { - debugs(50, 1, "comm_local_port: Failed to retrieve TCP/UDP port number for socket: FD " << fd << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "comm_local_port: Failed to retrieve TCP/UDP port number for socket: FD " << fd << ": " << xstrerror()); temp.FreeAddrInfo(addr); return 0; } @@ -475,7 +475,7 @@ { #ifdef IPV6_V6ONLY if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &tos, sizeof(int)) < 0) { - debugs(50, 1, "comm_open: setsockopt(IPV6_V6ONLY) " << (tos?"ON":"OFF") << " for FD " << fd << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "comm_open: setsockopt(IPV6_V6ONLY) " << (tos?"ON":"OFF") << " for FD " << fd << ": " << xstrerror()); } #else debugs(50, 0, "WARNING: comm_open: setsockopt(IPV6_V6ONLY) not supported on this platform"); @@ -661,7 +661,7 @@ if ( (flags & COMM_DOBIND) || addr.GetPort() > 0 || !addr.IsAnyAddr() ) { if ( !(flags & COMM_DOBIND) && addr.IsAnyAddr() ) - debugs(5,1,"WARNING: Squid is attempting to bind() port " << addr << " without being a listener."); + debugs(5, DBG_IMPORTANT,"WARNING: Squid is attempting to bind() port " << addr << " without being a listener."); if ( addr.IsNoAddr() ) debugs(5,0,"CRITICAL: Squid is attempting to bind() port " << addr << "!!"); @@ -915,9 +915,9 @@ F->remote_port = address.GetPort(); /* remote_port is HS */ if (status == COMM_OK) { - debugs(5, 10, "comm_connect_addr: FD " << sock << " connected to " << address); + debugs(5, DBG_DATA, "comm_connect_addr: FD " << sock << " connected to " << address); } else if (status == COMM_INPROGRESS) { - debugs(5, 10, "comm_connect_addr: FD " << sock << " connection pending"); + debugs(5, DBG_DATA, "comm_connect_addr: FD " << sock << " connection pending"); } return status; @@ -1192,7 +1192,7 @@ if (ECONNREFUSED != errno) #endif - debugs(50, 1, "comm_udp_sendto: FD " << fd << ", (family=" << fd_table[fd].sock_family << ") " << to_addr << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "comm_udp_sendto: FD " << fd << ", (family=" << fd_table[fd].sock_family << ") " << to_addr << ": " << xstrerror()); return COMM_ERROR; } @@ -1288,19 +1288,19 @@ int on = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0) - debugs(50, 1, "commSetReuseAddr: FD " << fd << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "commSetReuseAddr: FD " << fd << ": " << xstrerror()); } static void commSetTcpRcvbuf(int fd, int size) { if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size)) < 0) - debugs(50, 1, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size)) < 0) - debugs(50, 1, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); #ifdef TCP_WINDOW_CLAMP if (setsockopt(fd, SOL_TCP, TCP_WINDOW_CLAMP, (char *) &size, sizeof(size)) < 0) - debugs(50, 1, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "commSetTcpRcvbuf: FD " << fd << ", SIZE " << size << ": " << xstrerror()); #endif } @@ -1401,7 +1401,7 @@ int on = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) < 0) - debugs(50, 1, "commSetTcpNoDelay: FD " << fd << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "commSetTcpNoDelay: FD " << fd << ": " << xstrerror()); fd_table[fd].flags.nodelay = 1; } @@ -1416,23 +1416,23 @@ if (timeout && interval) { int count = (timeout + interval - 1) / interval; if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &count, sizeof(on)) < 0) - debugs(5, 1, "commSetKeepalive: FD " << fd << ": " << xstrerror()); + debugs(5, DBG_IMPORTANT, "commSetKeepalive: FD " << fd << ": " << xstrerror()); } #endif #ifdef TCP_KEEPIDLE if (idle) { if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(on)) < 0) - debugs(5, 1, "commSetKeepalive: FD " << fd << ": " << xstrerror()); + debugs(5, DBG_IMPORTANT, "commSetKeepalive: FD " << fd << ": " << xstrerror()); } #endif #ifdef TCP_KEEPINTVL if (interval) { if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(on)) < 0) - debugs(5, 1, "commSetKeepalive: FD " << fd << ": " << xstrerror()); + debugs(5, DBG_IMPORTANT, "commSetKeepalive: FD " << fd << ": " << xstrerror()); } #endif if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) < 0) - debugs(5, 1, "commSetKeepalive: FD " << fd << ": " << xstrerror()); + debugs(5, DBG_IMPORTANT, "commSetKeepalive: FD " << fd << ": " << xstrerror()); } void === modified file 'src/comm/Connection.cc' --- src/comm/Connection.cc 2012-07-10 15:44:23 +0000 +++ src/comm/Connection.cc 2012-08-02 21:18:43 +0000 @@ -27,8 +27,8 @@ Comm::Connection::~Connection() { if (fd >= 0) { - debugs(5, 0, "BUG: Orphan Comm::Connection: " << *this); - debugs(5, 0, "NOTE: " << ++lost_conn << " Orphans since last started."); + debugs(5, DBG_CRITICAL, "BUG: Orphan Comm::Connection: " << *this); + debugs(5, DBG_CRITICAL, "NOTE: " << ++lost_conn << " Orphans since last started."); close(); } === modified file 'src/comm/ModKqueue.cc' --- src/comm/ModKqueue.cc 2012-07-02 12:37:13 +0000 +++ src/comm/ModKqueue.cc 2012-08-02 21:10:18 +0000 @@ -316,7 +316,7 @@ default: /* Bad! -- adrian */ - debugs(5, 1, "comm_select: kevent returned " << ke[i].filter << "!"); + debugs(5, DBG_IMPORTANT, "comm_select: kevent returned " << ke[i].filter << "!"); break; } } === modified file 'src/comm/ModPoll.cc' --- src/comm/ModPoll.cc 2012-07-06 10:18:43 +0000 +++ src/comm/ModPoll.cc 2012-08-02 21:18:43 +0000 @@ -259,7 +259,7 @@ fd_table[fd].read_handler = NULL; hdl(fd, fd_table[fd].read_data); } else if (pfds[i].events & POLLRDNORM) - debugs(5, 1, "comm_poll_incoming: FD " << fd << " NULL read handler"); + debugs(5, DBG_IMPORTANT, "comm_poll_incoming: FD " << fd << " NULL read handler"); } if (revents & (POLLWRNORM | POLLOUT | POLLHUP | POLLERR)) { @@ -267,7 +267,7 @@ fd_table[fd].write_handler = NULL; hdl(fd, fd_table[fd].write_data); } else if (pfds[i].events & POLLWRNORM) - debugs(5, 1, "comm_poll_incoming: FD " << fd << " NULL write_handler"); + debugs(5, DBG_IMPORTANT, "comm_poll_incoming: FD " << fd << " NULL write_handler"); } } @@ -441,7 +441,7 @@ if (ignoreErrno(errno)) continue; - debugs(5, 0, "comm_poll: poll failure: " << xstrerror()); + debugs(5, DBG_CRITICAL, "comm_poll: poll failure: " << xstrerror()); assert(errno != EINVAL); @@ -539,19 +539,19 @@ if (revents & POLLNVAL) { AsyncCall::Pointer ch; - debugs(5, 0, "WARNING: FD " << fd << " has handlers, but it's invalid."); - debugs(5, 0, "FD " << fd << " is a " << fdTypeStr[F->type]); - debugs(5, 0, "--> " << F->desc); - debugs(5, 0, "tmout:" << F->timeoutHandler << "read:" << + debugs(5, DBG_CRITICAL, "WARNING: FD " << fd << " has handlers, but it's invalid."); + debugs(5, DBG_CRITICAL, "FD " << fd << " is a " << fdTypeStr[F->type]); + debugs(5, DBG_CRITICAL, "--> " << F->desc); + debugs(5, DBG_CRITICAL, "tmout:" << F->timeoutHandler << "read:" << F->read_handler << " write:" << F->write_handler); for (ch = F->closeHandler; ch != NULL; ch = ch->Next()) - debugs(5, 0, " close handler: " << ch); + debugs(5, DBG_CRITICAL, " close handler: " << ch); if (F->closeHandler != NULL) { commCallCloseHandlers(fd); } else if (F->timeoutHandler != NULL) { - debugs(5, 0, "comm_poll: Calling Timeout Handler"); + debugs(5, DBG_CRITICAL, "comm_poll: Calling Timeout Handler"); ScheduleCallHere(F->timeoutHandler); } === modified file 'src/comm/ModSelect.cc' --- src/comm/ModSelect.cc 2012-07-06 12:19:11 +0000 +++ src/comm/ModSelect.cc 2012-08-02 21:18:43 +0000 @@ -252,7 +252,7 @@ commUpdateReadBits(fd, NULL); hdl(fd, fd_table[fd].read_data); } else { - debugs(5, 1, "comm_select_incoming: FD " << fd << " NULL read handler"); + debugs(5, DBG_IMPORTANT, "comm_select_incoming: FD " << fd << " NULL read handler"); } } @@ -262,7 +262,7 @@ commUpdateWriteBits(fd, NULL); hdl(fd, fd_table[fd].write_data); } else { - debugs(5, 1, "comm_select_incoming: FD " << fd << " NULL write handler"); + debugs(5, DBG_IMPORTANT, "comm_select_incoming: FD " << fd << " NULL write handler"); } } } @@ -459,7 +459,7 @@ if (ignoreErrno(errno)) break; - debugs(5, 0, "comm_select: select failure: " << xstrerror()); + debugs(5, DBG_CRITICAL, "comm_select: select failure: " << xstrerror()); examine_select(&readfds, &writefds); @@ -708,7 +708,7 @@ fde *F = NULL; struct stat sb; - debugs(5, 0, "examine_select: Examining open file descriptors..."); + debugs(5, DBG_CRITICAL, "examine_select: Examining open file descriptors..."); for (fd = 0; fd < Squid_MaxFD; ++fd) { FD_ZERO(&read_x); @@ -731,18 +731,18 @@ } F = &fd_table[fd]; - debugs(5, 0, "FD " << fd << ": " << xstrerror()); - debugs(5, 0, "WARNING: FD " << fd << " has handlers, but it's invalid."); - debugs(5, 0, "FD " << fd << " is a " << fdTypeStr[F->type] << " called '" << F->desc << "'"); - debugs(5, 0, "tmout:" << F->timeoutHandler << " read:" << F->read_handler << " write:" << F->write_handler); + debugs(5, DBG_CRITICAL, "FD " << fd << ": " << xstrerror()); + debugs(5, DBG_CRITICAL, "WARNING: FD " << fd << " has handlers, but it's invalid."); + debugs(5, DBG_CRITICAL, "FD " << fd << " is a " << fdTypeStr[F->type] << " called '" << F->desc << "'"); + debugs(5, DBG_CRITICAL, "tmout:" << F->timeoutHandler << " read:" << F->read_handler << " write:" << F->write_handler); for (ch = F->closeHandler; ch != NULL; ch = ch->Next()) - debugs(5, 0, " close handler: " << ch); + debugs(5, DBG_CRITICAL, " close handler: " << ch); if (F->closeHandler != NULL) { commCallCloseHandlers(fd); } else if (F->timeoutHandler != NULL) { - debugs(5, 0, "examine_select: Calling Timeout Handler"); + debugs(5, DBG_CRITICAL, "examine_select: Calling Timeout Handler"); ScheduleCallHere(F->timeoutHandler); } === modified file 'src/comm/ModSelectWin32.cc' --- src/comm/ModSelectWin32.cc 2012-07-23 19:37:47 +0000 +++ src/comm/ModSelectWin32.cc 2012-08-02 21:18:43 +0000 @@ -255,7 +255,7 @@ commUpdateReadBits(fd, NULL); hdl(fd, fd_table[fd].read_data); } else { - debugs(5, 1, "comm_select_incoming: FD " << fd << " NULL read handler"); + debugs(5, DBG_IMPORTANT, "comm_select_incoming: FD " << fd << " NULL read handler"); } } @@ -265,7 +265,7 @@ commUpdateWriteBits(fd, NULL); hdl(fd, fd_table[fd].write_data); } else { - debugs(5, 1, "comm_select_incoming: FD " << fd << " NULL write handler"); + debugs(5, DBG_IMPORTANT, "comm_select_incoming: FD " << fd << " NULL write handler"); } } } @@ -459,7 +459,7 @@ if (ignoreErrno(errno)) break; - debugs(5, 0, "comm_select: select failure: " << xstrerror()); + debugs(5, DBG_CRITICAL, "comm_select: select failure: " << xstrerror()); examine_select(&readfds, &writefds); @@ -728,7 +728,7 @@ fde *F = NULL; struct stat sb; - debugs(5, 0, "examine_select: Examining open file descriptors..."); + debugs(5, DBG_CRITICAL, "examine_select: Examining open file descriptors..."); for (fd = 0; fd < Squid_MaxFD; ++fd) { FD_ZERO(&read_x); @@ -751,18 +751,18 @@ } F = &fd_table[fd]; - debugs(5, 0, "FD " << fd << ": " << xstrerror()); - debugs(5, 0, "WARNING: FD " << fd << " has handlers, but it's invalid."); - debugs(5, 0, "FD " << fd << " is a " << fdTypeStr[F->type] << " called '" << F->desc << "'"); - debugs(5, 0, "tmout:" << F->timeoutHandler << " read:" << F->read_handler << " write:" << F->write_handler); + debugs(5, DBG_CRITICAL, "FD " << fd << ": " << xstrerror()); + debugs(5, DBG_CRITICAL, "WARNING: FD " << fd << " has handlers, but it's invalid."); + debugs(5, DBG_CRITICAL, "FD " << fd << " is a " << fdTypeStr[F->type] << " called '" << F->desc << "'"); + debugs(5, DBG_CRITICAL, "tmout:" << F->timeoutHandler << " read:" << F->read_handler << " write:" << F->write_handler); for (ch = F->closeHandler; ch != NULL; ch = ch->Next()) - debugs(5, 0, " close handler: " << ch); + debugs(5, DBG_CRITICAL, " close handler: " << ch); if (F->closeHandler != NULL) { commCallCloseHandlers(fd); } else if (F->timeoutHandler != NULL) { - debugs(5, 0, "examine_select: Calling Timeout Handler"); + debugs(5, DBG_CRITICAL, "examine_select: Calling Timeout Handler"); ScheduleCallHere(F->timeoutHandler); } === modified file 'src/comm/TcpAcceptor.cc' --- src/comm/TcpAcceptor.cc 2012-01-20 18:55:04 +0000 +++ src/comm/TcpAcceptor.cc 2012-08-02 21:10:18 +0000 @@ -317,7 +317,7 @@ debugs(50, 3, HERE << status() << ": " << xstrerror()); return COMM_ERROR; } else { - debugs(50, 1, HERE << status() << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, HERE << status() << ": " << xstrerror()); return COMM_ERROR; } } === modified file 'src/comm/Write.cc' --- src/comm/Write.cc 2012-01-20 18:55:04 +0000 +++ src/comm/Write.cc 2012-08-02 21:10:18 +0000 @@ -98,7 +98,7 @@ /* we wrote data - drain them from bucket */ clientInfo->bucketSize -= len; if (clientInfo->bucketSize < 0.0) { - debugs(5,1, HERE << "drained too much"); // should not happen + debugs(5, DBG_IMPORTANT, HERE << "drained too much"); // should not happen clientInfo->bucketSize = 0; } } === modified file 'src/debug.cc' --- src/debug.cc 2012-07-20 15:31:04 +0000 +++ src/debug.cc 2012-08-02 21:18:43 +0000 @@ -561,7 +561,7 @@ void xassert(const char *msg, const char *file, int line) { - debugs(0, 0, "assertion failed: " << file << ":" << line << ": \"" << msg << "\""); + debugs(0, DBG_CRITICAL, "assertion failed: " << file << ":" << line << ": \"" << msg << "\""); if (!shutting_down) abort(); @@ -670,7 +670,7 @@ Ctx_Descrs[Ctx_Current_Level] = descr; if (Ctx_Current_Level == Ctx_Warn_Level) { - debugs(0, 0, "# ctx: suspiciously deep (" << Ctx_Warn_Level << ") nesting:"); + debugs(0, DBG_CRITICAL, "# ctx: suspiciously deep (" << Ctx_Warn_Level << ") nesting:"); Ctx_Warn_Level *= 2; } === modified file 'src/delay_pools.cc' --- src/delay_pools.cc 2012-07-17 17:38:50 +0000 +++ src/delay_pools.cc 2012-08-02 21:18:43 +0000 @@ -672,7 +672,7 @@ DelayPools::pools(unsigned short newPools) { if (pools()) { - debugs(3, 0, "parse_delay_pool_count: multiple delay_pools lines, aborting all previous delay_pools config"); + debugs(3, DBG_CRITICAL, "parse_delay_pool_count: multiple delay_pools lines, aborting all previous delay_pools config"); FreePools(); } === modified file 'src/disk.cc' --- src/disk.cc 2012-07-17 17:38:50 +0000 +++ src/disk.cc 2012-08-02 21:10:18 +0000 @@ -254,7 +254,7 @@ if (len < 0) { if (!ignoreErrno(errno)) { status = errno == ENOSPC ? DISK_NO_SPACE_LEFT : DISK_ERROR; - debugs(50, 1, "diskHandleWrite: FD " << fd << ": disk write error: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "diskHandleWrite: FD " << fd << ": disk write error: " << xstrerror()); /* * If there is no write callback, then this file is @@ -299,7 +299,7 @@ q->buf_offset += len; if (q->buf_offset > q->len) - debugs(50, 1, "diskHandleWriteComplete: q->buf_offset > q->len (" << + debugs(50, DBG_IMPORTANT, "diskHandleWriteComplete: q->buf_offset > q->len (" << q << "," << (int) q->buf_offset << ", " << q->len << ", " << len << " FD " << fd << ")"); @@ -464,7 +464,7 @@ return; } - debugs(50, 1, "diskHandleRead: FD " << fd << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "diskHandleRead: FD " << fd << ": " << xstrerror()); len = 0; rc = DISK_ERROR; } else if (len == 0) { @@ -510,7 +510,7 @@ ++ statCounter.syscalls.disk.unlinks; if (unlink(s) < 0 && !quiet) - debugs(50, 1, "safeunlink: Couldn't delete " << s << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "safeunlink: Couldn't delete " << s << ": " << xstrerror()); } /* === modified file 'src/dns.cc' --- src/dns.cc 2012-01-20 18:55:04 +0000 +++ src/dns.cc 2012-08-02 21:10:18 +0000 @@ -128,7 +128,7 @@ if (squid_curtime - first_warn > 3 * 60) fatal("DNS servers not responding for 3 minutes"); - debugs(34, 1, "dnsSubmit: queue overload, rejecting " << lookup); + debugs(34, DBG_IMPORTANT, "dnsSubmit: queue overload, rejecting " << lookup); callback(data, (char *)"$fail Temporary network problem, please retry later"); === modified file 'src/dns_internal.cc' --- src/dns_internal.cc 2012-07-20 15:31:04 +0000 +++ src/dns_internal.cc 2012-08-02 21:18:43 +0000 @@ -258,14 +258,14 @@ Ip::Address A; if (!(A = buf)) { - debugs(78, 0, "WARNING: rejecting '" << buf << "' as a name server, because it is not a numeric IP address"); + debugs(78, DBG_CRITICAL, "WARNING: rejecting '" << buf << "' as a name server, because it is not a numeric IP address"); return; } if (A.IsAnyAddr()) { - debugs(78, 0, "WARNING: Squid does not accept " << A << " in DNS server specifications."); + debugs(78, DBG_CRITICAL, "WARNING: Squid does not accept " << A << " in DNS server specifications."); A.SetLocalhost(); - debugs(78, 0, "Will be using " << A << " instead, assuming you meant that DNS is running on the same machine"); + debugs(78, DBG_CRITICAL, "Will be using " << A << " instead, assuming you meant that DNS is running on the same machine"); } if (!Ip::EnableIpv6 && !A.SetIPv4()) { @@ -353,7 +353,7 @@ wordlist *w; for (w = Config.dns_nameservers; w; w = w->next) { - debugs(78, 1, "Adding nameserver " << w->key << " from squid.conf"); + debugs(78, DBG_IMPORTANT, "Adding nameserver " << w->key << " from squid.conf"); idnsAddNameserver(w->key); } } @@ -368,7 +368,7 @@ fp = fopen(_PATH_RESCONF, "r"); if (fp == NULL) { - debugs(78, 1, "" << _PATH_RESCONF << ": " << xstrerror()); + debugs(78, DBG_IMPORTANT, "" << _PATH_RESCONF << ": " << xstrerror()); return; } @@ -387,7 +387,7 @@ if (NULL == t) continue; - debugs(78, 1, "Adding nameserver " << t << " from " << _PATH_RESCONF); + debugs(78, DBG_IMPORTANT, "Adding nameserver " << t << " from " << _PATH_RESCONF); idnsAddNameserver(t); } else if (strcasecmp(t, "domain") == 0) { @@ -397,7 +397,7 @@ if (NULL == t) continue; - debugs(78, 1, "Adding domain " << t << " from " << _PATH_RESCONF); + debugs(78, DBG_IMPORTANT, "Adding domain " << t << " from " << _PATH_RESCONF); idnsAddPathComponent(t); } else if (strcasecmp(t, "search") == 0) { @@ -408,7 +408,7 @@ if (NULL == t) continue; - debugs(78, 1, "Adding domain " << t << " from " << _PATH_RESCONF); + debugs(78, DBG_IMPORTANT, "Adding domain " << t << " from " << _PATH_RESCONF); idnsAddPathComponent(t); } @@ -425,7 +425,7 @@ if (ndots < 1) ndots = 1; - debugs(78, 1, "Adding ndots " << ndots << " from " << _PATH_RESCONF); + debugs(78, DBG_IMPORTANT, "Adding ndots " << ndots << " from " << _PATH_RESCONF); } } } @@ -458,7 +458,7 @@ if (Result == ERROR_SUCCESS && Size) { t = (char *) xmalloc(Size); RegQueryValueEx(hndKey, "Domain", NULL, &Type, (LPBYTE) t, &Size); - debugs(78, 1, "Adding domain " << t << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding domain " << t << " from Registry"); idnsAddPathComponent(t); xfree(t); } @@ -471,7 +471,7 @@ while (token) { idnsAddPathComponent(token); - debugs(78, 1, "Adding domain " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding domain " << token << " from Registry"); token = strtok(NULL, Separator); } xfree(t); @@ -511,7 +511,7 @@ while (token) { idnsAddNameserver(token); - debugs(78, 1, "Adding DHCP nameserver " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding DHCP nameserver " << token << " from Registry"); token = strtok(NULL, ","); } xfree(t); @@ -525,7 +525,7 @@ token = strtok(t, ", "); while (token) { - debugs(78, 1, "Adding nameserver " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding nameserver " << token << " from Registry"); idnsAddNameserver(token); token = strtok(NULL, ", "); } @@ -578,7 +578,7 @@ RegQueryValueEx(hndKey2, "DhcpNameServer", NULL, &Type, (LPBYTE)t, &Size); token = strtok(t, ", "); while (token) { - debugs(78, 1, "Adding DHCP nameserver " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding DHCP nameserver " << token << " from Registry"); idnsAddNameserver(token); token = strtok(NULL, ", "); } @@ -591,7 +591,7 @@ RegQueryValueEx(hndKey2, "NameServer", NULL, &Type, (LPBYTE)t, &Size); token = strtok(t, ", "); while (token) { - debugs(78, 1, "Adding nameserver " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding nameserver " << token << " from Registry"); idnsAddNameserver(token); token = strtok(NULL, ", "); } @@ -635,7 +635,7 @@ token = strtok(t, ", "); while (token) { - debugs(78, 1, "Adding nameserver " << token << " from Registry"); + debugs(78, DBG_IMPORTANT, "Adding nameserver " << token << " from Registry"); idnsAddNameserver(token); token = strtok(NULL, ", "); } @@ -648,7 +648,7 @@ break; default: - debugs(78, 1, "Failed to read nameserver from Registry: Unknown System Type."); + debugs(78, DBG_IMPORTANT, "Failed to read nameserver from Registry: Unknown System Type."); return; } } @@ -802,7 +802,7 @@ char buf[MAX_IPSTRLEN] = ""; if (vc->ns < nns) nameservers[vc->ns].S.NtoA(buf,MAX_IPSTRLEN); - debugs(78, 1, HERE << "Failed to connect to nameserver " << buf << " using TCP."); + debugs(78, DBG_IMPORTANT, HERE << "Failed to connect to nameserver " << buf << " using TCP."); return; } @@ -871,7 +871,7 @@ if (!vc) { char buf[MAX_IPSTRLEN]; - debugs(78, 1, "idnsSendQuery: Failed to initiate TCP connection to nameserver " << nameservers[ns].S.NtoA(buf,MAX_IPSTRLEN) << "!"); + debugs(78, DBG_IMPORTANT, "idnsSendQuery: Failed to initiate TCP connection to nameserver " << nameservers[ns].S.NtoA(buf,MAX_IPSTRLEN) << "!"); return; } @@ -891,12 +891,12 @@ idnsSendQuery(idns_query * q) { if (DnsSocketA < 0 && DnsSocketB < 0) { - debugs(78, 1, "WARNING: idnsSendQuery: Can't send query, no DNS socket!"); + debugs(78, DBG_IMPORTANT, "WARNING: idnsSendQuery: Can't send query, no DNS socket!"); return; } if (nns <= 0) { - debugs(78, 1, "WARNING: idnsSendQuery: Can't send query, no DNS nameservers known!"); + debugs(78, DBG_IMPORTANT, "WARNING: idnsSendQuery: Can't send query, no DNS nameservers known!"); return; } @@ -925,9 +925,9 @@ q->sent_t = current_time; if (y < 0 && nameservers[ns].S.IsIPv6()) - debugs(50, 1, "idnsSendQuery: FD " << DnsSocketB << ": sendto: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "idnsSendQuery: FD " << DnsSocketB << ": sendto: " << xstrerror()); if (x < 0 && nameservers[ns].S.IsIPv4()) - debugs(50, 1, "idnsSendQuery: FD " << DnsSocketA << ": sendto: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "idnsSendQuery: FD " << DnsSocketA << ": sendto: " << xstrerror()); } while ( (x<0 && y<0) && q->nsends % nns != 0); @@ -989,7 +989,7 @@ ++id; if (id == first_id) { - debugs(78, 1, "idnsQueryID: Warning, too many pending DNS requests"); + debugs(78, DBG_IMPORTANT, "idnsQueryID: Warning, too many pending DNS requests"); break; } } @@ -1097,7 +1097,7 @@ n = rfc1035MessageUnpack(buf, sz, &message); if (message == NULL) { - debugs(78, 1, "idnsGrokReply: Malformed DNS response"); + debugs(78, DBG_IMPORTANT, "idnsGrokReply: Malformed DNS response"); return; } @@ -1284,7 +1284,7 @@ if (errno != ECONNREFUSED && errno != EHOSTUNREACH) #endif - debugs(50, 1, "idnsRead: FD " << fd << " recvfrom: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "idnsRead: FD " << fd << " recvfrom: " << xstrerror()); break; } @@ -1312,10 +1312,10 @@ static time_t last_warning = 0; if (squid_curtime - last_warning > 60) { - debugs(78, 1, "WARNING: Reply from unknown nameserver " << from); + debugs(78, DBG_IMPORTANT, "WARNING: Reply from unknown nameserver " << from); last_warning = squid_curtime; } else { - debugs(78, 1, "WARNING: Reply from unknown nameserver " << from << " (retrying..." << (squid_curtime-last_warning) << "<=60)" ); + debugs(78, DBG_IMPORTANT, "WARNING: Reply from unknown nameserver " << from << " (retrying..." << (squid_curtime-last_warning) << "<=60)" ); } continue; } @@ -1515,12 +1515,12 @@ */ if (DnsSocketB >= 0) { comm_local_port(DnsSocketB); - debugs(78, 1, "DNS Socket created at " << addrV6 << ", FD " << DnsSocketB); + debugs(78, DBG_IMPORTANT, "DNS Socket created at " << addrV6 << ", FD " << DnsSocketB); Comm::SetSelect(DnsSocketB, COMM_SELECT_READ, idnsRead, NULL, 0); } if (DnsSocketA >= 0) { comm_local_port(DnsSocketA); - debugs(78, 1, "DNS Socket created at " << addrV4 << ", FD " << DnsSocketA); + debugs(78, DBG_IMPORTANT, "DNS Socket created at " << addrV4 << ", FD " << DnsSocketA); Comm::SetSelect(DnsSocketA, COMM_SELECT_READ, idnsRead, NULL, 0); } } @@ -1539,14 +1539,14 @@ #endif if (0 == nns) { - debugs(78, 1, "Warning: Could not find any nameservers. Trying to use localhost"); + debugs(78, DBG_IMPORTANT, "Warning: Could not find any nameservers. Trying to use localhost"); #if _SQUID_WINDOWS_ - debugs(78, 1, "Please check your TCP-IP settings or /etc/resolv.conf file"); + debugs(78, DBG_IMPORTANT, "Please check your TCP-IP settings or /etc/resolv.conf file"); #else - debugs(78, 1, "Please check your /etc/resolv.conf file"); + debugs(78, DBG_IMPORTANT, "Please check your /etc/resolv.conf file"); #endif - debugs(78, 1, "or use the 'dns_nameservers' option in squid.conf."); + debugs(78, DBG_IMPORTANT, "or use the 'dns_nameservers' option in squid.conf."); idnsAddNameserver("127.0.0.1"); } === modified file 'src/errorpage.cc' --- src/errorpage.cc 2012-07-23 15:34:12 +0000 +++ src/errorpage.cc 2012-08-02 21:18:43 +0000 @@ -1002,7 +1002,7 @@ /* for backward compat we make %s show the full URL. Drop this in some future release. */ if (building_deny_info_url) { p = request ? urlCanonical(request) : url; - debugs(0,0, "WARNING: deny_info now accepts coded tags. Use %u to get the full URL instead of %s"); + debugs(0, DBG_CRITICAL, "WARNING: deny_info now accepts coded tags. Use %u to get the full URL instead of %s"); } else p = visible_appname_string; break; === modified file 'src/esi/Context.h' --- src/esi/Context.h 2009-03-10 20:52:45 +0000 +++ src/esi/Context.h 2012-08-04 12:11:57 +0000 @@ -149,7 +149,6 @@ bool cachedASTInUse; private: - CBDATA_CLASS(ESIContext); void fail (); void freeResources(); void fixupOutboundTail(); @@ -168,6 +167,7 @@ virtual void parserDefault (const char *s, int len); virtual void parserComment (const char *s); bool processing; + CBDATA_CLASS(ESIContext); }; #endif /* SQUID_ESICONTEXT_H */ === modified file 'src/esi/Esi.cc' --- src/esi/Esi.cc 2012-07-23 15:15:27 +0000 +++ src/esi/Esi.cc 2012-08-02 21:18:43 +0000 @@ -989,7 +989,7 @@ debugs(86, 5, "ESIContext::addStackElement: About to add ESI Node " << element.getRaw()); if (!parserState.top()->addElement(element)) { - debugs(86, 1, "ESIContext::addStackElement: failed to add esi node, probable error in ESI template"); + debugs(86, DBG_IMPORTANT, "ESIContext::addStackElement: failed to add esi node, probable error in ESI template"); flags.error = 1; } else { /* added ok, push onto the stack */ @@ -1199,13 +1199,13 @@ if (!tempParser->parse("
", 5,0) || !tempParser->parse(s + 3, strlen(s) - 3, 0) || !tempParser->parse("
",6,1)) { - debugs(86, 0, "ESIContext::parserComment: Parsing fragment '" << s + 3 << "' failed."); + debugs(86, DBG_CRITICAL, "ESIContext::parserComment: Parsing fragment '" << s + 3 << "' failed."); setError(); char tempstr[1024]; snprintf(tempstr, 1023, "ESIContext::parserComment: Parse error at line %ld:\n%s\n", tempParser->lineNumber(), tempParser->errorString()); - debugs(86, 0, "" << tempstr << ""); + debugs(86, DBG_CRITICAL, "" << tempstr << ""); setErrorMessage(tempstr); } @@ -1219,7 +1219,7 @@ len = strlen (s); if (len > sizeof (localbuf) - 9) { - debugs(86, 0, "ESIContext::parserComment: Truncating long comment"); + debugs(86, DBG_CRITICAL, "ESIContext::parserComment: Truncating long comment"); len = sizeof (localbuf) - 9; } @@ -1241,7 +1241,7 @@ ESIElement::Pointer element (new esiLiteral (this, s, len)); if (!parserState.top()->addElement(element)) { - debugs(86, 1, "ESIContext::addLiteral: failed to add esi node, probable error in ESI template"); + debugs(86, DBG_IMPORTANT, "ESIContext::addLiteral: failed to add esi node, probable error in ESI template"); flags.error = 1; } } @@ -1267,7 +1267,7 @@ snprintf (tempstr, 1023, "esiProcess: Parse error at line %ld:\n%s\n", parserState.theParser->lineNumber(), parserState.theParser->errorString()); - debugs(86, 0, "" << tempstr << ""); + debugs(86, DBG_CRITICAL, "" << tempstr << ""); setErrorMessage(tempstr); @@ -1383,7 +1383,7 @@ break; case ESI_PROCESS_FAILED: - debugs(86, 0, "esiProcess: tree Processed FAILED"); + debugs(86, DBG_CRITICAL, "esiProcess: tree Processed FAILED"); setError(); setErrorMessage("esiProcess: ESI template Processing failed."); @@ -1749,7 +1749,7 @@ if (dynamic_cast(element.getRaw())) { if (attempt.getRaw()) { - debugs(86, 1, "esiTryAdd: Failed for " << this << " - try allready has an attempt node (section 3.4)"); + debugs(86, DBG_IMPORTANT, "esiTryAdd: Failed for " << this << " - try allready has an attempt node (section 3.4)"); return false; } @@ -1759,7 +1759,7 @@ if (dynamic_cast(element.getRaw())) { if (except.getRaw()) { - debugs(86, 1, "esiTryAdd: Failed for " << this << " - try already has an except node (section 3.4)"); + debugs(86, DBG_IMPORTANT, "esiTryAdd: Failed for " << this << " - try already has an except node (section 3.4)"); return false; } @@ -1767,7 +1767,7 @@ return true; } - debugs(86, 1, "esiTryAdd: Failed to add element " << element.getRaw() << " to try " << this << ", incorrect element type (see section 3.4)"); + debugs(86, DBG_IMPORTANT, "esiTryAdd: Failed to add element " << element.getRaw() << " to try " << this << ", incorrect element type (see section 3.4)"); return false; } @@ -1787,12 +1787,12 @@ assert (this); if (!attempt.getRaw()) { - debugs(86, 0, "esiTryProcess: Try has no attempt element - ESI template is invalid (section 3.4)"); + debugs(86, DBG_CRITICAL, "esiTryProcess: Try has no attempt element - ESI template is invalid (section 3.4)"); return ESI_PROCESS_FAILED; } if (!except.getRaw()) { - debugs(86, 0, "esiTryProcess: Try has no except element - ESI template is invalid (section 3.4)"); + debugs(86, DBG_CRITICAL, "esiTryProcess: Try has no except element - ESI template is invalid (section 3.4)"); return ESI_PROCESS_FAILED; } @@ -2057,13 +2057,13 @@ /* Some elements require specific parents */ if (!(dynamic_cast(element.getRaw()) || dynamic_cast(element.getRaw()))) { - debugs(86, 0, "esiChooseAdd: invalid child node for esi:choose (section 3.3)"); + debugs(86, DBG_CRITICAL, "esiChooseAdd: invalid child node for esi:choose (section 3.3)"); return false; } if (dynamic_cast(element.getRaw())) { if (otherwise.getRaw()) { - debugs(86, 0, "esiChooseAdd: only one otherwise node allowed for esi:choose (section 3.3)"); + debugs(86, DBG_CRITICAL, "esiChooseAdd: only one otherwise node allowed for esi:choose (section 3.3)"); return false; } @@ -2346,7 +2346,7 @@ /* ignore mistyped attributes. * TODO:? error on these for user feedback - config parameter needed */ - debugs(86, 1, "Found misttyped attribute on ESI When clause"); + debugs(86, DBG_IMPORTANT, "Found misttyped attribute on ESI When clause"); } } === modified file 'src/esi/Expression.cc' --- src/esi/Expression.cc 2012-01-20 18:55:04 +0000 +++ src/esi/Expression.cc 2012-08-02 21:10:18 +0000 @@ -174,7 +174,7 @@ return 0; } else { /* TODO: numeric to string conversion ? */ - debugs(86, 1, "strcmp with non-string"); + debugs(86, DBG_IMPORTANT, "strcmp with non-string"); return -2; } } else if (a.valuestored == ESI_LITERAL_FLOAT) { @@ -194,7 +194,7 @@ return 1; } else { /* TODO: attempt numeric converson again? */ - debugs(86, 1, "floatcomp with non float or int"); + debugs(86, DBG_IMPORTANT, "floatcomp with non float or int"); return -2; } } else if (a.valuestored == ESI_LITERAL_INT) { @@ -214,7 +214,7 @@ return 1; } else { /* TODO: attempt numeric converson again? */ - debugs(86, 1, "intcomp vs non float non int"); + debugs(86, DBG_IMPORTANT, "intcomp vs non float non int"); return -2; } } @@ -252,7 +252,7 @@ int evalliteral(stackmember * stack, int *depth, int whereAmI, stackmember * candidate) { - debugs(86, 1, "attempt to evaluate a literal"); + debugs(86, DBG_IMPORTANT, "attempt to evaluate a literal"); /* literals can't be evaluated */ return 1; } @@ -260,7 +260,7 @@ int evalexpr(stackmember * stack, int *depth, int whereAmI, stackmember * candidate) { - debugs(86, 1, "attempt to evaluate a sub-expression result"); + debugs(86, DBG_IMPORTANT, "attempt to evaluate a sub-expression result"); /* sub-scpr's can't be evaluated */ return 1; } @@ -411,7 +411,7 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; @@ -460,7 +460,7 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; @@ -509,7 +509,7 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; @@ -558,7 +558,7 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; } @@ -607,7 +607,7 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; } @@ -654,14 +654,14 @@ /* Something wrong upstream */ return 1; - /* debugs(86, 1, "?= " << srv.value.integral << " "); */ + /* debugs(86, DBG_IMPORTANT, "?= " << srv.value.integral << " "); */ return 0; } int evalstartexpr(stackmember * stack, int *depth, int whereAmI, stackmember * candidate) { - /* debugs(86, 1, "?("); */ + /* debugs(86, DBG_IMPORTANT, "?("); */ if (whereAmI != *depth - 2) /* invalid stack */ @@ -720,7 +720,7 @@ if (s == end || errno) { /* Couldn't convert to float */ - debugs(86, 1, "failed to convert '" << s << "' to float "); + debugs(86, DBG_IMPORTANT, "failed to convert '" << s << "' to float "); *endptr = origs; } else { debugs(86,6, "found " << rv.value.floating << " of length " << end - s); @@ -737,7 +737,7 @@ if (s == end || errno) { /* Couldn't convert to int */ - debugs(86, 1, "failed to convert '" << s << "' to int "); + debugs(86, DBG_IMPORTANT, "failed to convert '" << s << "' to int "); *endptr = origs; } else { debugs(86,6, "found " << rv.value.integral << " of length " << end - s); @@ -770,7 +770,7 @@ ++t; if (!*t) { - debugs(86, 1, "missing end \' in '" << s << "'"); + debugs(86, DBG_IMPORTANT, "missing end \' in '" << s << "'"); *endptr = origs; } else { *endptr = t + 1; @@ -823,7 +823,7 @@ rv.precedence = 5; rv.eval = evalequals; } else { - debugs(86, 1, "invalid expr '" << s << "'"); + debugs(86, DBG_IMPORTANT, "invalid expr '" << s << "'"); *endptr = origs; } } else if ('<' == *s) { @@ -871,7 +871,7 @@ rv.precedence = 1; rv.eval = evalexpr; } else { - debugs(86, 1, "invalid expr '" << s << "'"); + debugs(86, DBG_IMPORTANT, "invalid expr '" << s << "'"); *endptr = origs; } @@ -997,7 +997,7 @@ /* cleanup candidate and stack */ dumpstack(stack, *stackdepth); cleanmember(candidate); - debugs(86, 1, "invalid expression"); + debugs(86, DBG_IMPORTANT, "invalid expression"); return 0; } } else { @@ -1031,7 +1031,7 @@ s = end; } else { assert (s == end); - debugs(86, 1, "failed parsing expression"); + debugs(86, DBG_IMPORTANT, "failed parsing expression"); PROF_stop(esiExpressionEval); return 0; } @@ -1045,7 +1045,7 @@ if (stack[stackdepth - 2]. eval(stack, &stackdepth, stackdepth - 2, &rv)) { /* special case - leading operator failed */ - debugs(86, 1, "invalid expression"); + debugs(86, DBG_IMPORTANT, "invalid expression"); PROF_stop(esiExpressionEval); return 0; } === modified file 'src/esi/Include.cc' --- src/esi/Include.cc 2012-01-20 18:55:04 +0000 +++ src/esi/Include.cc 2012-08-02 21:18:43 +0000 @@ -184,7 +184,7 @@ return; case STREAM_FAILED: - debugs(86, 1, "ESI subrequest failed transfer"); + debugs(86, DBG_IMPORTANT, "ESI subrequest failed transfer"); esiStream->include->includeFail (esiStream); esiStream->finished = 1; httpRequestFree (http); @@ -342,7 +342,7 @@ "'"); if (clientBeginRequest(METHOD_GET, tempUrl, esiBufferRecipient, esiBufferDetach, stream.getRaw(), &tempheaders, stream->localbuffer->buf, HTTP_REQBUF_SZ)) { - debugs(86, 0, "starting new ESI subrequest failed"); + debugs(86, DBG_CRITICAL, "starting new ESI subrequest failed"); } tempheaders.clean(); @@ -379,7 +379,7 @@ flags.onerrorcontinue = 1; } else { /* ignore mistyped attributes */ - debugs(86, 1, "invalid value for onerror='" << attr[i+1] << "'"); + debugs(86, DBG_IMPORTANT, "invalid value for onerror='" << attr[i+1] << "'"); } } else { /* ignore mistyped attributes. TODO:? error on these for user feedback - config parameter needed @@ -407,7 +407,7 @@ } else { alt = NULL; - debugs(86, 1, "ESIIncludeNew: esi:include with no src attributes"); + debugs(86, DBG_IMPORTANT, "ESIIncludeNew: esi:include with no src attributes"); flags.failed = 1; } === modified file 'src/esi/Sequence.cc' --- src/esi/Sequence.cc 2012-01-20 18:55:04 +0000 +++ src/esi/Sequence.cc 2012-08-02 21:18:43 +0000 @@ -164,7 +164,7 @@ if (dynamic_cast(element.getRaw()) || dynamic_cast(element.getRaw())) { - debugs(86, 0, "esiSequenceAdd: misparented Attempt or Except element (section 3.4)"); + debugs(86, DBG_CRITICAL, "esiSequenceAdd: misparented Attempt or Except element (section 3.4)"); return false; } === modified file 'src/eui/Eui48.cc' --- src/eui/Eui48.cc 2012-07-12 09:08:16 +0000 +++ src/eui/Eui48.cc 2012-08-02 21:18:43 +0000 @@ -128,7 +128,7 @@ int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0; if (sscanf(asc, "%x:%x:%x:%x:%x:%x", &a1, &a2, &a3, &a4, &a5, &a6) != 6) { - debugs(28, 0, "Decode EUI-48: Invalid ethernet address '" << asc << "'"); + debugs(28, DBG_CRITICAL, "Decode EUI-48: Invalid ethernet address '" << asc << "'"); clear(); return false; /* This is not valid address */ } @@ -224,14 +224,14 @@ ifc.ifc_buf = (char *)ifbuffer; if (ioctl(tmpSocket, SIOCGIFCONF, &ifc) < 0) { - debugs(28, 1, "Attempt to retrieve interface list failed: " << xstrerror()); + debugs(28, DBG_IMPORTANT, "Attempt to retrieve interface list failed: " << xstrerror()); clear(); close(tmpSocket); return false; } if (ifc.ifc_len > (int)sizeof(ifbuffer)) { - debugs(28, 1, "Interface list too long - " << ifc.ifc_len); + debugs(28, DBG_IMPORTANT, "Interface list too long - " << ifc.ifc_len); clear(); close(tmpSocket); return false; @@ -277,7 +277,7 @@ else if (ENODEV == errno) (void) 0; else - debugs(28, 1, "ARP query " << ipAddr << " failed: " << ifr->ifr_name << ": " << xstrerror()); + debugs(28, DBG_IMPORTANT, "ARP query " << ipAddr << " failed: " << ifr->ifr_name << ": " << xstrerror()); continue; } @@ -387,19 +387,19 @@ mib[5] = RTF_LLINFO; if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { - debugs(28, 0, "Can't estimate ARP table size!"); + debugs(28, DBG_CRITICAL, "Can't estimate ARP table size!"); clear(); return false; } if ((buf = (char *)xmalloc(needed)) == NULL) { - debugs(28, 0, "Can't allocate temporary ARP table!"); + debugs(28, DBG_CRITICAL, "Can't allocate temporary ARP table!"); clear(); return false; } if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { - debugs(28, 0, "Can't retrieve ARP table!"); + debugs(28, DBG_CRITICAL, "Can't retrieve ARP table!"); xfree(buf); clear(); return false; @@ -464,21 +464,21 @@ /* Get size of Windows ARP table */ if (GetIpNetTable(NetTable, &ipNetTableLen, FALSE) != ERROR_INSUFFICIENT_BUFFER) { - debugs(28, 0, "Can't estimate ARP table size!"); + debugs(28, DBG_CRITICAL, "Can't estimate ARP table size!"); clear(); return false; } /* Allocate space for ARP table and assign pointers */ if ((NetTable = (PMIB_IPNETTABLE)xmalloc(ipNetTableLen)) == NULL) { - debugs(28, 0, "Can't allocate temporary ARP table!"); + debugs(28, DBG_CRITICAL, "Can't allocate temporary ARP table!"); clear(); return false; } /* Get actual ARP table */ if ((dwNetTable = GetIpNetTable(NetTable, &ipNetTableLen, FALSE)) != NO_ERROR) { - debugs(28, 0, "Can't retrieve ARP table!"); + debugs(28, DBG_CRITICAL, "Can't retrieve ARP table!"); xfree(NetTable); clear(); return false; @@ -516,7 +516,7 @@ #else - debugs(28, 0, "ERROR: ARP / MAC / EUI-* operations not supported on this operating system."); + debugs(28, DBG_CRITICAL, "ERROR: ARP / MAC / EUI-* operations not supported on this operating system."); #endif /* === modified file 'src/eui/Eui64.cc' --- src/eui/Eui64.cc 2012-01-20 18:55:04 +0000 +++ src/eui/Eui64.cc 2012-08-02 21:18:43 +0000 @@ -68,7 +68,7 @@ #if 0 /* no actual lookup coded yet */ /* no OS yet supported for NDP protocol lookup */ - debugs(28, 0, "ERROR: ARP / MAC / EUI-* operations not supported on this operating system."); + debugs(28, DBG_CRITICAL, "ERROR: ARP / MAC / EUI-* operations not supported on this operating system."); /* * Address was not found on any interface === modified file 'src/external_acl.cc' --- src/external_acl.cc 2012-07-26 08:40:22 +0000 +++ src/external_acl.cc 2012-08-02 21:18:43 +0000 @@ -341,7 +341,7 @@ a->negative_ttl = atoi(token + 13); } else if (strncmp(token, "children=", 9) == 0) { a->children.n_max = atoi(token + 9); - debugs(0, 0, "WARNING: external_acl_type option children=N has been deprecated in favor of children-max=N and children-startup=N"); + debugs(0, DBG_CRITICAL, "WARNING: external_acl_type option children=N has been deprecated in favor of children-max=N and children-startup=N"); } else if (strncmp(token, "children-max=", 13) == 0) { a->children.n_max = atoi(token + 13); } else if (strncmp(token, "children-startup=", 17) == 0) { @@ -367,11 +367,11 @@ bind to IPv4/v6 localhost port. */ } else if (strcmp(token, "ipv4") == 0) { if ( !a->local_addr.SetIPv4() ) { - debugs(3, 0, "WARNING: Error converting " << a->local_addr << " to IPv4 in " << a->name ); + debugs(3, DBG_CRITICAL, "WARNING: Error converting " << a->local_addr << " to IPv4 in " << a->name ); } } else if (strcmp(token, "ipv6") == 0) { if (!Ip::EnableIpv6) - debugs(3, 0, "WARNING: --enable-ipv6 required for external ACL helpers to use IPv6: " << a->name ); + debugs(3, DBG_CRITICAL, "WARNING: --enable-ipv6 required for external ACL helpers to use IPv6: " << a->name ); // else nothing to do. } else { break; @@ -478,7 +478,7 @@ else if (strcmp(token, "%%") == 0) format->type = _external_acl_format::EXT_ACL_PERCENT; else { - debugs(0,0, "ERROR: Unknown Format token " << token); + debugs(0, DBG_CRITICAL, "ERROR: Unknown Format token " << token); self_destruct(); } @@ -717,12 +717,12 @@ #if USE_AUTH if (data->def->require_auth) { if (authenticateSchemeCount() == 0) { - debugs(28, 0, "Can't use proxy auth because no authentication schemes were compiled."); + debugs(28, DBG_CRITICAL, "Can't use proxy auth because no authentication schemes were compiled."); return false; } if (authenticateActiveSchemeCount() == 0) { - debugs(28, 0, "Can't use proxy auth because no authentication schemes are fully configured."); + debugs(28, DBG_CRITICAL, "Can't use proxy auth because no authentication schemes are fully configured."); return false; } } === modified file 'src/fd.cc' --- src/fd.cc 2012-07-20 15:31:04 +0000 +++ src/fd.cc 2012-08-02 21:18:43 +0000 @@ -213,7 +213,7 @@ F = &fd_table[fd]; if (F->flags.open) { - debugs(51, 1, "WARNING: Closing open FD " << std::setw(4) << fd); + debugs(51, DBG_IMPORTANT, "WARNING: Closing open FD " << std::setw(4) << fd); fd_close(fd); } @@ -308,7 +308,7 @@ if (i == fileno(debug_log)) continue; - debugs(51, 1, "Open FD "<< std::left<< std::setw(10) << + debugs(51, DBG_IMPORTANT, "Open FD "<< std::left<< std::setw(10) << (F->bytes_read && F->bytes_written ? "READ/WRITE" : F->bytes_read ? "READING" : F->bytes_written ? "WRITING" : "UNSTARTED") << @@ -362,13 +362,13 @@ if (newReserve > x) { /* perhaps this should be fatal()? -DW */ - debugs(51, 0, "WARNING: This machine has a serious shortage of filedescriptors."); + debugs(51, DBG_CRITICAL, "WARNING: This machine has a serious shortage of filedescriptors."); newReserve = x; } if (Squid_MaxFD - newReserve < min(256, Squid_MaxFD / 2)) fatalf("Too few filedescriptors available in the system (%d usable of %d).\n", Squid_MaxFD - newReserve, Squid_MaxFD); - debugs(51, 0, "Reserved FD adjusted from " << RESERVED_FD << " to " << newReserve << " due to failures"); + debugs(51, DBG_CRITICAL, "Reserved FD adjusted from " << RESERVED_FD << " to " << newReserve << " due to failures"); RESERVED_FD = newReserve; } === modified file 'src/format/Config.cc' --- src/format/Config.cc 2012-01-20 18:55:04 +0000 +++ src/format/Config.cc 2012-08-02 21:18:43 +0000 @@ -39,5 +39,5 @@ if (tokenArray != NULL) tokens.push_back(TokenNamespace(nsName, tokenArray)); else - debugs(0,0, "BUG: format tokens for '" << nsName << "' missing!"); + debugs(0, DBG_CRITICAL, "BUG: format tokens for '" << nsName << "' missing!"); } === modified file 'src/format/Token.cc' --- src/format/Token.cc 2012-07-23 15:34:12 +0000 +++ src/format/Token.cc 2012-08-02 21:18:43 +0000 @@ -526,28 +526,28 @@ break; case LFT_HTTP_SENT_STATUS_CODE_OLD_30: - debugs(46, 0, "WARNING: The \"Hs\" formatting code is deprecated. Use the \">Hs\" instead."); + debugs(46, DBG_CRITICAL, "WARNING: The \"Hs\" formatting code is deprecated. Use the \">Hs\" instead."); type = LFT_HTTP_SENT_STATUS_CODE; break; case LFT_SERVER_LOCAL_IP_OLD_27: - debugs(46, 0, "WARNING: The \"oa\" formatting code is deprecated. Use the \"rp\" instead."); + debugs(46, DBG_CRITICAL, "WARNING: The \"rp\" formatting code is deprecated. Use the \">rp\" instead."); type = LFT_CLIENT_REQ_URLPATH; break; case LFT_REQUEST_VERSION_OLD_2X: - debugs(46, 0, "WARNING: The \">v\" formatting code is deprecated. Use the \">rv\" instead."); + debugs(46, DBG_CRITICAL, "WARNING: The \">v\" formatting code is deprecated. Use the \">rv\" instead."); type = LFT_REQUEST_VERSION; break; #if !USE_SQUID_EUI case LFT_CLIENT_EUI: - debugs(46, 0, "WARNING: The \">eui\" formatting code requires EUI features which are disabled in this Squid."); + debugs(46, DBG_CRITICAL, "WARNING: The \">eui\" formatting code requires EUI features which are disabled in this Squid."); break; #endif === modified file 'src/forward.cc' --- src/forward.cc 2012-07-29 08:15:17 +0000 +++ src/forward.cc 2012-08-02 21:10:18 +0000 @@ -177,7 +177,7 @@ FwdState::completed() { if (flags.forward_completed == 1) { - debugs(17, 1, HERE << "FwdState::completed called on a completed request! Bad!"); + debugs(17, DBG_IMPORTANT, HERE << "FwdState::completed called on a completed request! Bad!"); return; } @@ -652,7 +652,7 @@ case SSL_ERROR_SSL: case SSL_ERROR_SYSCALL: ssl_lib_error = ERR_get_error(); - debugs(81, 1, "fwdNegotiateSSL: Error negotiating SSL connection on FD " << fd << + debugs(81, DBG_IMPORTANT, "fwdNegotiateSSL: Error negotiating SSL connection on FD " << fd << ": " << ERR_error_string(ssl_lib_error, NULL) << " (" << ssl_error << "/" << ret << "/" << errno << ")"); @@ -759,7 +759,7 @@ assert(sslContext); if ((ssl = SSL_new(sslContext)) == NULL) { - debugs(83, 1, "fwdInitiateSSL: Error allocating handle: " << ERR_error_string(ERR_get_error(), NULL) ); + debugs(83, DBG_IMPORTANT, "fwdInitiateSSL: Error allocating handle: " << ERR_error_string(ERR_get_error(), NULL) ); ErrorState *anErr = new ErrorState(ERR_SOCKET_FAILURE, HTTP_INTERNAL_SERVER_ERROR, request); // TODO: create Ssl::ErrorDetail with OpenSSL-supplied error code fail(anErr); === modified file 'src/fqdncache.cc' --- src/fqdncache.cc 2012-07-23 15:34:12 +0000 +++ src/fqdncache.cc 2012-08-02 21:10:18 +0000 @@ -353,7 +353,7 @@ f->flags.negcached = 1; if (inbuf == NULL) { - debugs(35, 1, "fqdncacheParse: Got reply in response to '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: Got reply in response to '" << name << "'"); f->error_message = xstrdup("Internal Error"); return -1; } @@ -363,7 +363,7 @@ token = strtok(buf, w_space); if (NULL == token) { - debugs(35, 1, "fqdncacheParse: Got , expecting '$name' in response to '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: Got , expecting '$name' in response to '" << name << "'"); f->error_message = xstrdup("Internal Error"); return -1; } @@ -376,7 +376,7 @@ } if (0 != strcmp(token, "$name")) { - debugs(35, 1, "fqdncacheParse: Got '" << inbuf << "', expecting '$name' in response to '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: Got '" << inbuf << "', expecting '$name' in response to '" << name << "'"); f->error_message = xstrdup("Internal Error"); return -1; } @@ -384,7 +384,7 @@ token = strtok(NULL, w_space); if (NULL == token) { - debugs(35, 1, "fqdncacheParse: Got '" << inbuf << "', expecting TTL in response to '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: Got '" << inbuf << "', expecting TTL in response to '" << name << "'"); f->error_message = xstrdup("Internal Error"); return -1; } @@ -394,7 +394,7 @@ token = strtok(NULL, w_space); if (NULL == token) { - debugs(35, 1, "fqdncacheParse: Got '" << inbuf << "', expecting hostname in response to '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: Got '" << inbuf << "', expecting hostname in response to '" << name << "'"); f->error_message = xstrdup("Internal Error"); return -1; } @@ -468,7 +468,7 @@ } if (f->name_count == 0) { - debugs(35, 1, "fqdncacheParse: No PTR record for '" << name << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheParse: No PTR record for '" << name << "'"); return 0; } @@ -846,7 +846,7 @@ if (1 == fce->flags.fromhosts) { fqdncacheUnlockEntry(fce); } else if (fce->locks > 0) { - debugs(35, 1, "fqdncacheAddEntryFromHosts: can't add static entry for locked address '" << addr << "'"); + debugs(35, DBG_IMPORTANT, "fqdncacheAddEntryFromHosts: can't add static entry for locked address '" << addr << "'"); return; } else { fqdncacheRelease(fce); === modified file 'src/fs/Makefile.am' --- src/fs/Makefile.am 2011-09-10 16:38:36 +0000 +++ src/fs/Makefile.am 2012-08-02 15:22:06 +0000 @@ -22,11 +22,18 @@ libufs_la_SOURCES = \ ufs/StoreFSufs.h \ ufs/StoreFSufs.cc \ - ufs/store_dir_ufs.cc \ ufs/store_io_ufs.cc \ - ufs/ufscommon.cci \ - ufs/ufscommon.cc \ - ufs/ufscommon.h + ufs/UFSSwapDir.cc \ + ufs/UFSSwapDir.h \ + ufs/UFSStrategy.cc \ + ufs/UFSStrategy.h \ + ufs/UFSStoreState.h \ + ufs/StoreSearchUFS.h \ + ufs/StoreSearchUFS.cc \ + ufs/UFSSwapLogParser.h \ + ufs/UFSSwapLogParser.cc \ + ufs/RebuildState.h \ + ufs/RebuildState.cc librock_la_SOURCES = \ rock/RockDbCell.h \ === modified file 'src/fs/Module.cc' --- src/fs/Module.cc 2012-01-20 18:55:04 +0000 +++ src/fs/Module.cc 2012-07-31 21:45:27 +0000 @@ -2,7 +2,7 @@ #include "Module.h" #if defined(HAVE_FS_UFS) || defined(HAVE_FS_AUFS) || defined(HAVE_FS_DISKD) #include "fs/ufs/StoreFSufs.h" -#include "fs/ufs/ufscommon.h" +#include "fs/ufs/UFSSwapDir.h" #endif #if HAVE_FS_COSS === modified file 'src/fs/aufs/StoreFSaufs.cc' --- src/fs/aufs/StoreFSaufs.cc 2012-01-20 18:55:04 +0000 +++ src/fs/aufs/StoreFSaufs.cc 2012-07-31 21:45:27 +0000 @@ -45,8 +45,7 @@ #include "fs/ufs/StoreFSufs.h" -/** \todo FIXME: break UFSSwapDir out so we don't need all the guff */ -#include "fs/ufs/ufscommon.h" +#include "fs/ufs/UFSSwapDir.h" /** \defgroup AUFS AUFS Storage Filesystem (UFS Based) === modified file 'src/fs/coss/CossSwapDir.h' --- src/fs/coss/CossSwapDir.h 2011-10-27 23:14:28 +0000 +++ src/fs/coss/CossSwapDir.h 2012-08-04 12:11:57 +0000 @@ -136,13 +136,13 @@ virtual StoreEntry *currentItem(); private: - CBDATA_CLASS2(StoreSearchCoss); RefCount sd; void (*callback)(void *cbdata); void *cbdata; bool _done; dlink_node * current; dlink_node * next_; + CBDATA_CLASS2(StoreSearchCoss); }; #endif === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2012-07-12 09:08:16 +0000 +++ src/fs/coss/store_dir_coss.cc 2012-08-02 21:18:43 +0000 @@ -123,7 +123,7 @@ swaplog_fd = file_open(logPath, O_WRONLY | O_CREAT | O_BINARY); if (swaplog_fd < 0) { - debugs(47, 1, "" << logPath << ": " << xstrerror()); + debugs(47, DBG_IMPORTANT, "" << logPath << ": " << xstrerror()); fatal("storeCossDirOpenSwapLog: Failed to open swap log."); } @@ -147,7 +147,7 @@ CossSwapDir::ioCompletedNotification() { if (theFile->error()) { - debugs(47, 1, "" << path << ": " << xstrerror()); + debugs(47, DBG_IMPORTANT, "" << path << ": " << xstrerror()); fatal("storeCossDirInit: Failed to open a COSS file."); } } @@ -178,9 +178,9 @@ if (errflag > 0) { errno = errflag; - debugs(79, 1, "storeCossReadDone: error: " << xstrerror()); + debugs(79, DBG_IMPORTANT, "storeCossReadDone: error: " << xstrerror()); } else { - debugs(79, 1, "storeCossReadDone: got failure (" << errflag << ")"); + debugs(79, DBG_IMPORTANT, "storeCossReadDone: got failure (" << errflag << ")"); } rlen = -1; @@ -218,8 +218,8 @@ if (errflag) { ++ StoreFScoss::GetInstance().stats.stripe_write.fail; - debugs(79, 1, "storeCossWriteMemBufDone: got failure (" << errflag << ")"); - debugs(79, 1, "size=" << cossWrite->membuf->diskend - cossWrite->membuf->diskstart); + debugs(79, DBG_IMPORTANT, "storeCossWriteMemBufDone: got failure (" << errflag << ")"); + debugs(79, DBG_IMPORTANT, "size=" << cossWrite->membuf->diskend - cossWrite->membuf->diskstart); } else { ++ StoreFScoss::GetInstance().stats.stripe_write.success; } @@ -387,7 +387,7 @@ for (int aCount = 0; aCount < rb->speed; ++aCount) { if (fread(&s, ss, 1, rb->log) != 1) { - debugs(47, 1, "Done reading " << rb->sd->path << " swaplog (" << rb->n_read << " entries)"); + debugs(47, DBG_IMPORTANT, "Done reading " << rb->sd->path << " swaplog (" << rb->n_read << " entries)"); fclose(rb->log); rb->log = NULL; storeCossRebuildComplete(rb); @@ -439,7 +439,7 @@ if (0.0 == x - (double) (int) x) - debugs(47, 1, "WARNING: " << rb->counts.bad_log_op << " invalid swap log entries found"); + debugs(47, DBG_IMPORTANT, "WARNING: " << rb->counts.bad_log_op << " invalid swap log entries found"); ++ rb->counts.invalid; @@ -555,7 +555,7 @@ * we'll use storeCossRebuildFromSwapLog(). */ fp = storeCossDirOpenTmpSwapLog(sd, &clean, &zero); - debugs(47, 1, "Rebuilding COSS storage in " << sd->path << " (" << (clean ? "CLEAN" : "DIRTY") << ")"); + debugs(47, DBG_IMPORTANT, "Rebuilding COSS storage in " << sd->path << " (" << (clean ? "CLEAN" : "DIRTY") << ")"); rb->log = fp; ++ StoreController::store_dirs_rebuilding; @@ -598,7 +598,7 @@ anfd = file_open(swaplog_path, O_WRONLY | O_CREAT | O_BINARY); if (anfd < 0) { - debugs(50, 1, "" << swaplog_path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << swaplog_path << ": " << xstrerror()); fatal("storeCossDirCloseTmpSwapLog: Failed to open swap log."); } @@ -622,7 +622,7 @@ int anfd; if (::stat(swaplog_path, &log_sb) < 0) { - debugs(50, 1, "Cache COSS Dir #" << sd->index << ": No log file"); + debugs(50, DBG_IMPORTANT, "Cache COSS Dir #" << sd->index << ": No log file"); safe_free(swaplog_path); safe_free(clean_path); safe_free(new_path); @@ -639,7 +639,7 @@ anfd = file_open(new_path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY); if (anfd < 0) { - debugs(50, 1, "" << new_path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << new_path << ": " << xstrerror()); fatal("storeDirOpenTmpSwapLog: Failed to open swap log."); } @@ -648,7 +648,7 @@ fp = fopen(swaplog_path, "rb"); if (fp == NULL) { - debugs(50, 0, "" << swaplog_path << ": " << xstrerror()); + debugs(50, DBG_CRITICAL, "" << swaplog_path << ": " << xstrerror()); fatal("Failed to open swap log for reading"); } @@ -782,8 +782,8 @@ if (outbuf_offset + ss > CLEAN_BUF_SZ) { if (FD_WRITE_METHOD(fd, outbuf, outbuf_offset) < 0) { - debugs(50, 0, "storeCossDirWriteCleanLogs: " << newLog << ": write: " << xstrerror()); - debugs(50, 0, "storeCossDirWriteCleanLogs: Current swap logfile not replaced."); + debugs(50, DBG_CRITICAL, "storeCossDirWriteCleanLogs: " << newLog << ": write: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeCossDirWriteCleanLogs: Current swap logfile not replaced."); file_close(fd); fd = -1; unlink(newLog); @@ -808,8 +808,8 @@ return; if (FD_WRITE_METHOD(state->fd, state->outbuf, state->outbuf_offset) < 0) { - debugs(50, 0, "storeCossDirWriteCleanLogs: " << state->newLog << ": write: " << xstrerror()); - debugs(50, 0, "storeCossDirWriteCleanLogs: Current swap logfile not replaced."); + debugs(50, DBG_CRITICAL, "storeCossDirWriteCleanLogs: " << state->newLog << ": write: " << xstrerror()); + debugs(50, DBG_CRITICAL, "storeCossDirWriteCleanLogs: Current swap logfile not replaced."); file_close(state->fd); state->fd = -1; ::unlink(state->newLog); @@ -1027,9 +1027,9 @@ const uint64_t max_offset = (uint64_t)SwapFilenMax << blksz_bits; if (maxSize() > max_offset) { - debugs(47, 0, "COSS block-size = " << (1<(i) << 20; // MBytes to Bytes if (size == maxSize()) - debugs(3, 1, "Cache COSS dir '" << path << "' size remains unchanged at " << i << " MB"); + debugs(3, DBG_IMPORTANT, "Cache COSS dir '" << path << "' size remains unchanged at " << i << " MB"); else { - debugs(3, 1, "Cache COSS dir '" << path << "' size changed to " << i << " MB"); + debugs(3, DBG_IMPORTANT, "Cache COSS dir '" << path << "' size changed to " << i << " MB"); max_size = size; } @@ -1098,7 +1098,7 @@ return true; if (reconfiguring) { - debugs(47, 0, "WARNING: cannot change COSS block-size while Squid is running"); + debugs(47, DBG_CRITICAL, "WARNING: cannot change COSS block-size while Squid is running"); return false; } === modified file 'src/fs/coss/store_io_coss.cc' --- src/fs/coss/store_io_coss.cc 2012-07-12 09:08:16 +0000 +++ src/fs/coss/store_io_coss.cc 2012-08-02 21:10:18 +0000 @@ -510,7 +510,7 @@ t = (CossMemBuf *)m->data; if (t->flags.writing) { - debugs(79, 1, "WARNING: sleeping for 5 seconds in storeCossSync()"); + debugs(79, DBG_IMPORTANT, "WARNING: sleeping for 5 seconds in storeCossSync()"); sleep(5); /* XXX EEEWWW! */ } === modified file 'src/fs/diskd/StoreFSdiskd.cc' --- src/fs/diskd/StoreFSdiskd.cc 2012-01-20 18:55:04 +0000 +++ src/fs/diskd/StoreFSdiskd.cc 2012-07-25 20:56:12 +0000 @@ -42,9 +42,7 @@ #endif #include "fs/ufs/StoreFSufs.h" - -/** \todo FIXME: break UFSSwapDir out so we don;t need all the extras */ -#include "fs/ufs/ufscommon.h" +#include "fs/ufs/UFSSwapDir.h" /** \defgroup diskd diskd Storage Filesystem (UFS Based) === modified file 'src/fs/rock/RockSwapDir.cc' --- src/fs/rock/RockSwapDir.cc 2012-06-22 03:49:38 +0000 +++ src/fs/rock/RockSwapDir.cc 2012-08-02 06:19:48 +0000 @@ -18,6 +18,7 @@ #include "MemObject.h" #include "Parsing.h" #include "SquidMath.h" +#include #include const int64_t Rock::SwapDir::HeaderSize = 16*1024; === added file 'src/fs/ufs/RebuildState.cc' --- src/fs/ufs/RebuildState.cc 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/RebuildState.cc 2012-08-02 14:59:01 +0000 @@ -0,0 +1,541 @@ +/* + * + * DEBUG: section 47 Store Directory Routines + * AUTHOR: Robert Collins + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "RebuildState.h" +#include "SquidTime.h" +#include "StoreSwapLogData.h" +#include "UFSSwapLogParser.h" + +CBDATA_CLASS_INIT(RebuildState); + +RebuildState::RebuildState(RefCount aSwapDir) : + sd (aSwapDir), LogParser(NULL), e(NULL), fromLog(true), _done (false) +{ + /* + * If the swap.state file exists in the cache_dir, then + * we'll use commonUfsDirRebuildFromSwapLog(), otherwise we'll + * use commonUfsDirRebuildFromDirectory() to open up each file + * and suck in the meta data. + */ + int clean = 0; + int zeroLengthLog = 0; + FILE *fp = sd->openTmpSwapLog(&clean, &zeroLengthLog); + + if (fp && !zeroLengthLog) + LogParser = UFSSwapLogParser::GetUFSSwapLogParser(fp); + + if (LogParser == NULL ) { + fromLog = false; + + if (fp != NULL) + fclose(fp); + + } else { + fromLog = true; + flags.clean = (unsigned int) clean; + } + + if (!clean) + flags.need_to_validate = 1; + + debugs(47, DBG_IMPORTANT, "Rebuilding storage in " << sd->path << " (" << + (clean ? "clean log" : (LogParser ? "dirty log" : "no log")) << ")"); +} + +RebuildState::~RebuildState() +{ + sd->closeTmpSwapLog(); + + if (LogParser) + delete LogParser; +} + +void +RebuildState::RebuildStep(void *data) +{ + RebuildState *rb = (RebuildState *)data; + rb->rebuildStep(); + + if (!rb->isDone()) + eventAdd("storeRebuild", RebuildStep, rb, 0.01, 1); + else { + -- StoreController::store_dirs_rebuilding; + storeRebuildComplete(&rb->counts); + delete rb; + } +} + +/// load entries from swap.state or files until we run out of entries or time +void +RebuildState::rebuildStep() +{ + currentEntry(NULL); + + // Balance our desire to maximize the number of entries processed at once + // (and, hence, minimize overheads and total rebuild time) with a + // requirement to also process Coordinator events, disk I/Os, etc. + const int maxSpentMsec = 50; // keep small: most RAM I/Os are under 1ms + const timeval loopStart = current_time; + + const int totalEntries = LogParser ? LogParser->SwapLogEntries() : -1; + + while (!isDone()) { + if (fromLog) + rebuildFromSwapLog(); + else + rebuildFromDirectory(); + + // TODO: teach storeRebuildProgress to handle totalEntries <= 0 + if (totalEntries > 0 && (n_read % 4000 == 0)) + storeRebuildProgress(sd->index, totalEntries, n_read); + + if (opt_foreground_rebuild) + continue; // skip "few entries at a time" check below + + getCurrentTime(); + const double elapsedMsec = tvSubMsec(loopStart, current_time); + if (elapsedMsec > maxSpentMsec || elapsedMsec < 0) { + debugs(47, 5, HERE << "pausing after " << n_read << " entries in " << + elapsedMsec << "ms; " << (elapsedMsec/n_read) << "ms per entry"); + break; + } + } +} + +/// process one cache file +void +RebuildState::rebuildFromDirectory() +{ + cache_key key[SQUID_MD5_DIGEST_LENGTH]; + + struct stat sb; + int fd = -1; + assert(this != NULL); + debugs(47, 3, HERE << "DIR #" << sd->index); + + assert(fd == -1); + sfileno filn = 0; + int size; + fd = getNextFile(&filn, &size); + + if (fd == -2) { + debugs(47, DBG_IMPORTANT, "Done scanning " << sd->path << " dir (" << + n_read << " entries)"); + _done = true; + return; + } else if (fd < 0) { + return; + } + + assert(fd > -1); + /* lets get file stats here */ + + ++n_read; + + if (fstat(fd, &sb) < 0) { + debugs(47, DBG_IMPORTANT, HERE << "fstat(FD " << fd << "): " << xstrerror()); + file_close(fd); + --store_open_disk_fd; + fd = -1; + return; + } + + MemBuf buf; + buf.init(SM_PAGE_SIZE, SM_PAGE_SIZE); + if (!storeRebuildLoadEntry(fd, sd->index, buf, counts)) + return; + + StoreEntry tmpe; + const bool loaded = storeRebuildParseEntry(buf, tmpe, key, counts, + (int64_t)sb.st_size); + + file_close(fd); + --store_open_disk_fd; + fd = -1; + + if (!loaded) { + // XXX: shouldn't this be a call to commonUfsUnlink? + sd->unlinkFile(filn); // should we unlink in all failure cases? + return; + } + + if (!storeRebuildKeepEntry(tmpe, key, counts)) + return; + + ++counts.objcount; + // tmpe.dump(5); + currentEntry(sd->addDiskRestore(key, + filn, + tmpe.swap_file_sz, + tmpe.expires, + tmpe.timestamp, + tmpe.lastref, + tmpe.lastmod, + tmpe.refcount, /* refcount */ + tmpe.flags, /* flags */ + (int) flags.clean)); + storeDirSwapLog(currentEntry(), SWAP_LOG_ADD); +} + +StoreEntry * +RebuildState::currentEntry() const +{ + return e; +} + +void +RebuildState::currentEntry(StoreEntry *newValue) +{ + e = newValue; +} + +/// process one swap log entry +void +RebuildState::rebuildFromSwapLog() +{ + StoreSwapLogData swapData; + + if (LogParser->ReadRecord(swapData) != 1) { + debugs(47, DBG_IMPORTANT, "Done reading " << sd->path << " swaplog (" << n_read << " entries)"); + LogParser->Close(); + delete LogParser; + LogParser = NULL; + _done = true; + return; + } + + ++n_read; + + if (!swapData.sane()) { + ++counts.invalid; + return; + } + + /* + * BC: during 2.4 development, we changed the way swap file + * numbers are assigned and stored. The high 16 bits used + * to encode the SD index number. There used to be a call + * to storeDirProperFileno here that re-assigned the index + * bits. Now, for backwards compatibility, we just need + * to mask it off. + */ + swapData.swap_filen &= 0x00FFFFFF; + + debugs(47, 3, HERE << swap_log_op_str[(int) swapData.op] << " " << + storeKeyText(swapData.key) << " "<< std::setfill('0') << + std::hex << std::uppercase << std::setw(8) << + swapData.swap_filen); + + if (swapData.op == SWAP_LOG_ADD) { + (void) 0; + } else if (swapData.op == SWAP_LOG_DEL) { + /* Delete unless we already have a newer copy anywhere in any store */ + /* this needs to become + * 1) unpack url + * 2) make synthetic request with headers ?? or otherwise search + * for a matching object in the store + * TODO FIXME change to new async api + */ + currentEntry (Store::Root().get(swapData.key)); + + if (currentEntry() != NULL && swapData.lastref >= e->lastref) { + undoAdd(); + --counts.objcount; + ++counts.cancelcount; + } + return; + } else { + const double + x = ::log(static_cast(++counts.bad_log_op)) / ::log(10.0); + + if (0.0 == x - (double) (int) x) + debugs(47, DBG_IMPORTANT, "WARNING: " << counts.bad_log_op << " invalid swap log entries found"); + + ++counts.invalid; + + return; + } + + ++counts.scancount; // XXX: should not this be incremented earlier? + + if (!sd->validFileno(swapData.swap_filen, 0)) { + ++counts.invalid; + return; + } + + if (EBIT_TEST(swapData.flags, KEY_PRIVATE)) { + ++counts.badflags; + return; + } + + /* this needs to become + * 1) unpack url + * 2) make synthetic request with headers ?? or otherwise search + * for a matching object in the store + * TODO FIXME change to new async api + */ + currentEntry (Store::Root().get(swapData.key)); + + int used; /* is swapfile already in use? */ + + used = sd->mapBitTest(swapData.swap_filen); + + /* If this URL already exists in the cache, does the swap log + * appear to have a newer entry? Compare 'lastref' from the + * swap log to e->lastref. */ + /* is the log entry newer than current entry? */ + int disk_entry_newer = currentEntry() ? (swapData.lastref > currentEntry()->lastref ? 1 : 0) : 0; + + if (used && !disk_entry_newer) { + /* log entry is old, ignore it */ + ++counts.clashcount; + return; + } else if (used && currentEntry() && currentEntry()->swap_filen == swapData.swap_filen && currentEntry()->swap_dirn == sd->index) { + /* swapfile taken, same URL, newer, update meta */ + + if (currentEntry()->store_status == STORE_OK) { + currentEntry()->lastref = swapData.timestamp; + currentEntry()->timestamp = swapData.timestamp; + currentEntry()->expires = swapData.expires; + currentEntry()->lastmod = swapData.lastmod; + currentEntry()->flags = swapData.flags; + currentEntry()->refcount += swapData.refcount; + sd->dereference(*currentEntry()); + } else { + debug_trap("commonUfsDirRebuildFromSwapLog: bad condition"); + debugs(47, DBG_IMPORTANT, HERE << "bad condition"); + } + return; + } else if (used) { + /* swapfile in use, not by this URL, log entry is newer */ + /* This is sorta bad: the log entry should NOT be newer at this + * point. If the log is dirty, the filesize check should have + * caught this. If the log is clean, there should never be a + * newer entry. */ + debugs(47, DBG_IMPORTANT, "WARNING: newer swaplog entry for dirno " << + sd->index << ", fileno "<< std::setfill('0') << std::hex << + std::uppercase << std::setw(8) << swapData.swap_filen); + + /* I'm tempted to remove the swapfile here just to be safe, + * but there is a bad race condition in the NOVM version if + * the swapfile has recently been opened for writing, but + * not yet opened for reading. Because we can't map + * swapfiles back to StoreEntrys, we don't know the state + * of the entry using that file. */ + /* We'll assume the existing entry is valid, probably because + * were in a slow rebuild and the the swap file number got taken + * and the validation procedure hasn't run. */ + assert(flags.need_to_validate); + ++counts.clashcount; + return; + } else if (currentEntry() && !disk_entry_newer) { + /* key already exists, current entry is newer */ + /* keep old, ignore new */ + ++counts.dupcount; + return; + } else if (currentEntry()) { + /* key already exists, this swapfile not being used */ + /* junk old, load new */ + undoAdd(); + --counts.objcount; + ++counts.dupcount; + } else { + /* URL doesnt exist, swapfile not in use */ + /* load new */ + (void) 0; + } + + ++counts.objcount; + + currentEntry(sd->addDiskRestore(swapData.key, + swapData.swap_filen, + swapData.swap_file_sz, + swapData.expires, + swapData.timestamp, + swapData.lastref, + swapData.lastmod, + swapData.refcount, + swapData.flags, + (int) flags.clean)); + + storeDirSwapLog(currentEntry(), SWAP_LOG_ADD); +} + +/// undo the effects of adding an entry in rebuildFromSwapLog() +void +RebuildState::undoAdd() +{ + StoreEntry *added = currentEntry(); + assert(added); + currentEntry(NULL); + + // TODO: Why bother with these two if we are going to release?! + added->expireNow(); + added->releaseRequest(); + + if (added->swap_filen > -1) { + UFSSwapDir *sde = dynamic_cast(INDEXSD(added->swap_dirn)); + assert(sde); + sde->undoAddDiskRestore(added); + } + + added->release(); +} + +int +RebuildState::getNextFile(sfileno * filn_p, int *size) +{ + int fd = -1; + int dirs_opened = 0; + debugs(47, 3, HERE << "flag=" << flags.init << ", " << + sd->index << ": /"<< std::setfill('0') << std::hex << + std::uppercase << std::setw(2) << curlvl1 << "/" << std::setw(2) << + curlvl2); + + if (done) + return -2; + + while (fd < 0 && done == 0) { + fd = -1; + + if (0 == flags.init) { /* initialize, open first file */ + done = 0; + curlvl1 = 0; + curlvl2 = 0; + in_dir = 0; + flags.init = 1; + assert(Config.cacheSwap.n_configured > 0); + } + + if (0 == in_dir) { /* we need to read in a new directory */ + snprintf(fullpath, MAXPATHLEN, "%s/%02X/%02X", + sd->path, + curlvl1, curlvl2); + + if (dirs_opened) + return -1; + + td = opendir(fullpath); + + ++dirs_opened; + + if (td == NULL) { + debugs(47, DBG_IMPORTANT, HERE << "error in opendir (" << fullpath << "): " << xstrerror()); + } else { + entry = readdir(td); /* skip . and .. */ + entry = readdir(td); + + if (entry == NULL && errno == ENOENT) + debugs(47, DBG_IMPORTANT, HERE << "WARNING: directory does not exist!"); + debugs(47, 3, HERE << "Directory " << fullpath); + } + } + + if (td != NULL && (entry = readdir(td)) != NULL) { + ++in_dir; + + if (sscanf(entry->d_name, "%x", &fn) != 1) { + debugs(47, 3, HERE << "invalid entry " << entry->d_name); + continue; + } + + if (!UFSSwapDir::FilenoBelongsHere(fn, sd->index, curlvl1, curlvl2)) { + debugs(47, 3, HERE << std::setfill('0') << + std::hex << std::uppercase << std::setw(8) << fn << + " does not belong in " << std::dec << sd->index << "/" << + curlvl1 << "/" << curlvl2); + + continue; + } + + if (sd->mapBitTest(fn)) { + debugs(47, 3, HERE << "Locked, continuing with next."); + continue; + } + + snprintf(fullfilename, MAXPATHLEN, "%s/%s", + fullpath, entry->d_name); + debugs(47, 3, HERE << "Opening " << fullfilename); + fd = file_open(fullfilename, O_RDONLY | O_BINARY); + + if (fd < 0) + debugs(47, DBG_IMPORTANT, HERE << "error opening " << fullfilename << ": " << xstrerror()); + else + ++store_open_disk_fd; + + continue; + } + + if (td != NULL) + closedir(td); + + td = NULL; + + in_dir = 0; + + if (sd->validL2(++curlvl2)) + continue; + + curlvl2 = 0; + + if (sd->validL1(++curlvl1)) + continue; + + curlvl1 = 0; + + done = 1; + } + + *filn_p = fn; + return fd; +} + +bool +RebuildState::error() const +{ + return false; +} + +bool +RebuildState::isDone() const +{ + return _done; +} + +StoreEntry * +RebuildState::currentItem() +{ + return currentEntry(); +} + === added file 'src/fs/ufs/RebuildState.h' --- src/fs/ufs/RebuildState.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/RebuildState.h 2012-08-04 12:11:57 +0000 @@ -0,0 +1,93 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_FS_UFS_REBUILDSTATE_H +#define SQUID_FS_UFS_REBUILDSTATE_H + +#include "RefCount.h" +#include "UFSSwapDir.h" +#include "structs.h" + +class StoreEntry; +class UFSSwapLogParser; + +/// \ingroup UFS +class RebuildState : public RefCountable +{ +public: + static EVH RebuildStep; + + RebuildState(RefCount sd); + ~RebuildState(); + + virtual bool error() const; + virtual bool isDone() const; + virtual StoreEntry *currentItem(); + + RefCount sd; + int n_read; + /* FILE *log;*/ + UFSSwapLogParser *LogParser; + int curlvl1; + int curlvl2; + + struct { + unsigned int need_to_validate:1; + unsigned int clean:1; + unsigned int init:1; + } flags; + int in_dir; + int done; + int fn; + + dirent_t *entry; + DIR *td; + char fullpath[MAXPATHLEN]; + char fullfilename[MAXPATHLEN]; + + struct _store_rebuild_data counts; + +private: + void rebuildFromDirectory(); + void rebuildFromSwapLog(); + void rebuildStep(); + void undoAdd(); + int getNextFile(sfileno *, int *size); + StoreEntry *currentEntry() const; + void currentEntry(StoreEntry *); + StoreEntry *e; + bool fromLog; + bool _done; + /// \bug (callback) should be hidden behind a proper human readable name + void (callback)(void *cbdata); + void *cbdata; + CBDATA_CLASS2(RebuildState); +}; + +#endif /* SQUID_FS_UFS_REBUILDSTATE_H */ === modified file 'src/fs/ufs/StoreFSufs.cc' --- src/fs/ufs/StoreFSufs.cc 2012-01-20 18:55:04 +0000 +++ src/fs/ufs/StoreFSufs.cc 2012-07-31 22:17:07 +0000 @@ -1,6 +1,4 @@ /* - * $Id$ - * * DEBUG: section 47 Store Directory Routines * AUTHOR: Robert Collins * @@ -41,13 +39,11 @@ #endif #include "fs/ufs/StoreFSufs.h" +#include "fs/ufs/UFSSwapDir.h" #if 0 #include "DiskIO/DiskIOModule.h" #endif -/** \todo FIXME: break UFSSwapDir out so we don't build all the extras */ -#include "fs/ufs/ufscommon.h" - /* Unused variable: */ StoreFSufs *UfsInstance_foo = NULL; === modified file 'src/fs/ufs/StoreFSufs.h' --- src/fs/ufs/StoreFSufs.h 2009-01-21 03:47:47 +0000 +++ src/fs/ufs/StoreFSufs.h 2012-08-02 21:40:53 +0000 @@ -37,10 +37,10 @@ \ingroup FileSystems */ +#include "StoreFileSystem.h" + class DiskIOModule; -#include "StoreFileSystem.h" - /** \ingroup UFS, FileSystems * @@ -52,7 +52,6 @@ template class StoreFSufs : public StoreFileSystem { - public: static StoreFileSystem &GetInstance(); StoreFSufs(char const *DefaultModuleType, char const *label); === added file 'src/fs/ufs/StoreSearchUFS.cc' --- src/fs/ufs/StoreSearchUFS.cc 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/StoreSearchUFS.cc 2012-08-02 21:40:53 +0000 @@ -0,0 +1,90 @@ +/* + * DEBUG: section 47 Store Directory Routines + * AUTHOR: Robert Collins + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "cbdata.h" +#include "StoreSearchUFS.h" +#include "UFSSwapDir.h" + +CBDATA_CLASS_INIT(StoreSearchUFS); + +StoreSearchUFS::StoreSearchUFS(RefCount aSwapDir) : + sd(aSwapDir), walker (sd->repl->WalkInit(sd->repl)), + current (NULL), _done (false) +{} + +StoreSearchUFS::~StoreSearchUFS() +{ + walker->Done(walker); + walker = NULL; +} + +void +StoreSearchUFS::next(void (aCallback)(void *cbdata), void *aCallbackArgs) +{ + next(); + aCallback(aCallbackArgs); +} + +bool +StoreSearchUFS::next() +{ + /* the walker API doesn't make sense. the store entries referred to are already readwrite + * from their hash table entries + */ + + if (walker) + current = const_cast(walker->Next(walker)); + + if (current == NULL) + _done = true; + + return current != NULL; +} + +bool +StoreSearchUFS::error() const +{ + return false; +} + +bool +StoreSearchUFS::isDone() const +{ + return _done; +} + +StoreEntry * +StoreSearchUFS::currentItem() +{ + return current; +} === added file 'src/fs/ufs/StoreSearchUFS.h' --- src/fs/ufs/StoreSearchUFS.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/StoreSearchUFS.h 2012-08-04 12:11:57 +0000 @@ -0,0 +1,76 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_FS_UFS_STORESEARCHUFS_H +#define SQUID_FS_UFS_STORESEARCHUFS_H + +#include "StoreSearch.h" +#include "UFSSwapDir.h" + +/// \ingroup UFS +class StoreSearchUFS : public StoreSearch +{ +public: + StoreSearchUFS(RefCount sd); + virtual ~StoreSearchUFS(); + + /** \todo Iterator API - garh, wrong place */ + /** + * callback the client when a new StoreEntry is available + * or an error occurs + */ + virtual void next(void (callback)(void *cbdata), void *cbdata); + + /** + \retval true if a new StoreEntry is immediately available + \retval false if a new StoreEntry is NOT immediately available + */ + virtual bool next(); + + virtual bool error() const; + virtual bool isDone() const; + virtual StoreEntry *currentItem(); + + RefCount sd; + RemovalPolicyWalker *walker; + +private: + /// \bug (callback) should be hidden behind a proper human readable name + void (callback)(void *cbdata); + void *cbdata; + StoreEntry * current; + bool _done; + + StoreSearchUFS(StoreSearchUFS const &); //disabled + StoreSearchUFS& operator=(StoreSearchUFS const &); //disabled + StoreSearchUFS(); //disabled + CBDATA_CLASS2(StoreSearchUFS); +}; + +#endif /* SQUID_FS_UFS_STORESEARCHUFS_H */ === added file 'src/fs/ufs/UFSStoreState.h' --- src/fs/ufs/UFSStoreState.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSStoreState.h 2012-08-04 12:11:57 +0000 @@ -0,0 +1,122 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_FS_UFS_UFSSTORESTATE_H +#define SQUID_FS_UFS_UFSSTORESTATE_H + +#include "DiskIO/IORequestor.h" +#include "StoreIOState.h" + +/// \ingroup UFS +class UFSStoreState : public StoreIOState, public IORequestor +{ +public: + void * operator new (size_t); + void operator delete (void *); + UFSStoreState(SwapDir * SD, StoreEntry * anEntry, STIOCB * callback_, void *callback_data_); + ~UFSStoreState(); + virtual void close(int how); + virtual void closeCompleted(); + // protected: + virtual void ioCompletedNotification(); + virtual void readCompleted(const char *buf, int len, int errflag, RefCount); + virtual void writeCompleted(int errflag, size_t len, RefCount); + RefCount theFile; + bool opening; + bool creating; + bool closing; + bool reading; + bool writing; + void read_(char *buf, size_t size, off_t offset, STRCB * callback, void *callback_data); + void write(char const *buf, size_t size, off_t offset, FREE * free_func); + +protected: + virtual void doCloseCallback (int errflag); + + class _queued_read + { + public: + MEMPROXY_CLASS(UFSStoreState::_queued_read); + char *buf; + size_t size; + off_t offset; + STRCB *callback; + void *callback_data; + + }; + + class _queued_write + { + public: + MEMPROXY_CLASS(UFSStoreState::_queued_write); + char const *buf; + size_t size; + off_t offset; + FREE *free_func; + + }; + + /** \todo These should be in the IO strategy */ + + struct { + /** + * DPW 2006-05-24 + * the write_draining flag is used to avoid recursion inside + * the UFSStoreState::drainWriteQueue() method. + */ + bool write_draining; + /** + * DPW 2006-05-24 + * The try_closing flag is set by UFSStoreState::tryClosing() + * when UFSStoreState wants to close the file, but cannot + * because of pending I/Os. If set, UFSStoreState will + * try to close again in the I/O callbacks. + */ + bool try_closing; + } flags; + link_list *pending_reads; + link_list *pending_writes; + void queueRead(char *, size_t, off_t, STRCB *, void *); + void queueWrite(char const *, size_t, off_t, FREE *); + bool kickReadQueue(); + void drainWriteQueue(); + void tryClosing(); + char *read_buf; + +private: + void openDone(); + void freePending(); + void doWrite(); + CBDATA_CLASS(UFSStoreState); +}; + +MEMPROXY_CLASS_INLINE(UFSStoreState::_queued_read); +MEMPROXY_CLASS_INLINE(UFSStoreState::_queued_write); + +#endif /* SQUID_FS_UFS_UFSSTORESTATE_H */ === added file 'src/fs/ufs/UFSStrategy.cc' --- src/fs/ufs/UFSStrategy.cc 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSStrategy.cc 2012-08-02 18:24:15 +0000 @@ -0,0 +1,183 @@ +/* + * DEBUG: section 47 Store Directory Routines + * AUTHOR: Robert Collins + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "squid.h" + +#include "DiskIO/DiskIOStrategy.h" +#include "UFSStrategy.h" +#include "UFSStoreState.h" +#include "UFSSwapDir.h" + +bool +UFSStrategy::shedLoad() +{ + return io->shedLoad(); +} + +int +UFSStrategy::load() +{ + return io->load(); +} + +UFSStrategy::UFSStrategy (DiskIOStrategy *anIO) : io(anIO) +{} + +UFSStrategy::~UFSStrategy () +{ + delete io; +} + +StoreIOState::Pointer +UFSStrategy::createState(SwapDir *SD, StoreEntry *e, StoreIOState::STIOCB * aCallback, void *callback_data) const +{ + return new UFSStoreState (SD, e, aCallback, callback_data); +} + +DiskFile::Pointer +UFSStrategy::newFile (char const *path) +{ + return io->newFile(path); +} + +void +UFSStrategy::unlinkFile(char const *path) +{ + io->unlinkFile(path); +} + +StoreIOState::Pointer +UFSStrategy::open(SwapDir * SD, StoreEntry * e, StoreIOState::STFNCB * file_callback, + StoreIOState::STIOCB * aCallback, void *callback_data) +{ + assert (((UFSSwapDir *)SD)->IO == this); + debugs(79, 3, HERE << "fileno "<< std::setfill('0') << std::hex + << std::uppercase << std::setw(8) << e->swap_filen); + + /* to consider: make createstate a private UFSStrategy call */ + StoreIOState::Pointer sio = createState (SD, e, aCallback, callback_data); + + sio->mode |= O_RDONLY; + + UFSStoreState *state = dynamic_cast (sio.getRaw()); + + assert (state); + + char *path = ((UFSSwapDir *)SD)->fullPath(e->swap_filen, NULL); + + DiskFile::Pointer myFile = newFile (path); + + if (myFile.getRaw() == NULL) + return NULL; + + state->theFile = myFile; + + state->opening = true; + + myFile->open (sio->mode, 0644, state); + + if (myFile->error()) + return NULL; + + return sio; +} + +StoreIOState::Pointer +UFSStrategy::create(SwapDir * SD, StoreEntry * e, StoreIOState::STFNCB * file_callback, + StoreIOState::STIOCB * aCallback, void *callback_data) +{ + assert (((UFSSwapDir *)SD)->IO == this); + /* Allocate a number */ + sfileno filn = ((UFSSwapDir *)SD)->mapBitAllocate(); + debugs(79, 3, HERE << "fileno "<< std::setfill('0') << + std::hex << std::uppercase << std::setw(8) << filn); + + /* Shouldn't we handle a 'bitmap full' error here? */ + + StoreIOState::Pointer sio = createState (SD, e, aCallback, callback_data); + + sio->mode |= O_WRONLY | O_CREAT | O_TRUNC; + + sio->swap_filen = filn; + + UFSStoreState *state = dynamic_cast (sio.getRaw()); + + assert (state); + + char *path = ((UFSSwapDir *)SD)->fullPath(filn, NULL); + + DiskFile::Pointer myFile = newFile (path); + + if (myFile.getRaw() == NULL) { + ((UFSSwapDir *)SD)->mapBitReset (filn); + return NULL; + } + + state->theFile = myFile; + + state->creating = true; + + myFile->create (state->mode, 0644, state); + + if (myFile->error()) { + ((UFSSwapDir *)SD)->mapBitReset (filn); + return NULL; + } + + /* now insert into the replacement policy */ + ((UFSSwapDir *)SD)->replacementAdd(e); + + return sio; +} + +int +UFSStrategy::callback() +{ + return io->callback(); +} + +void +UFSStrategy::init() +{ + io->init(); +} + +void +UFSStrategy::sync() +{ + io->sync(); +} + +void +UFSStrategy::statfs(StoreEntry & sentry)const +{ + io->statfs(sentry); +} === added file 'src/fs/ufs/UFSStrategy.h' --- src/fs/ufs/UFSStrategy.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSStrategy.h 2012-08-02 21:40:53 +0000 @@ -0,0 +1,83 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_FS_UFS_UFSSTRATEGY_H +#define SQUID_FS_UFS_UFSSTRATEGY_H + +#include "DiskIO/DiskFile.h" +#include "StoreIOState.h" + +class Swapdir; +class StoreEntry; +class DiskIOStrategy; + +/// \ingroup UFS +class UFSStrategy +{ +public: + UFSStrategy (DiskIOStrategy *); + virtual ~UFSStrategy (); + virtual bool shedLoad(); + + virtual int load(); + + StoreIOState::Pointer createState(SwapDir *SD, StoreEntry *e, StoreIOState::STIOCB * callback, void *callback_data) const; + /* UFS specific */ + virtual RefCount newFile (char const *path); + StoreIOState::Pointer open(SwapDir *, StoreEntry *, StoreIOState::STFNCB *, + StoreIOState::STIOCB *, void *); + StoreIOState::Pointer create(SwapDir *, StoreEntry *, StoreIOState::STFNCB *, + StoreIOState::STIOCB *, void *); + + virtual void unlinkFile (char const *); + virtual void sync(); + + virtual int callback(); + + /** Init per-instance logic */ + virtual void init(); + + /** cachemgr output on the IO instance stats */ + virtual void statfs(StoreEntry & sentry)const; + + /** The io strategy in use */ + DiskIOStrategy *io; + +protected: + + friend class UFSSwapDir; + +private: + UFSStrategy(); //disabled + UFSStrategy(UFSStrategy const &); //disabled + UFSStrategy &operator=(UFSStrategy const &); //disabled + +}; + +#endif /* SQUID_FS_UFS_UFSSTRATEGY_H */ === added file 'src/fs/ufs/UFSSwapDir.cc' --- src/fs/ufs/UFSSwapDir.cc 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSSwapDir.cc 2012-08-03 15:41:59 +0000 @@ -0,0 +1,1350 @@ +/* + * DEBUG: section 47 Store Directory Routines + * AUTHOR: Robert Collins + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "squid-old.h" + +#define CLEAN_BUF_SZ 16384 + +#include "ConfigOption.h" +#include "DiskIO/DiskIOModule.h" +#include "FileMap.h" +#include "fde.h" +#include "Parsing.h" +#include "protos.h" +#include "RebuildState.h" +#include "SquidMath.h" +#include "DiskIO/DiskIOStrategy.h" +#include "StoreSearchUFS.h" +#include "StoreSwapLogData.h" +#include "SquidTime.h" +#include "StatCounters.h" +#include "UFSSwapDir.h" + + +int UFSSwapDir::NumberOfUFSDirs = 0; +int *UFSSwapDir::UFSDirToGlobalDirMapping = NULL; + +class UFSCleanLog : public SwapDir::CleanLog +{ + +public: + UFSCleanLog(SwapDir *); + /** Get the next entry that is a candidate for clean log writing + */ + virtual const StoreEntry *nextEntry(); + /** "write" an entry to the clean log file. + */ + virtual void write(StoreEntry const &); + char *cur; + char *newLog; + char *cln; + char *outbuf; + off_t outbuf_offset; + int fd; + RemovalPolicyWalker *walker; + SwapDir *sd; +}; + +UFSCleanLog::UFSCleanLog(SwapDir *aSwapDir) : + cur(NULL), newLog(NULL), cln(NULL), outbuf(NULL), + outbuf_offset(0), fd(-1),walker(NULL), sd(aSwapDir) +{} + +const StoreEntry * +UFSCleanLog::nextEntry() +{ + const StoreEntry *entry = NULL; + + if (walker) + entry = walker->Next(walker); + + return entry; +} + +void +UFSCleanLog::write(StoreEntry const &e) +{ + StoreSwapLogData s; + static size_t ss = sizeof(StoreSwapLogData); + s.op = (char) SWAP_LOG_ADD; + s.swap_filen = e.swap_filen; + s.timestamp = e.timestamp; + s.lastref = e.lastref; + s.expires = e.expires; + s.lastmod = e.lastmod; + s.swap_file_sz = e.swap_file_sz; + s.refcount = e.refcount; + s.flags = e.flags; + memcpy(&s.key, e.key, SQUID_MD5_DIGEST_LENGTH); + s.finalize(); + memcpy(outbuf + outbuf_offset, &s, ss); + outbuf_offset += ss; + /* buffered write */ + + if (outbuf_offset + ss >= CLEAN_BUF_SZ) { + if (FD_WRITE_METHOD(fd, outbuf, outbuf_offset) < 0) { + /* XXX This error handling should probably move up to the caller */ + debugs(50, DBG_CRITICAL, HERE << newLog << ": write: " << xstrerror()); + debugs(50, DBG_CRITICAL, HERE << "Current swap logfile not replaced."); + file_close(fd); + fd = -1; + unlink(newLog); + sd->cleanLog = NULL; + delete this; + return; + } + + outbuf_offset = 0; + } +} + +bool +UFSSwapDir::canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const +{ + if (!SwapDir::canStore(e, diskSpaceNeeded, load)) + return false; + + if (IO->shedLoad()) + return false; + + load = IO->load(); + return true; +} + +static void +FreeObject(void *address) +{ + StoreSwapLogData *anObject = static_cast (address); + delete anObject; +} + +static QS rev_int_sort; +static int +rev_int_sort(const void *A, const void *B) +{ + const int *i1 = (const int *)A; + const int *i2 = (const int *)B; + return *i2 - *i1; +} + +void +UFSSwapDir::parseSizeL1L2() +{ + int i = GetInteger(); + if (i <= 0) + fatal("UFSSwapDir::parseSizeL1L2: invalid size value"); + + const uint64_t size = static_cast(i) << 20; // MBytes to Bytes + + /* just reconfigure it */ + if (reconfiguring) { + if (size == maxSize()) + debugs(3, 2, "Cache dir '" << path << "' size remains unchanged at " << i << " MB"); + else + debugs(3, DBG_IMPORTANT, "Cache dir '" << path << "' size changed to " << i << " MB"); + } + + max_size = size; + + l1 = GetInteger(); + + if (l1 <= 0) + fatal("UFSSwapDir::parseSizeL1L2: invalid level 1 directories value"); + + l2 = GetInteger(); + + if (l2 <= 0) + fatal("UFSSwapDir::parseSizeL1L2: invalid level 2 directories value"); +} + +void +UFSSwapDir::reconfigure() +{ + parseSizeL1L2(); + parseOptions(1); +} + +void +UFSSwapDir::parse (int anIndex, char *aPath) +{ + index = anIndex; + path = xstrdup(aPath); + + parseSizeL1L2(); + + /* Initialise replacement policy stuff */ + repl = createRemovalPolicy(Config.replPolicy); + + parseOptions(0); +} + +void +UFSSwapDir::changeIO(DiskIOModule *module) +{ + DiskIOStrategy *anIO = module->createStrategy(); + safe_free(ioType); + ioType = xstrdup(module->type()); + + delete IO->io; + IO->io = anIO; + /* Change the IO Options */ + + if (currentIOOptions && currentIOOptions->options.size() > 2) + delete currentIOOptions->options.pop_back(); + + /* TODO: factor out these 4 lines */ + ConfigOption *ioOptions = IO->io->getOptionTree(); + + if (ioOptions) + currentIOOptions->options.push_back(ioOptions); +} + +bool +UFSSwapDir::optionIOParse(char const *option, const char *value, int isaReconfig) +{ + if (strcmp(option, "IOEngine") != 0) + return false; + + if (isaReconfig) + /* silently ignore this */ + return true; + + if (!value) + self_destruct(); + + DiskIOModule *module = DiskIOModule::Find(value); + + if (!module) + self_destruct(); + + changeIO(module); + + return true; +} + +void +UFSSwapDir::optionIODump(StoreEntry * e) const +{ + storeAppendPrintf(e, " IOEngine=%s", ioType); +} + +ConfigOption * +UFSSwapDir::getOptionTree() const +{ + ConfigOption *parentResult = SwapDir::getOptionTree(); + + if (currentIOOptions == NULL) + currentIOOptions = new ConfigOptionVector(); + + currentIOOptions->options.push_back(parentResult); + + currentIOOptions->options.push_back(new ConfigOptionAdapter(*const_cast(this), &UFSSwapDir::optionIOParse, &UFSSwapDir::optionIODump)); + + if (ConfigOption *ioOptions = IO->io->getOptionTree()) + currentIOOptions->options.push_back(ioOptions); + + ConfigOption* result = currentIOOptions; + + currentIOOptions = NULL; + + return result; +} + +void +UFSSwapDir::init() +{ + debugs(47, 3, HERE << "Initialising UFS SwapDir engine."); + /* Parsing must be finished by now - force to NULL, don't delete */ + currentIOOptions = NULL; + static int started_clean_event = 0; + static const char *errmsg = + "\tFailed to verify one of the swap directories, Check cache.log\n" + "\tfor details. Run 'squid -z' to create swap directories\n" + "\tif needed, or if running Squid for the first time."; + IO->init(); + + if (verifyCacheDirs()) + fatal(errmsg); + + openLog(); + + rebuild(); + + if (!started_clean_event) { + eventAdd("UFS storeDirClean", CleanEvent, NULL, 15.0, 1); + started_clean_event = 1; + } + + (void) storeDirGetBlkSize(path, &fs.blksize); +} + +void +UFSSwapDir::create() +{ + debugs(47, 3, "Creating swap space in " << path); + createDirectory(path, 0); + createSwapSubDirs(); +} + +UFSSwapDir::UFSSwapDir(char const *aType, const char *anIOType) : SwapDir(aType), IO(NULL), map(new FileMap()), suggest(0), swaplog_fd (-1), currentIOOptions(new ConfigOptionVector()), ioType(xstrdup(anIOType)), cur_size(0), n_disk_objects(0) +{ + /* modulename is only set to disk modules that are built, by configure, + * so the Find call should never return NULL here. + */ + IO = new UFSStrategy(DiskIOModule::Find(anIOType)->createStrategy()); +} + +UFSSwapDir::~UFSSwapDir() +{ + if (swaplog_fd > -1) { + file_close(swaplog_fd); + swaplog_fd = -1; + } + + delete map; + + if (IO) + delete IO; + + IO = NULL; + + safe_free(ioType); +} + +void +UFSSwapDir::dumpEntry(StoreEntry &e) const +{ + debugs(47, DBG_CRITICAL, HERE << "FILENO "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << e.swap_filen); + debugs(47, DBG_CRITICAL, HERE << "PATH " << fullPath(e.swap_filen, NULL) ); + e.dump(0); +} + +bool +UFSSwapDir::doubleCheck(StoreEntry & e) +{ + + struct stat sb; + + if (::stat(fullPath(e.swap_filen, NULL), &sb) < 0) { + debugs(47, DBG_CRITICAL, HERE << "WARNING: Missing swap file"); + dumpEntry(e); + return true; + } + + if ((off_t)e.swap_file_sz != sb.st_size) { + debugs(47, DBG_CRITICAL, HERE << "WARNING: Size Mismatch. Entry size: " + << e.swap_file_sz << ", file size: " << sb.st_size); + dumpEntry(e); + return true; + } + + return false; +} + +void +UFSSwapDir::statfs(StoreEntry & sentry) const +{ + int totl_kb = 0; + int free_kb = 0; + int totl_in = 0; + int free_in = 0; + int x; + storeAppendPrintf(&sentry, "First level subdirectories: %d\n", l1); + storeAppendPrintf(&sentry, "Second level subdirectories: %d\n", l2); + storeAppendPrintf(&sentry, "Maximum Size: %" PRIu64 " KB\n", maxSize() >> 10); + storeAppendPrintf(&sentry, "Current Size: %.2f KB\n", currentSize() / 1024.0); + storeAppendPrintf(&sentry, "Percent Used: %0.2f%%\n", + Math::doublePercent(currentSize(), maxSize())); + storeAppendPrintf(&sentry, "Filemap bits in use: %d of %d (%d%%)\n", + map->numFilesInMap(), map->capacity(), + Math::intPercent(map->numFilesInMap(), map->capacity())); + x = storeDirGetUFSStats(path, &totl_kb, &free_kb, &totl_in, &free_in); + + if (0 == x) { + storeAppendPrintf(&sentry, "Filesystem Space in use: %d/%d KB (%d%%)\n", + totl_kb - free_kb, + totl_kb, + Math::intPercent(totl_kb - free_kb, totl_kb)); + storeAppendPrintf(&sentry, "Filesystem Inodes in use: %d/%d (%d%%)\n", + totl_in - free_in, + totl_in, + Math::intPercent(totl_in - free_in, totl_in)); + } + + storeAppendPrintf(&sentry, "Flags:"); + + if (flags.selected) + storeAppendPrintf(&sentry, " SELECTED"); + + if (flags.read_only) + storeAppendPrintf(&sentry, " READ-ONLY"); + + storeAppendPrintf(&sentry, "\n"); + + IO->statfs(sentry); +} + +void +UFSSwapDir::maintain() +{ + /* We can't delete objects while rebuilding swap */ + + /* XXX FIXME each store should start maintaining as it comes online. */ + + if (StoreController::store_dirs_rebuilding) + return; + + StoreEntry *e = NULL; + + int removed = 0; + + RemovalPurgeWalker *walker; + + double f = (double) (currentSize() - minSize()) / (maxSize() - minSize()); + + f = f < 0.0 ? 0.0 : f > 1.0 ? 1.0 : f; + + int max_scan = (int) (f * 400.0 + 100.0); + + int max_remove = (int) (f * 70.0 + 10.0); + + /* + * This is kinda cheap, but so we need this priority hack? + */ + + debugs(47, 3, HERE << "f=" << f << ", max_scan=" << max_scan << ", max_remove=" << max_remove ); + + walker = repl->PurgeInit(repl, max_scan); + + while (1) { + if (currentSize() < minSize()) + break; + + if (removed >= max_remove) + break; + + e = walker->Next(walker); + + if (!e) + break; /* no more objects */ + + ++removed; + + e->release(); + } + + walker->Done(walker); + debugs(47, (removed ? 2 : 3), HERE << path << + " removed " << removed << "/" << max_remove << " f=" << + std::setprecision(4) << f << " max_scan=" << max_scan); +} + +void +UFSSwapDir::reference(StoreEntry &e) +{ + debugs(47, 3, HERE << "referencing " << &e << " " << + e.swap_dirn << "/" << e.swap_filen); + + if (repl->Referenced) + repl->Referenced(repl, &e, &e.repl); +} + +bool +UFSSwapDir::dereference(StoreEntry & e) +{ + debugs(47, 3, HERE << "dereferencing " << &e << " " << + e.swap_dirn << "/" << e.swap_filen); + + if (repl->Dereferenced) + repl->Dereferenced(repl, &e, &e.repl); + + return true; // keep e in the global store_table +} + +StoreIOState::Pointer +UFSSwapDir::createStoreIO(StoreEntry &e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * aCallback, void *callback_data) +{ + return IO->create (this, &e, file_callback, aCallback, callback_data); +} + +StoreIOState::Pointer +UFSSwapDir::openStoreIO(StoreEntry &e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * aCallback, void *callback_data) +{ + return IO->open (this, &e, file_callback, aCallback, callback_data); +} + +int +UFSSwapDir::mapBitTest(sfileno filn) +{ + return map->testBit(filn); +} + +void +UFSSwapDir::mapBitSet(sfileno filn) +{ + map->setBit(filn); +} + +void +UFSSwapDir::mapBitReset(sfileno filn) +{ + /* + * We have to test the bit before calling clearBit as + * it doesn't do bounds checking and blindly assumes + * filn is a valid file number, but it might not be because + * the map is dynamic in size. Also clearing an already clear + * bit puts the map counter of-of-whack. + */ + + if (map->testBit(filn)) + map->clearBit(filn); +} + +int +UFSSwapDir::mapBitAllocate() +{ + int fn; + fn = map->allocate(suggest); + map->setBit(fn); + suggest = fn + 1; + return fn; +} + +char * +UFSSwapDir::swapSubDir(int subdirn)const +{ + LOCAL_ARRAY(char, fullfilename, MAXPATHLEN); + assert(0 <= subdirn && subdirn < l1); + snprintf(fullfilename, MAXPATHLEN, "%s/%02X", path, subdirn); + return fullfilename; +} + +int +UFSSwapDir::createDirectory(const char *aPath, int should_exist) +{ + int created = 0; + + struct stat st; + getCurrentTime(); + + if (0 == ::stat(aPath, &st)) { + if (S_ISDIR(st.st_mode)) { + debugs(47, (should_exist ? 3 : DBG_IMPORTANT), aPath << " exists"); + } else { + fatalf("Swap directory %s is not a directory.", aPath); + } + +#if _SQUID_MSWIN_ + + } else if (0 == mkdir(aPath)) { +#else + + } else if (0 == mkdir(aPath, 0755)) { +#endif + debugs(47, (should_exist ? DBG_IMPORTANT : 3), aPath << " created"); + created = 1; + } else { + fatalf("Failed to make swap directory %s: %s", + aPath, xstrerror()); + } + + return created; +} + +bool +UFSSwapDir::pathIsDirectory(const char *aPath)const +{ + + struct stat sb; + + if (::stat(aPath, &sb) < 0) { + debugs(47, DBG_CRITICAL, "ERROR: " << aPath << ": " << xstrerror()); + return false; + } + + if (S_ISDIR(sb.st_mode) == 0) { + debugs(47, DBG_CRITICAL, "WARNING: " << aPath << " is not a directory"); + return false; + } + + return true; +} + +bool +UFSSwapDir::verifyCacheDirs() +{ + if (!pathIsDirectory(path)) + return true; + + for (int j = 0; j < l1; ++j) { + char const *aPath = swapSubDir(j); + + if (!pathIsDirectory(aPath)) + return true; + } + + return false; +} + +void +UFSSwapDir::createSwapSubDirs() +{ + LOCAL_ARRAY(char, name, MAXPATHLEN); + + for (int i = 0; i < l1; ++i) { + snprintf(name, MAXPATHLEN, "%s/%02X", path, i); + + int should_exist; + + if (createDirectory(name, 0)) + should_exist = 0; + else + should_exist = 1; + + debugs(47, DBG_IMPORTANT, "Making directories in " << name); + + for (int k = 0; k < l2; ++k) { + snprintf(name, MAXPATHLEN, "%s/%02X/%02X", path, i, k); + createDirectory(name, should_exist); + } + } +} + +char * +UFSSwapDir::logFile(char const *ext) const +{ + LOCAL_ARRAY(char, lpath, MAXPATHLEN); + LOCAL_ARRAY(char, pathtmp, MAXPATHLEN); + LOCAL_ARRAY(char, digit, 32); + char *pathtmp2; + + if (Config.Log.swap) { + xstrncpy(pathtmp, path, MAXPATHLEN - 64); + pathtmp2 = pathtmp; + + while ((pathtmp2 = strchr(pathtmp2, '/')) != NULL) + *pathtmp2 = '.'; + + while (strlen(pathtmp) && pathtmp[strlen(pathtmp) - 1] == '.') + pathtmp[strlen(pathtmp) - 1] = '\0'; + + for (pathtmp2 = pathtmp; *pathtmp2 == '.'; ++pathtmp2); + snprintf(lpath, MAXPATHLEN - 64, Config.Log.swap, pathtmp2); + + if (strncmp(lpath, Config.Log.swap, MAXPATHLEN - 64) == 0) { + strcat(lpath, "."); + snprintf(digit, 32, "%02d", index); + strncat(lpath, digit, 3); + } + } else { + xstrncpy(lpath, path, MAXPATHLEN - 64); + strcat(lpath, "/swap.state"); + } + + if (ext) + strncat(lpath, ext, 16); + + return lpath; +} + +void +UFSSwapDir::openLog() +{ + char *logPath; + logPath = logFile(); + swaplog_fd = file_open(logPath, O_WRONLY | O_CREAT | O_BINARY); + + if (swaplog_fd < 0) { + debugs(50, DBG_IMPORTANT, "ERROR opening swap log " << logPath << ": " << xstrerror()); + fatal("UFSSwapDir::openLog: Failed to open swap log."); + } + + debugs(50, 3, HERE << "Cache Dir #" << index << " log opened on FD " << swaplog_fd); + + if (0 == NumberOfUFSDirs) + assert(NULL == UFSDirToGlobalDirMapping); + + ++NumberOfUFSDirs; + + assert(NumberOfUFSDirs <= Config.cacheSwap.n_configured); +} + +void +UFSSwapDir::closeLog() +{ + if (swaplog_fd < 0) /* not open */ + return; + + file_close(swaplog_fd); + + debugs(47, 3, "Cache Dir #" << index << " log closed on FD " << swaplog_fd); + + swaplog_fd = -1; + + --NumberOfUFSDirs; + + assert(NumberOfUFSDirs >= 0); + + if (0 == NumberOfUFSDirs) + safe_free(UFSDirToGlobalDirMapping); +} + +bool +UFSSwapDir::validL1(int anInt) const +{ + return anInt < l1; +} + +bool +UFSSwapDir::validL2(int anInt) const +{ + return anInt < l2; +} + +StoreEntry * +UFSSwapDir::addDiskRestore(const cache_key * key, + sfileno file_number, + uint64_t swap_file_sz, + time_t expires, + time_t timestamp, + time_t lastref, + time_t lastmod, + uint32_t refcount, + uint16_t newFlags, + int clean) +{ + StoreEntry *e = NULL; + debugs(47, 5, HERE << storeKeyText(key) << + ", fileno="<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << file_number); + /* if you call this you'd better be sure file_number is not + * already in use! */ + e = new StoreEntry(); + e->store_status = STORE_OK; + e->setMemStatus(NOT_IN_MEMORY); + e->swap_status = SWAPOUT_DONE; + e->swap_filen = file_number; + e->swap_dirn = index; + e->swap_file_sz = swap_file_sz; + e->lock_count = 0; + e->lastref = lastref; + e->timestamp = timestamp; + e->expires = expires; + e->lastmod = lastmod; + e->refcount = refcount; + e->flags = newFlags; + EBIT_SET(e->flags, ENTRY_CACHABLE); + EBIT_CLR(e->flags, RELEASE_REQUEST); + EBIT_CLR(e->flags, KEY_PRIVATE); + e->ping_status = PING_NONE; + EBIT_CLR(e->flags, ENTRY_VALIDATED); + mapBitSet(e->swap_filen); + cur_size += fs.blksize * sizeInBlocks(e->swap_file_sz); + ++n_disk_objects; + e->hashInsert(key); /* do it after we clear KEY_PRIVATE */ + replacementAdd (e); + return e; +} + +void +UFSSwapDir::undoAddDiskRestore(StoreEntry *e) +{ + debugs(47, 5, HERE << *e); + replacementRemove(e); // checks swap_dirn so do it before we invalidate it + // Do not unlink the file as it might be used by a subsequent entry. + mapBitReset(e->swap_filen); + e->swap_filen = -1; + e->swap_dirn = -1; + cur_size -= fs.blksize * sizeInBlocks(e->swap_file_sz); + --n_disk_objects; +} + +void +UFSSwapDir::rebuild() +{ + ++StoreController::store_dirs_rebuilding; + eventAdd("storeRebuild", RebuildState::RebuildStep, new RebuildState(this), 0.0, 1); +} + +void +UFSSwapDir::closeTmpSwapLog() +{ + char *swaplog_path = xstrdup(logFile(NULL)); + char *new_path = xstrdup(logFile(".new")); + int fd; + file_close(swaplog_fd); + + if (xrename(new_path, swaplog_path) < 0) { + debugs(50, DBG_IMPORTANT, HERE << "ERROR: " << swaplog_path << ": " << xstrerror()); + fatalf("Failed to rename log file %s to %s.new", swaplog_path, swaplog_path); + } + + fd = file_open(swaplog_path, O_WRONLY | O_CREAT | O_BINARY); + + if (fd < 0) { + debugs(50, DBG_IMPORTANT, HERE << "ERROR: " << swaplog_path << ": " << xstrerror()); + fatalf("Failed to open swap log %s", swaplog_path); + } + + safe_free(swaplog_path); + safe_free(new_path); + swaplog_fd = fd; + debugs(47, 3, HERE << "Cache Dir #" << index << " log opened on FD " << fd); +} + +FILE * +UFSSwapDir::openTmpSwapLog(int *clean_flag, int *zero_flag) +{ + char *swaplog_path = xstrdup(logFile(NULL)); + char *clean_path = xstrdup(logFile(".last-clean")); + char *new_path = xstrdup(logFile(".new")); + + struct stat log_sb; + + struct stat clean_sb; + FILE *fp; + int fd; + + if (::stat(swaplog_path, &log_sb) < 0) { + debugs(47, DBG_IMPORTANT, HERE << "Cache Dir #" << index << ": No log file"); + safe_free(swaplog_path); + safe_free(clean_path); + safe_free(new_path); + return NULL; + } + + *zero_flag = log_sb.st_size == 0 ? 1 : 0; + /* close the existing write-only FD */ + + if (swaplog_fd >= 0) + file_close(swaplog_fd); + + /* open a write-only FD for the new log */ + fd = file_open(new_path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY); + + if (fd < 0) { + debugs(50, DBG_IMPORTANT, "ERROR: while opening swap log" << new_path << ": " << xstrerror()); + fatal("UFSSwapDir::openTmpSwapLog: Failed to open swap log."); + } + + swaplog_fd = fd; + + { + const StoreSwapLogHeader header; + MemBuf buf; + buf.init(header.record_size, header.record_size); + buf.append(reinterpret_cast(&header), sizeof(header)); + // Pad to keep in sync with UFSSwapDir::writeCleanStart(). + memset(buf.space(), 0, header.gapSize()); + buf.appended(header.gapSize()); + file_write(swaplog_fd, -1, buf.content(), buf.contentSize(), + NULL, NULL, buf.freeFunc()); + } + + /* open a read-only stream of the old log */ + fp = fopen(swaplog_path, "rb"); + + if (fp == NULL) { + debugs(50, DBG_CRITICAL, "ERROR: while opening " << swaplog_path << ": " << xstrerror()); + fatal("Failed to open swap log for reading"); + } + + memset(&clean_sb, '\0', sizeof(struct stat)); + + if (::stat(clean_path, &clean_sb) < 0) + *clean_flag = 0; + else if (clean_sb.st_mtime < log_sb.st_mtime) + *clean_flag = 0; + else + *clean_flag = 1; + + safeunlink(clean_path, 1); + + safe_free(swaplog_path); + + safe_free(clean_path); + + safe_free(new_path); + + return fp; +} + +/* + * Begin the process to write clean cache state. For AUFS this means + * opening some log files and allocating write buffers. Return 0 if + * we succeed, and assign the 'func' and 'data' return pointers. + */ +int +UFSSwapDir::writeCleanStart() +{ + UFSCleanLog *state = new UFSCleanLog(this); + StoreSwapLogHeader header; +#if HAVE_FCHMOD + + struct stat sb; +#endif + + cleanLog = NULL; + state->newLog = xstrdup(logFile(".clean")); + state->fd = file_open(state->newLog, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY); + + if (state->fd < 0) { + xfree(state->newLog); + delete state; + return -1; + } + + state->cur = xstrdup(logFile(NULL)); + state->cln = xstrdup(logFile(".last-clean")); + state->outbuf = (char *)xcalloc(CLEAN_BUF_SZ, 1); + state->outbuf_offset = 0; + /*copy the header */ + memcpy(state->outbuf, &header, sizeof(StoreSwapLogHeader)); + // Leave a gap to keep in sync with UFSSwapDir::openTmpSwapLog(). + memset(state->outbuf + sizeof(StoreSwapLogHeader), 0, header.gapSize()); + state->outbuf_offset += header.record_size; + + state->walker = repl->WalkInit(repl); + ::unlink(state->cln); + debugs(47, 3, HERE << "opened " << state->newLog << ", FD " << state->fd); +#if HAVE_FCHMOD + + if (::stat(state->cur, &sb) == 0) + fchmod(state->fd, sb.st_mode); + +#endif + + + cleanLog = state; + return 0; +} + +void +UFSSwapDir::writeCleanDone() +{ + UFSCleanLog *state = (UFSCleanLog *)cleanLog; + int fd; + + if (NULL == state) + return; + + if (state->fd < 0) + return; + + state->walker->Done(state->walker); + + if (FD_WRITE_METHOD(state->fd, state->outbuf, state->outbuf_offset) < 0) { + debugs(50, DBG_CRITICAL, HERE << state->newLog << ": write: " << xstrerror()); + debugs(50, DBG_CRITICAL, HERE << "Current swap logfile not replaced."); + file_close(state->fd); + state->fd = -1; + ::unlink(state->newLog); + } + + safe_free(state->outbuf); + /* + * You can't rename open files on Microsoft "operating systems" + * so we have to close before renaming. + */ + closeLog(); + /* save the fd value for a later test */ + fd = state->fd; + /* rename */ + + if (state->fd >= 0) { +#if _SQUID_OS2_ || _SQUID_WINDOWS_ + file_close(state->fd); + state->fd = -1; +#endif + + xrename(state->newLog, state->cur); + } + + /* touch a timestamp file if we're not still validating */ + if (StoreController::store_dirs_rebuilding) + (void) 0; + else if (fd < 0) + (void) 0; + else + file_close(file_open(state->cln, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY)); + + /* close */ + safe_free(state->cur); + + safe_free(state->newLog); + + safe_free(state->cln); + + if (state->fd >= 0) + file_close(state->fd); + + state->fd = -1; + + delete state; + + cleanLog = NULL; +} + +void +UFSSwapDir::CleanEvent(void *unused) +{ + static int swap_index = 0; + int i; + int j = 0; + int n = 0; + /* + * Assert that there are UFS cache_dirs configured, otherwise + * we should never be called. + */ + assert(NumberOfUFSDirs); + + if (NULL == UFSDirToGlobalDirMapping) { + SwapDir *sd; + /* + * Initialize the little array that translates UFS cache_dir + * number into the Config.cacheSwap.swapDirs array index. + */ + UFSDirToGlobalDirMapping = (int *)xcalloc(NumberOfUFSDirs, sizeof(*UFSDirToGlobalDirMapping)); + + for (i = 0, n = 0; i < Config.cacheSwap.n_configured; ++i) { + /* This is bogus, the controller should just clean each instance once */ + sd = dynamic_cast (INDEXSD(i)); + + if (!UFSSwapDir::IsUFSDir(sd)) + continue; + + UFSSwapDir *usd = dynamic_cast(sd); + + assert (usd); + + UFSDirToGlobalDirMapping[n] = i; + ++n; + + j += (usd->l1 * usd->l2); + } + + assert(n == NumberOfUFSDirs); + /* + * Start the commonUfsDirClean() swap_index with a random + * value. j equals the total number of UFS level 2 + * swap directories + */ + swap_index = (int) (squid_random() % j); + } + + /* if the rebuild is finished, start cleaning directories. */ + if (0 == StoreController::store_dirs_rebuilding) { + n = DirClean(swap_index); + ++swap_index; + } + + eventAdd("storeDirClean", CleanEvent, NULL, + 15.0 * exp(-0.25 * n), 1); +} + +bool +UFSSwapDir::IsUFSDir(SwapDir * sd) +{ + UFSSwapDir *mySD = dynamic_cast(sd); + return (mySD != 0) ; +} + +/* + * XXX: this is broken - it assumes all cache dirs use the same + * l1 and l2 scheme. -RBC 20021215. Partial fix is in place - + * if not UFSSwapDir return 0; + */ +bool +UFSSwapDir::FilenoBelongsHere(int fn, int F0, int F1, int F2) +{ + int D1, D2; + int L1, L2; + int filn = fn; + assert(F0 < Config.cacheSwap.n_configured); + assert (UFSSwapDir::IsUFSDir (dynamic_cast(INDEXSD(F0)))); + UFSSwapDir *sd = dynamic_cast(INDEXSD(F0)); + + if (!sd) + return 0; + + L1 = sd->l1; + + L2 = sd->l2; + + D1 = ((filn / L2) / L2) % L1; + + if (F1 != D1) + return 0; + + D2 = (filn / L2) % L2; + + if (F2 != D2) + return 0; + + return 1; +} + +int +UFSSwapDir::validFileno(sfileno filn, int flag) const +{ + if (filn < 0) + return 0; + + /* + * If flag is set it means out-of-range file number should + * be considered invalid. + */ + if (flag) + if (filn > map->capacity()) + return 0; + + return 1; +} + +void +UFSSwapDir::unlinkFile(sfileno f) +{ + debugs(79, 3, HERE << "unlinking fileno " << std::setfill('0') << + std::hex << std::uppercase << std::setw(8) << f << " '" << + fullPath(f,NULL) << "'"); + /* commonUfsDirMapBitReset(this, f); */ + IO->unlinkFile(fullPath(f,NULL)); +} + +bool +UFSSwapDir::unlinkdUseful() const +{ + // unlinkd may be useful only in workers + return IamWorkerProcess() && IO->io->unlinkdUseful(); +} + +void +UFSSwapDir::unlink(StoreEntry & e) +{ + debugs(79, 3, HERE << "dirno " << index << ", fileno "<< + std::setfill('0') << std::hex << std::uppercase << std::setw(8) << e.swap_filen); + if (e.swap_status == SWAPOUT_DONE) { + cur_size -= fs.blksize * sizeInBlocks(e.swap_file_sz); + --n_disk_objects; + } + replacementRemove(&e); + mapBitReset(e.swap_filen); + UFSSwapDir::unlinkFile(e.swap_filen); +} + +void +UFSSwapDir::replacementAdd(StoreEntry * e) +{ + debugs(47, 4, HERE << "added node " << e << " to dir " << index); + repl->Add(repl, e, &e->repl); +} + + +void +UFSSwapDir::replacementRemove(StoreEntry * e) +{ + StorePointer SD; + + if (e->swap_dirn < 0) + return; + + SD = INDEXSD(e->swap_dirn); + + assert (dynamic_cast(SD.getRaw()) == this); + + debugs(47, 4, HERE << "remove node " << e << " from dir " << index); + + repl->Remove(repl, e, &e->repl); +} + +void +UFSSwapDir::dump(StoreEntry & entry) const +{ + storeAppendPrintf(&entry, " %" PRIu64 " %d %d", maxSize() >> 20, l1, l2); + dumpOptions(&entry); +} + +char * +UFSSwapDir::fullPath(sfileno filn, char *fullpath) const +{ + LOCAL_ARRAY(char, fullfilename, MAXPATHLEN); + int L1 = l1; + int L2 = l2; + + if (!fullpath) + fullpath = fullfilename; + + fullpath[0] = '\0'; + + snprintf(fullpath, MAXPATHLEN, "%s/%02X/%02X/%08X", + path, + ((filn / L2) / L2) % L1, + (filn / L2) % L2, + filn); + + return fullpath; +} + +int +UFSSwapDir::callback() +{ + return IO->callback(); +} + +void +UFSSwapDir::sync() +{ + IO->sync(); +} + +void +UFSSwapDir::swappedOut(const StoreEntry &e) +{ + cur_size += fs.blksize * sizeInBlocks(e.swap_file_sz); + ++n_disk_objects; +} + +StoreSearch * +UFSSwapDir::search(String const url, HttpRequest *request) +{ + if (url.size()) + fatal ("Cannot search by url yet\n"); + + return new StoreSearchUFS (this); +} + +void +UFSSwapDir::logEntry(const StoreEntry & e, int op) const +{ + StoreSwapLogData *s = new StoreSwapLogData; + s->op = (char) op; + s->swap_filen = e.swap_filen; + s->timestamp = e.timestamp; + s->lastref = e.lastref; + s->expires = e.expires; + s->lastmod = e.lastmod; + s->swap_file_sz = e.swap_file_sz; + s->refcount = e.refcount; + s->flags = e.flags; + memcpy(s->key, e.key, SQUID_MD5_DIGEST_LENGTH); + s->finalize(); + file_write(swaplog_fd, + -1, + s, + sizeof(StoreSwapLogData), + NULL, + NULL, + FreeObject); +} + +int +UFSSwapDir::DirClean(int swap_index) +{ + DIR *dir_pointer = NULL; + + LOCAL_ARRAY(char, p1, MAXPATHLEN + 1); + LOCAL_ARRAY(char, p2, MAXPATHLEN + 1); + + int files[20]; + int swapfileno; + int fn; /* same as swapfileno, but with dirn bits set */ + int n = 0; + int k = 0; + int N0, N1, N2; + int D0, D1, D2; + UFSSwapDir *SD; + N0 = NumberOfUFSDirs; + D0 = UFSDirToGlobalDirMapping[swap_index % N0]; + SD = dynamic_cast(INDEXSD(D0)); + assert (SD); + N1 = SD->l1; + D1 = (swap_index / N0) % N1; + N2 = SD->l2; + D2 = ((swap_index / N0) / N1) % N2; + snprintf(p1, MAXPATHLEN, "%s/%02X/%02X", + SD->path, D1, D2); + debugs(36, 3, HERE << "Cleaning directory " << p1); + dir_pointer = opendir(p1); + + if (dir_pointer == NULL) { + if (errno == ENOENT) { + debugs(36, DBG_CRITICAL, HERE << "WARNING: Creating " << p1); +#if _SQUID_MSWIN_ + + if (mkdir(p1) == 0) +#else + + if (mkdir(p1, 0777) == 0) +#endif + + return 0; + } + + debugs(50, DBG_CRITICAL, HERE << p1 << ": " << xstrerror()); + safeunlink(p1, 1); + return 0; + } + + dirent_t *de; + while ((de = readdir(dir_pointer)) != NULL && k < 20) { + if (sscanf(de->d_name, "%X", &swapfileno) != 1) + continue; + + fn = swapfileno; /* XXX should remove this cruft ! */ + + if (SD->validFileno(fn, 1)) + if (SD->mapBitTest(fn)) + if (UFSSwapDir::FilenoBelongsHere(fn, D0, D1, D2)) + continue; + + files[k] = swapfileno; + ++k; + } + + closedir(dir_pointer); + + if (k == 0) + return 0; + + qsort(files, k, sizeof(int), rev_int_sort); + + if (k > 10) + k = 10; + + for (n = 0; n < k; ++n) { + debugs(36, 3, HERE << "Cleaning file "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << files[n]); + snprintf(p2, MAXPATHLEN + 1, "%s/%08X", p1, files[n]); + safeunlink(p2, 0); + ++statCounter.swap.files_cleaned; + } + + debugs(36, 3, HERE << "Cleaned " << k << " unused files from " << p1); + return k; +} === added file 'src/fs/ufs/UFSSwapDir.h' --- src/fs/ufs/UFSSwapDir.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSSwapDir.h 2012-08-03 15:41:59 +0000 @@ -0,0 +1,185 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#ifndef SQUID_FS_UFS_UFSSWAPDIR_H +#define SQUID_FS_UFS_UFSSWAPDIR_H + +#include "SquidString.h" +#include "Store.h" +#include "StoreIOState.h" +#include "StoreSearch.h" +#include "SwapDir.h" +#include "swap_log_op.h" +#include "UFSStrategy.h" + +class HttpRequest; +class ConfigOptionVector; +class FileMap; +class DiskIOModule; + +/// \ingroup UFS +class UFSSwapDir : public SwapDir +{ +public: + static bool IsUFSDir(SwapDir* sd); + static int DirClean(int swap_index); + /** check whether swapfile belongs to the specified cachedir/l1dir/l2dir + * + * \param cachedir the number of the cachedir which is being tested + * \param level1dir level-1 dir in the cachedir + * \param level2dir level-2 dir + */ + static bool FilenoBelongsHere(int fn, int cachedir, int level1dir, int level2dir); + + UFSSwapDir(char const *aType, const char *aModuleType); + /** Initial setup / end destruction */ + virtual void init(); + /** Create a new SwapDir (-z command-line option) */ + virtual void create(); + virtual void dump(StoreEntry &) const; + ~UFSSwapDir(); + virtual StoreSearch *search(String const url, HttpRequest *); + /** double-check swap during rebuild (-S command-line option) + * + * called by storeCleanup if needed + */ + virtual bool doubleCheck(StoreEntry &); + virtual bool unlinkdUseful() const; + /** unlink a file, and remove its entry from the filemap */ + virtual void unlink(StoreEntry &); + virtual void statfs(StoreEntry &)const; + virtual void maintain(); + /** check whether this filesystem can store the given object + * + * UFS filesystems will happily store anything as long as + * the LRU time isn't too small + */ + virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const; + /** reference an object + * + * This routine is called whenever an object is referenced, so we can + * maintain replacement information within the storage fs. + */ + virtual void reference(StoreEntry &); + /** de-reference an object + * + * This routine is called whenever the last reference to an object is + * removed, to maintain replacement information within the storage fs. + */ + virtual bool dereference(StoreEntry &); + virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); + virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); + virtual void openLog(); + virtual void closeLog(); + virtual int writeCleanStart(); + virtual void writeCleanDone(); + virtual void logEntry(const StoreEntry & e, int op) const; + virtual void parse(int index, char *path); ///parse configuration and setup new SwapDir + virtual void reconfigure(); ///reconfigure the SwapDir + virtual int callback(); + virtual void sync(); + virtual void swappedOut(const StoreEntry &e); + virtual uint64_t currentSize() const { return cur_size; } + virtual uint64_t currentCount() const { return n_disk_objects; } + + void unlinkFile(sfileno f); + // move down when unlink is a virtual method + //protected: + UFSStrategy *IO; + char *fullPath(sfileno, char *) const; + /* temp */ + void closeTmpSwapLog(); + FILE *openTmpSwapLog(int *clean_flag, int *zero_flag); + char *swapSubDir(int subdirn) const; + int mapBitTest(sfileno filn); + void mapBitReset(sfileno filn); + void mapBitSet(sfileno filn); + /** Add a new object to the cache with empty memory copy and pointer to disk + * + * This method is used to rebuild a store from disk + */ + StoreEntry *addDiskRestore(const cache_key * key, + sfileno file_number, + uint64_t swap_file_sz, + time_t expires, + time_t timestamp, + time_t lastref, + time_t lastmod, + uint32_t refcount, + uint16_t flags, + int clean); + /// Undo the effects of UFSSwapDir::addDiskRestore(). + void undoAddDiskRestore(StoreEntry *e); + int validFileno(sfileno filn, int flag) const; + int mapBitAllocate(); + virtual ConfigOption *getOptionTree() const; + + void *fsdata; + + bool validL2(int) const; + bool validL1(int) const; + + /** Add and remove the given StoreEntry from the replacement policy in use */ + void replacementAdd(StoreEntry *e); + void replacementRemove(StoreEntry *e); + +protected: + FileMap *map; + int suggest; + int l1; + int l2; + +private: + void parseSizeL1L2(); + static int NumberOfUFSDirs; + static int * UFSDirToGlobalDirMapping; + bool pathIsDirectory(const char *path)const; + int swaplog_fd; + static EVH CleanEvent; + /** Verify that the the CacheDir exists + * + * If this returns < 0, then Squid exits, complains about swap + * directories not existing, and instructs the admin to run 'squid -z' + * Called by UFSSwapDir::init + */ + bool verifyCacheDirs(); + void rebuild(); + int createDirectory(const char *path, int); + void createSwapSubDirs(); + void dumpEntry(StoreEntry &) const; + char *logFile(char const *ext = NULL)const; + void changeIO(DiskIOModule *); + bool optionIOParse(char const *option, const char *value, int reconfiguring); + void optionIODump(StoreEntry * e) const; + mutable ConfigOptionVector *currentIOOptions; + char const *ioType; + uint64_t cur_size; ///< currently used space in the storage area + uint64_t n_disk_objects; ///< total number of objects stored +}; + +#endif /* SQUID_FS_UFS_UFSSWAPDIR_H */ === added file 'src/fs/ufs/UFSSwapLogParser.cc' --- src/fs/ufs/UFSSwapLogParser.cc 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSSwapLogParser.cc 2012-08-02 21:40:53 +0000 @@ -0,0 +1,199 @@ +/* + * UFSSwapLogParser.cc + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "md5.h" +#include "StoreSwapLogData.h" +#include "swap_log_op.h" +#include "UFSSwapLogParser.h" + +/// Parse a swap header entry created on a system with 32-bit size_t and sfileno +/// this is typical of 32-bit systems without large file support +/// NP: SQUID_MD5_DIGEST_LENGTH is very risky still. +class UFSSwapLogParser_v1_32bs:public UFSSwapLogParser +{ +public: + /// version 1 cache swap.state entry with 32-bit size_t (swap_file_sz) + /// time_t an sfileno have no variation from the v1 baseline format + struct StoreSwapLogDataOld { + char op; + sfileno swap_filen; + time_t timestamp; + time_t lastref; + time_t expires; + time_t lastmod; + uint32_t swap_file_sz; + uint16_t refcount; + uint16_t flags; + unsigned char key[SQUID_MD5_DIGEST_LENGTH]; + }; + UFSSwapLogParser_v1_32bs(FILE *fp):UFSSwapLogParser(fp) { + record_size = sizeof(UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld); + } + /// Convert the on-disk 32-bit format to our current format while reading + bool ReadRecord(StoreSwapLogData &swapData) { + UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld readData; + int bytes = sizeof(UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld); + + assert(log); + + if (fread(&readData, bytes, 1, log) != 1) { + return false; + } + swapData.op = readData.op; + swapData.swap_filen = readData.swap_filen; + swapData.timestamp = readData.timestamp; + swapData.lastref = readData.lastref; + swapData.expires = readData.expires; + swapData.lastmod = readData.lastmod; + swapData.swap_file_sz = readData.swap_file_sz; + swapData.refcount = readData.refcount; + swapData.flags = readData.flags; + memcpy(swapData.key, readData.key, SQUID_MD5_DIGEST_LENGTH); + return true; + } +}; + +/// swap.state v2 log parser +class UFSSwapLogParser_v2: public UFSSwapLogParser +{ +public: + UFSSwapLogParser_v2(FILE *fp): UFSSwapLogParser(fp) { + record_size = sizeof(StoreSwapLogData); + } + bool ReadRecord(StoreSwapLogData &swapData) { + assert(log); + return fread(&swapData, sizeof(StoreSwapLogData), 1, log) == 1; + } +}; + +UFSSwapLogParser *UFSSwapLogParser::GetUFSSwapLogParser(FILE *fp) +{ + StoreSwapLogHeader header; + + assert(fp); + + if (fread(&header, sizeof(StoreSwapLogHeader), 1, fp) != 1) + return NULL; + + if (header.op != SWAP_LOG_VERSION) { + debugs(47, DBG_IMPORTANT, "Old swap file detected..."); + fseek(fp, 0, SEEK_SET); + return new UFSSwapLogParser_v1_32bs(fp); // Um. 32-bits except time_t, and can't determine that. + } + + debugs(47, 2, "Swap file version: " << header.version); + + if (header.version == 1) { + if (fseek(fp, header.record_size, SEEK_SET) != 0) + return NULL; + + debugs(47, DBG_IMPORTANT, "Rejecting swap file v1 to avoid cache " << + "index corruption. Forcing a full cache index rebuild. " << + "See Squid bug #3441."); + return NULL; + +#if UNUSED_CODE + // baseline + // 32-bit sfileno + // native time_t (hopefully 64-bit) + // 64-bit file size + if (header.record_size == sizeof(StoreSwapLogData)) { + debugs(47, DBG_IMPORTANT, "Version 1 of swap file with LFS support detected... "); + return new UFSSwapLogParser_v1(fp); + } + + // which means we have a 3-way grid of permutations to import (yuck!) + // 1) sfileno 32-bit / 64-bit (64-bit was broken) + // 2) time_t 32-bit / 64-bit + // 3) size_t 32-bit / 64-bit (32-bit was pre-LFS) + + // 32-bit systems... + // only LFS (size_t) differs from baseline + if (header.record_size == sizeof(struct UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld)) { + debugs(47, DBG_IMPORTANT, "Version 1 (32-bit) swap file without LFS support detected... "); + return new UFSSwapLogParser_v1_32bs(fp); + } + // LFS (size_t) and timestamps (time_t) differs from baseline + if (header.record_size == sizeof(struct UFSSwapLogParser_v1_32bst::StoreSwapLogDataOld)) { + debugs(47, DBG_IMPORTANT, "Version 1 (32-bit) swap file with short timestamps and without LFS support detected... "); + return new UFSSwapLogParser_v1_32bst(fp); + } + // No downgrade for 64-bit timestamps to 32-bit. + + // 64-bit systems + // sfileno was 64-bit for a some builds + if (header.record_size == sizeof(struct UFSSwapLogParser_v1_64bfn::StoreSwapLogDataOld)) { + debugs(47, DBG_IMPORTANT, "Version 1 (64-bit) swap file with broken sfileno detected... "); + return new UFSSwapLogParser_v1_64bfn(fp); + } + // NP: 64-bit system with 32-bit size_t/time_t are not handled. + + debugs(47, DBG_IMPORTANT, "WARNING: The swap file has wrong format!... "); + debugs(47, DBG_IMPORTANT, "NOTE: Cannot safely downgrade caches to short (32-bit) timestamps."); + return NULL; +#endif + } + + if (header.version >= 2) { + if (!header.sane()) { + debugs(47, DBG_IMPORTANT, "ERROR: Corrupted v" << header.version << + " swap file header."); + return NULL; + } + + if (fseek(fp, header.record_size, SEEK_SET) != 0) + return NULL; + + if (header.version == 2) + return new UFSSwapLogParser_v2(fp); + } + + // TODO: v3: write to disk in network-order bytes for the larger fields? + + debugs(47, DBG_IMPORTANT, "Unknown swap file version: " << header.version); + return NULL; +} + +int UFSSwapLogParser::SwapLogEntries() +{ + struct stat sb; + + if (log_entries >= 0) + return log_entries; + + if (log && record_size && 0 == fstat(fileno(log), &sb)) { + log_entries = sb.st_size/record_size; + return log_entries; + } + + return 0; +} === added file 'src/fs/ufs/UFSSwapLogParser.h' --- src/fs/ufs/UFSSwapLogParser.h 1970-01-01 00:00:00 +0000 +++ src/fs/ufs/UFSSwapLogParser.h 2012-08-02 21:40:53 +0000 @@ -0,0 +1,63 @@ +/* + * UFSSwapLogParser.h + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_FS_UFS_UFSSWAPLOGPARSER_H +#define SQUID_FS_UFS_UFSSWAPLOGPARSER_H + +#include + +class StoreSwapLogData; + +/// \ingroup UFS +class UFSSwapLogParser +{ +public: + FILE *log; + int log_entries; + int record_size; + + UFSSwapLogParser(FILE *fp):log(fp),log_entries(-1), record_size(0) { + } + virtual ~UFSSwapLogParser() {}; + + static UFSSwapLogParser *GetUFSSwapLogParser(FILE *fp); + + virtual bool ReadRecord(StoreSwapLogData &swapData) = 0; + int SwapLogEntries(); + void Close() { + if (log) { + fclose(log); + log = NULL; + } + } +}; + +#endif /* SQUID_FS_UFS_UFSSWAPLOGPARSER_H */ === removed file 'src/fs/ufs/store_dir_ufs.cc' --- src/fs/ufs/store_dir_ufs.cc 2012-07-23 15:34:12 +0000 +++ src/fs/ufs/store_dir_ufs.cc 1970-01-01 00:00:00 +0000 @@ -1,1471 +0,0 @@ - -/* - * $Id$ - * - * DEBUG: section 47 Store Directory Routines - * AUTHOR: Duane Wessels - * - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - */ - -#include "squid-old.h" -#include "Store.h" -#include "fde.h" -#include "ufscommon.h" -#include "StoreSwapLogData.h" -#include "ConfigOption.h" -#include "DiskIO/DiskIOStrategy.h" -#include "DiskIO/DiskIOModule.h" -#include "FileMap.h" -#include "Parsing.h" -#include "SquidMath.h" -#include "SquidTime.h" -#include "StatCounters.h" -#include "SwapDir.h" -#include "swap_log_op.h" - -int UFSSwapDir::NumberOfUFSDirs = 0; -int *UFSSwapDir::UFSDirToGlobalDirMapping = NULL; - -/* - * storeUfsDirCheckObj - * - * This routine is called by storeDirSelectSwapDir to see if the given - * object is able to be stored on this filesystem. UFS filesystems will - * happily store anything as long as the LRU time isn't too small. - */ -bool -UFSSwapDir::canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const -{ - if (!SwapDir::canStore(e, diskSpaceNeeded, load)) - return false; - - if (IO->shedLoad()) - return false; - - load = IO->load(); - return true; -} - - -/* ========== LOCAL FUNCTIONS ABOVE, GLOBAL FUNCTIONS BELOW ========== */ - -void -UFSSwapDir::parseSizeL1L2() -{ - int i = GetInteger(); - if (i <= 0) - fatal("UFSSwapDir::parseSizeL1L2: invalid size value"); - - const uint64_t size = static_cast(i) << 20; // MBytes to Bytes - - /* just reconfigure it */ - if (reconfiguring) { - if (size == maxSize()) - debugs(3, 2, "Cache dir '" << path << "' size remains unchanged at " << i << " MB"); - else - debugs(3, 1, "Cache dir '" << path << "' size changed to " << i << " MB"); - } - - max_size = size; - - l1 = GetInteger(); - - if (l1 <= 0) - fatal("UFSSwapDir::parseSizeL1L2: invalid level 1 directories value"); - - l2 = GetInteger(); - - if (l2 <= 0) - fatal("UFSSwapDir::parseSizeL1L2: invalid level 2 directories value"); -} - -/* - * storeUfsDirReconfigure - * - * This routine is called when the given swapdir needs reconfiguring - */ - -void -UFSSwapDir::reconfigure() -{ - parseSizeL1L2(); - parseOptions(1); -} - -/* - * storeUfsDirParse - * - * Called when a *new* fs is being setup. - */ -void -UFSSwapDir::parse (int anIndex, char *aPath) -{ - index = anIndex; - path = xstrdup(aPath); - - parseSizeL1L2(); - - /* Initialise replacement policy stuff */ - repl = createRemovalPolicy(Config.replPolicy); - - parseOptions(0); -} - -void -UFSSwapDir::changeIO(DiskIOModule *module) -{ - DiskIOStrategy *anIO = module->createStrategy(); - safe_free(ioType); - ioType = xstrdup(module->type()); - - delete IO->io; - IO->io = anIO; - /* Change the IO Options */ - - if (currentIOOptions && currentIOOptions->options.size() > 2) - delete currentIOOptions->options.pop_back(); - - /* TODO: factor out these 4 lines */ - ConfigOption *ioOptions = IO->io->getOptionTree(); - - if (ioOptions) - currentIOOptions->options.push_back(ioOptions); -} - -bool -UFSSwapDir::optionIOParse(char const *option, const char *value, int isaReconfig) -{ - if (strcmp(option, "IOEngine") != 0) - return false; - - if (isaReconfig) - /* silently ignore this */ - return true; - - if (!value) - self_destruct(); - - DiskIOModule *module = DiskIOModule::Find(value); - - if (!module) - self_destruct(); - - changeIO(module); - - return true; -} - -void -UFSSwapDir::optionIODump(StoreEntry * e) const -{ - storeAppendPrintf(e, " IOEngine=%s", ioType); -} - -ConfigOption * -UFSSwapDir::getOptionTree() const -{ - ConfigOption *parentResult = SwapDir::getOptionTree(); - - if (currentIOOptions == NULL) - currentIOOptions = new ConfigOptionVector(); - - currentIOOptions->options.push_back(parentResult); - - currentIOOptions->options.push_back(new ConfigOptionAdapter(*const_cast(this), &UFSSwapDir::optionIOParse, &UFSSwapDir::optionIODump)); - - if (ConfigOption *ioOptions = IO->io->getOptionTree()) - currentIOOptions->options.push_back(ioOptions); - - ConfigOption* result = currentIOOptions; - - currentIOOptions = NULL; - - return result; -} - -/* - * Initial setup / end destruction - */ -void -UFSSwapDir::init() -{ - debugs(47, 3, "Initialising UFS SwapDir engine."); - /* Parsing must be finished by now - force to NULL, don't delete */ - currentIOOptions = NULL; - static int started_clean_event = 0; - static const char *errmsg = - "\tFailed to verify one of the swap directories, Check cache.log\n" - "\tfor details. Run 'squid -z' to create swap directories\n" - "\tif needed, or if running Squid for the first time."; - IO->init(); - - if (verifyCacheDirs()) - fatal(errmsg); - - openLog(); - - rebuild(); - - if (!started_clean_event) { - eventAdd("UFS storeDirClean", CleanEvent, NULL, 15.0, 1); - started_clean_event = 1; - } - - (void) storeDirGetBlkSize(path, &fs.blksize); -} - -void -UFSSwapDir::create() -{ - debugs(47, 3, "Creating swap space in " << path); - createDirectory(path, 0); - createSwapSubDirs(); -} - -UFSSwapDir::UFSSwapDir(char const *aType, const char *anIOType) : SwapDir(aType), IO(NULL), map(new FileMap()), suggest(0), swaplog_fd (-1), currentIOOptions(new ConfigOptionVector()), ioType(xstrdup(anIOType)), cur_size(0), n_disk_objects(0) -{ - /* modulename is only set to disk modules that are built, by configure, - * so the Find call should never return NULL here. - */ - IO = new UFSStrategy(DiskIOModule::Find(anIOType)->createStrategy()); -} - -UFSSwapDir::~UFSSwapDir() -{ - if (swaplog_fd > -1) { - file_close(swaplog_fd); - swaplog_fd = -1; - } - - delete map; - - if (IO) - delete IO; - - IO = NULL; - - safe_free(ioType); -} - -void -UFSSwapDir::dumpEntry(StoreEntry &e) const -{ - debugs(47, 0, "UFSSwapDir::dumpEntry: FILENO "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << e.swap_filen); - debugs(47, 0, "UFSSwapDir::dumpEntry: PATH " << fullPath(e.swap_filen, NULL) ); - e.dump(0); -} - -/* - * UFSSwapDir::doubleCheck - * - * This is called by storeCleanup() if -S was given on the command line. - */ -bool -UFSSwapDir::doubleCheck(StoreEntry & e) -{ - - struct stat sb; - - if (::stat(fullPath(e.swap_filen, NULL), &sb) < 0) { - debugs(47, 0, "UFSSwapDir::doubleCheck: MISSING SWAP FILE"); - dumpEntry(e); - return true; - } - - if ((off_t)e.swap_file_sz != sb.st_size) { - debugs(47, 0, "UFSSwapDir::doubleCheck: SIZE MISMATCH"); - debugs(47, 0, "UFSSwapDir::doubleCheck: ENTRY SIZE: " << e.swap_file_sz << ", FILE SIZE: " << sb.st_size); - dumpEntry(e); - return true; - } - - return false; -} - -void -UFSSwapDir::statfs(StoreEntry & sentry) const -{ - int totl_kb = 0; - int free_kb = 0; - int totl_in = 0; - int free_in = 0; - int x; - storeAppendPrintf(&sentry, "First level subdirectories: %d\n", l1); - storeAppendPrintf(&sentry, "Second level subdirectories: %d\n", l2); - storeAppendPrintf(&sentry, "Maximum Size: %" PRIu64 " KB\n", maxSize() >> 10); - storeAppendPrintf(&sentry, "Current Size: %.2f KB\n", currentSize() / 1024.0); - storeAppendPrintf(&sentry, "Percent Used: %0.2f%%\n", - Math::doublePercent(currentSize(), maxSize())); - storeAppendPrintf(&sentry, "Filemap bits in use: %d of %d (%d%%)\n", - map->numFilesInMap(), map->capacity(), - Math::intPercent(map->numFilesInMap(), map->capacity())); - x = storeDirGetUFSStats(path, &totl_kb, &free_kb, &totl_in, &free_in); - - if (0 == x) { - storeAppendPrintf(&sentry, "Filesystem Space in use: %d/%d KB (%d%%)\n", - totl_kb - free_kb, - totl_kb, - Math::intPercent(totl_kb - free_kb, totl_kb)); - storeAppendPrintf(&sentry, "Filesystem Inodes in use: %d/%d (%d%%)\n", - totl_in - free_in, - totl_in, - Math::intPercent(totl_in - free_in, totl_in)); - } - - storeAppendPrintf(&sentry, "Flags:"); - - if (flags.selected) - storeAppendPrintf(&sentry, " SELECTED"); - - if (flags.read_only) - storeAppendPrintf(&sentry, " READ-ONLY"); - - storeAppendPrintf(&sentry, "\n"); - - IO->statfs(sentry); -} - -void -UFSSwapDir::maintain() -{ - /* We can't delete objects while rebuilding swap */ - - /* XXX FIXME each store should start maintaining as it comes online. */ - - if (StoreController::store_dirs_rebuilding) - return; - - StoreEntry *e = NULL; - - int removed = 0; - - RemovalPurgeWalker *walker; - - double f = (double) (currentSize() - minSize()) / (maxSize() - minSize()); - - f = f < 0.0 ? 0.0 : f > 1.0 ? 1.0 : f; - - int max_scan = (int) (f * 400.0 + 100.0); - - int max_remove = (int) (f * 70.0 + 10.0); - - /* - * This is kinda cheap, but so we need this priority hack? - */ - - debugs(47, 3, "storeMaintainSwapSpace: f=" << f << ", max_scan=" << max_scan << ", max_remove=" << max_remove ); - - walker = repl->PurgeInit(repl, max_scan); - - while (1) { - if (currentSize() < minSize()) - break; - - if (removed >= max_remove) - break; - - e = walker->Next(walker); - - if (!e) - break; /* no more objects */ - - ++removed; - - e->release(); - } - - walker->Done(walker); - debugs(47, (removed ? 2 : 3), "UFSSwapDir::maintain: " << path << - " removed " << removed << "/" << max_remove << " f=" << - std::setprecision(4) << f << " max_scan=" << max_scan); -} - -/* - * UFSSwapDir::reference - * - * This routine is called whenever an object is referenced, so we can - * maintain replacement information within the storage fs. - */ -void -UFSSwapDir::reference(StoreEntry &e) -{ - debugs(47, 3, "UFSSwapDir::reference: referencing " << &e << " " << e.swap_dirn << "/" << e.swap_filen); - - if (repl->Referenced) - repl->Referenced(repl, &e, &e.repl); -} - -/* - * UFSSwapDir::dereference - * This routine is called whenever the last reference to an object is - * removed, to maintain replacement information within the storage fs. - */ -bool -UFSSwapDir::dereference(StoreEntry & e) -{ - debugs(47, 3, "UFSSwapDir::dereference: referencing " << &e << " " << e.swap_dirn << "/" << e.swap_filen); - - if (repl->Dereferenced) - repl->Dereferenced(repl, &e, &e.repl); - - return true; // keep e in the global store_table -} - -StoreIOState::Pointer -UFSSwapDir::createStoreIO(StoreEntry &e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * aCallback, void *callback_data) -{ - return IO->create (this, &e, file_callback, aCallback, callback_data); -} - -StoreIOState::Pointer -UFSSwapDir::openStoreIO(StoreEntry &e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * aCallback, void *callback_data) -{ - return IO->open (this, &e, file_callback, aCallback, callback_data); -} - -int -UFSSwapDir::mapBitTest(sfileno filn) -{ - return map->testBit(filn); -} - -void -UFSSwapDir::mapBitSet(sfileno filn) -{ - map->setBit(filn); -} - -void -UFSSwapDir::mapBitReset(sfileno filn) -{ - /* - * We have to test the bit before calling clearBit as - * it doesn't do bounds checking and blindly assumes - * filn is a valid file number, but it might not be because - * the map is dynamic in size. Also clearing an already clear - * bit puts the map counter of-of-whack. - */ - - if (map->testBit(filn)) - map->clearBit(filn); -} - -int -UFSSwapDir::mapBitAllocate() -{ - int fn; - fn = map->allocate(suggest); - map->setBit(fn); - suggest = fn + 1; - return fn; -} - -char * -UFSSwapDir::swapSubDir(int subdirn)const -{ - LOCAL_ARRAY(char, fullfilename, MAXPATHLEN); - assert(0 <= subdirn && subdirn < l1); - snprintf(fullfilename, MAXPATHLEN, "%s/%02X", path, subdirn); - return fullfilename; -} - -int -UFSSwapDir::createDirectory(const char *aPath, int should_exist) -{ - int created = 0; - - struct stat st; - getCurrentTime(); - - if (0 == ::stat(aPath, &st)) { - if (S_ISDIR(st.st_mode)) { - debugs(47, (should_exist ? 3 : 1), aPath << " exists"); - } else { - fatalf("Swap directory %s is not a directory.", aPath); - } - -#if _SQUID_MSWIN_ - - } else if (0 == mkdir(aPath)) { -#else - - } else if (0 == mkdir(aPath, 0755)) { -#endif - debugs(47, (should_exist ? 1 : 3), aPath << " created"); - created = 1; - } else { - fatalf("Failed to make swap directory %s: %s", - aPath, xstrerror()); - } - - return created; -} - -bool -UFSSwapDir::pathIsDirectory(const char *aPath)const -{ - - struct stat sb; - - if (::stat(aPath, &sb) < 0) { - debugs(47, 0, "" << aPath << ": " << xstrerror()); - return false; - } - - if (S_ISDIR(sb.st_mode) == 0) { - debugs(47, 0, "" << aPath << " is not a directory"); - return false; - } - - return true; -} - -/* - * This function is called by commonUfsDirInit(). If this returns < 0, - * then Squid exits, complains about swap directories not - * existing, and instructs the admin to run 'squid -z' - */ -bool -UFSSwapDir::verifyCacheDirs() -{ - if (!pathIsDirectory(path)) - return true; - - for (int j = 0; j < l1; ++j) { - char const *aPath = swapSubDir(j); - - if (!pathIsDirectory(aPath)) - return true; - } - - return false; -} - -void -UFSSwapDir::createSwapSubDirs() -{ - LOCAL_ARRAY(char, name, MAXPATHLEN); - - for (int i = 0; i < l1; ++i) { - snprintf(name, MAXPATHLEN, "%s/%02X", path, i); - - int should_exist; - - if (createDirectory(name, 0)) - should_exist = 0; - else - should_exist = 1; - - debugs(47, 1, "Making directories in " << name); - - for (int k = 0; k < l2; ++k) { - snprintf(name, MAXPATHLEN, "%s/%02X/%02X", path, i, k); - createDirectory(name, should_exist); - } - } -} - -char * -UFSSwapDir::logFile(char const *ext) const -{ - LOCAL_ARRAY(char, lpath, MAXPATHLEN); - LOCAL_ARRAY(char, pathtmp, MAXPATHLEN); - LOCAL_ARRAY(char, digit, 32); - char *pathtmp2; - - if (Config.Log.swap) { - xstrncpy(pathtmp, path, MAXPATHLEN - 64); - pathtmp2 = pathtmp; - - while ((pathtmp2 = strchr(pathtmp2, '/')) != NULL) - *pathtmp2 = '.'; - - while (strlen(pathtmp) && pathtmp[strlen(pathtmp) - 1] == '.') - pathtmp[strlen(pathtmp) - 1] = '\0'; - - for (pathtmp2 = pathtmp; *pathtmp2 == '.'; ++pathtmp2); - snprintf(lpath, MAXPATHLEN - 64, Config.Log.swap, pathtmp2); - - if (strncmp(lpath, Config.Log.swap, MAXPATHLEN - 64) == 0) { - strcat(lpath, "."); - snprintf(digit, 32, "%02d", index); - strncat(lpath, digit, 3); - } - } else { - xstrncpy(lpath, path, MAXPATHLEN - 64); - strcat(lpath, "/swap.state"); - } - - if (ext) - strncat(lpath, ext, 16); - - return lpath; -} - -void -UFSSwapDir::openLog() -{ - char *logPath; - logPath = logFile(); - swaplog_fd = file_open(logPath, O_WRONLY | O_CREAT | O_BINARY); - - if (swaplog_fd < 0) { - debugs(50, 1, "" << logPath << ": " << xstrerror()); - fatal("commonUfsDirOpenSwapLog: Failed to open swap log."); - } - - debugs(50, 3, "Cache Dir #" << index << " log opened on FD " << swaplog_fd); - - if (0 == NumberOfUFSDirs) - assert(NULL == UFSDirToGlobalDirMapping); - - ++NumberOfUFSDirs; - - assert(NumberOfUFSDirs <= Config.cacheSwap.n_configured); -} - -void -UFSSwapDir::closeLog() -{ - if (swaplog_fd < 0) /* not open */ - return; - - file_close(swaplog_fd); - - debugs(47, 3, "Cache Dir #" << index << " log closed on FD " << swaplog_fd); - - swaplog_fd = -1; - - --NumberOfUFSDirs; - - assert(NumberOfUFSDirs >= 0); - - if (0 == NumberOfUFSDirs) - safe_free(UFSDirToGlobalDirMapping); -} - -bool -UFSSwapDir::validL1(int anInt) const -{ - return anInt < l1; -} - -bool -UFSSwapDir::validL2(int anInt) const -{ - return anInt < l2; -} - -/* Add a new object to the cache with empty memory copy and pointer to disk - * use to rebuild store from disk. */ -StoreEntry * -UFSSwapDir::addDiskRestore(const cache_key * key, - sfileno file_number, - uint64_t swap_file_sz, - time_t expires, - time_t timestamp, - time_t lastref, - time_t lastmod, - uint32_t refcount, - uint16_t newFlags, - int clean) -{ - StoreEntry *e = NULL; - debugs(47, 5, "commonUfsAddDiskRestore: " << storeKeyText(key) << - ", fileno="<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << file_number); - /* if you call this you'd better be sure file_number is not - * already in use! */ - e = new StoreEntry(); - e->store_status = STORE_OK; - e->setMemStatus(NOT_IN_MEMORY); - e->swap_status = SWAPOUT_DONE; - e->swap_filen = file_number; - e->swap_dirn = index; - e->swap_file_sz = swap_file_sz; - e->lock_count = 0; - e->lastref = lastref; - e->timestamp = timestamp; - e->expires = expires; - e->lastmod = lastmod; - e->refcount = refcount; - e->flags = newFlags; - EBIT_SET(e->flags, ENTRY_CACHABLE); - EBIT_CLR(e->flags, RELEASE_REQUEST); - EBIT_CLR(e->flags, KEY_PRIVATE); - e->ping_status = PING_NONE; - EBIT_CLR(e->flags, ENTRY_VALIDATED); - mapBitSet(e->swap_filen); - cur_size += fs.blksize * sizeInBlocks(e->swap_file_sz); - ++n_disk_objects; - e->hashInsert(key); /* do it after we clear KEY_PRIVATE */ - replacementAdd (e); - return e; -} - -void -UFSSwapDir::undoAddDiskRestore(StoreEntry *e) -{ - debugs(47, 5, HERE << *e); - replacementRemove(e); // checks swap_dirn so do it before we invalidate it - // Do not unlink the file as it might be used by a subsequent entry. - mapBitReset(e->swap_filen); - e->swap_filen = -1; - e->swap_dirn = -1; - cur_size -= fs.blksize * sizeInBlocks(e->swap_file_sz); - --n_disk_objects; -} - -void -UFSSwapDir::rebuild() -{ - ++StoreController::store_dirs_rebuilding; - eventAdd("storeRebuild", RebuildState::RebuildStep, new RebuildState(this), 0.0, 1); -} - -void -UFSSwapDir::closeTmpSwapLog() -{ - char *swaplog_path = xstrdup(logFile(NULL)); - char *new_path = xstrdup(logFile(".new")); - int fd; - file_close(swaplog_fd); - - if (xrename(new_path, swaplog_path) < 0) { - debugs(50, DBG_IMPORTANT, "ERROR: " << swaplog_path << ": " << xstrerror()); - fatalf("Failed to rename log file %s to %s.new", swaplog_path, swaplog_path); - } - - fd = file_open(swaplog_path, O_WRONLY | O_CREAT | O_BINARY); - - if (fd < 0) { - debugs(50, DBG_IMPORTANT, "ERROR: " << swaplog_path << ": " << xstrerror()); - fatalf("Failed to open swap log %s", swaplog_path); - } - - safe_free(swaplog_path); - safe_free(new_path); - swaplog_fd = fd; - debugs(47, 3, "Cache Dir #" << index << " log opened on FD " << fd); -} - -FILE * -UFSSwapDir::openTmpSwapLog(int *clean_flag, int *zero_flag) -{ - char *swaplog_path = xstrdup(logFile(NULL)); - char *clean_path = xstrdup(logFile(".last-clean")); - char *new_path = xstrdup(logFile(".new")); - - struct stat log_sb; - - struct stat clean_sb; - FILE *fp; - int fd; - - if (::stat(swaplog_path, &log_sb) < 0) { - debugs(47, 1, "Cache Dir #" << index << ": No log file"); - safe_free(swaplog_path); - safe_free(clean_path); - safe_free(new_path); - return NULL; - } - - *zero_flag = log_sb.st_size == 0 ? 1 : 0; - /* close the existing write-only FD */ - - if (swaplog_fd >= 0) - file_close(swaplog_fd); - - /* open a write-only FD for the new log */ - fd = file_open(new_path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY); - - if (fd < 0) { - debugs(50, 1, "" << new_path << ": " << xstrerror()); - fatal("storeDirOpenTmpSwapLog: Failed to open swap log."); - } - - swaplog_fd = fd; - - { - const StoreSwapLogHeader header; - MemBuf buf; - buf.init(header.record_size, header.record_size); - buf.append(reinterpret_cast(&header), sizeof(header)); - // Pad to keep in sync with UFSSwapDir::writeCleanStart(). - memset(buf.space(), 0, header.gapSize()); - buf.appended(header.gapSize()); - file_write(swaplog_fd, -1, buf.content(), buf.contentSize(), - NULL, NULL, buf.freeFunc()); - } - - /* open a read-only stream of the old log */ - fp = fopen(swaplog_path, "rb"); - - if (fp == NULL) { - debugs(50, 0, "" << swaplog_path << ": " << xstrerror()); - fatal("Failed to open swap log for reading"); - } - - memset(&clean_sb, '\0', sizeof(struct stat)); - - if (::stat(clean_path, &clean_sb) < 0) - *clean_flag = 0; - else if (clean_sb.st_mtime < log_sb.st_mtime) - *clean_flag = 0; - else - *clean_flag = 1; - - safeunlink(clean_path, 1); - - safe_free(swaplog_path); - - safe_free(clean_path); - - safe_free(new_path); - - return fp; -} - -class UFSCleanLog : public SwapDir::CleanLog -{ - -public: - UFSCleanLog(SwapDir *); - virtual const StoreEntry *nextEntry(); - virtual void write(StoreEntry const &); - char *cur; - char *newLog; - char *cln; - char *outbuf; - off_t outbuf_offset; - int fd; - RemovalPolicyWalker *walker; - SwapDir *sd; -}; - -#define CLEAN_BUF_SZ 16384 - - -UFSCleanLog::UFSCleanLog(SwapDir *aSwapDir) : cur(NULL),newLog(NULL),cln(NULL),outbuf(NULL), - outbuf_offset(0), fd(-1),walker(NULL), sd(aSwapDir) -{} - -/* - * Begin the process to write clean cache state. For AUFS this means - * opening some log files and allocating write buffers. Return 0 if - * we succeed, and assign the 'func' and 'data' return pointers. - */ -int -UFSSwapDir::writeCleanStart() -{ - UFSCleanLog *state = new UFSCleanLog(this); - StoreSwapLogHeader header; -#if HAVE_FCHMOD - - struct stat sb; -#endif - - cleanLog = NULL; - state->newLog = xstrdup(logFile(".clean")); - state->fd = file_open(state->newLog, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY); - - if (state->fd < 0) { - xfree(state->newLog); - delete state; - return -1; - } - - state->cur = xstrdup(logFile(NULL)); - state->cln = xstrdup(logFile(".last-clean")); - state->outbuf = (char *)xcalloc(CLEAN_BUF_SZ, 1); - state->outbuf_offset = 0; - /*copy the header */ - memcpy(state->outbuf, &header, sizeof(StoreSwapLogHeader)); - // Leave a gap to keep in sync with UFSSwapDir::openTmpSwapLog(). - memset(state->outbuf + sizeof(StoreSwapLogHeader), 0, header.gapSize()); - state->outbuf_offset += header.record_size; - - state->walker = repl->WalkInit(repl); - ::unlink(state->cln); - debugs(47, 3, "storeDirWriteCleanLogs: opened " << state->newLog << ", FD " << state->fd); -#if HAVE_FCHMOD - - if (::stat(state->cur, &sb) == 0) - fchmod(state->fd, sb.st_mode); - -#endif - - - cleanLog = state; - return 0; -} - -/* - * Get the next entry that is a candidate for clean log writing - */ -const StoreEntry * -UFSCleanLog::nextEntry() -{ - const StoreEntry *entry = NULL; - - if (walker) - entry = walker->Next(walker); - - return entry; -} - -/* - * "write" an entry to the clean log file. - */ -void -UFSCleanLog::write(StoreEntry const &e) -{ - StoreSwapLogData s; - static size_t ss = sizeof(StoreSwapLogData); - s.op = (char) SWAP_LOG_ADD; - s.swap_filen = e.swap_filen; - s.timestamp = e.timestamp; - s.lastref = e.lastref; - s.expires = e.expires; - s.lastmod = e.lastmod; - s.swap_file_sz = e.swap_file_sz; - s.refcount = e.refcount; - s.flags = e.flags; - memcpy(&s.key, e.key, SQUID_MD5_DIGEST_LENGTH); - s.finalize(); - memcpy(outbuf + outbuf_offset, &s, ss); - outbuf_offset += ss; - /* buffered write */ - - if (outbuf_offset + ss >= CLEAN_BUF_SZ) { - if (FD_WRITE_METHOD(fd, outbuf, outbuf_offset) < 0) { - /* XXX This error handling should probably move up to the caller */ - debugs(50, 0, "storeDirWriteCleanLogs: " << newLog << ": write: " << xstrerror()); - debugs(50, 0, "storeDirWriteCleanLogs: Current swap logfile not replaced."); - file_close(fd); - fd = -1; - unlink(newLog); - sd->cleanLog = NULL; - delete this; - return; - } - - outbuf_offset = 0; - } -} - -void -UFSSwapDir::writeCleanDone() -{ - UFSCleanLog *state = (UFSCleanLog *)cleanLog; - int fd; - - if (NULL == state) - return; - - if (state->fd < 0) - return; - - state->walker->Done(state->walker); - - if (FD_WRITE_METHOD(state->fd, state->outbuf, state->outbuf_offset) < 0) { - debugs(50, 0, "storeDirWriteCleanLogs: " << state->newLog << ": write: " << xstrerror()); - debugs(50, 0, "storeDirWriteCleanLogs: Current swap logfile not replaced."); - file_close(state->fd); - state->fd = -1; - ::unlink(state->newLog); - } - - safe_free(state->outbuf); - /* - * You can't rename open files on Microsoft "operating systems" - * so we have to close before renaming. - */ - closeLog(); - /* save the fd value for a later test */ - fd = state->fd; - /* rename */ - - if (state->fd >= 0) { -#if _SQUID_OS2_ || _SQUID_WINDOWS_ - file_close(state->fd); - state->fd = -1; -#endif - - xrename(state->newLog, state->cur); - } - - /* touch a timestamp file if we're not still validating */ - if (StoreController::store_dirs_rebuilding) - (void) 0; - else if (fd < 0) - (void) 0; - else - file_close(file_open(state->cln, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY)); - - /* close */ - safe_free(state->cur); - - safe_free(state->newLog); - - safe_free(state->cln); - - if (state->fd >= 0) - file_close(state->fd); - - state->fd = -1; - - delete state; - - cleanLog = NULL; -} - -static void -FreeObject(void *address) -{ - StoreSwapLogData *anObject = static_cast (address); - delete anObject; -} - -void -UFSSwapDir::logEntry(const StoreEntry & e, int op) const -{ - StoreSwapLogData *s = new StoreSwapLogData; - s->op = (char) op; - s->swap_filen = e.swap_filen; - s->timestamp = e.timestamp; - s->lastref = e.lastref; - s->expires = e.expires; - s->lastmod = e.lastmod; - s->swap_file_sz = e.swap_file_sz; - s->refcount = e.refcount; - s->flags = e.flags; - memcpy(s->key, e.key, SQUID_MD5_DIGEST_LENGTH); - s->finalize(); - file_write(swaplog_fd, - -1, - s, - sizeof(StoreSwapLogData), - NULL, - NULL, - FreeObject); -} - -static QS rev_int_sort; -static int -rev_int_sort(const void *A, const void *B) -{ - const int *i1 = (const int *)A; - const int *i2 = (const int *)B; - return *i2 - *i1; -} - -int -UFSSwapDir::DirClean(int swap_index) -{ - DIR *dir_pointer = NULL; - - LOCAL_ARRAY(char, p1, MAXPATHLEN + 1); - LOCAL_ARRAY(char, p2, MAXPATHLEN + 1); - - int files[20]; - int swapfileno; - int fn; /* same as swapfileno, but with dirn bits set */ - int n = 0; - int k = 0; - int N0, N1, N2; - int D0, D1, D2; - UFSSwapDir *SD; - N0 = NumberOfUFSDirs; - D0 = UFSDirToGlobalDirMapping[swap_index % N0]; - SD = dynamic_cast(INDEXSD(D0)); - assert (SD); - N1 = SD->l1; - D1 = (swap_index / N0) % N1; - N2 = SD->l2; - D2 = ((swap_index / N0) / N1) % N2; - snprintf(p1, MAXPATHLEN, "%s/%02X/%02X", - SD->path, D1, D2); - debugs(36, 3, "storeDirClean: Cleaning directory " << p1); - dir_pointer = opendir(p1); - - if (dir_pointer == NULL) { - if (errno == ENOENT) { - debugs(36, 0, "storeDirClean: WARNING: Creating " << p1); -#if _SQUID_MSWIN_ - - if (mkdir(p1) == 0) -#else - - if (mkdir(p1, 0777) == 0) -#endif - - return 0; - } - - debugs(50, 0, "storeDirClean: " << p1 << ": " << xstrerror()); - safeunlink(p1, 1); - return 0; - } - - dirent_t *de; - while ((de = readdir(dir_pointer)) != NULL && k < 20) { - if (sscanf(de->d_name, "%X", &swapfileno) != 1) - continue; - - fn = swapfileno; /* XXX should remove this cruft ! */ - - if (SD->validFileno(fn, 1)) - if (SD->mapBitTest(fn)) - if (UFSSwapDir::FilenoBelongsHere(fn, D0, D1, D2)) - continue; - - files[k] = swapfileno; - ++k; - } - - closedir(dir_pointer); - - if (k == 0) - return 0; - - qsort(files, k, sizeof(int), rev_int_sort); - - if (k > 10) - k = 10; - - for (n = 0; n < k; ++n) { - debugs(36, 3, "storeDirClean: Cleaning file "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << files[n]); - snprintf(p2, MAXPATHLEN + 1, "%s/%08X", p1, files[n]); - safeunlink(p2, 0); - ++statCounter.swap.files_cleaned; - } - - debugs(36, 3, "Cleaned " << k << " unused files from " << p1); - return k; -} - -void -UFSSwapDir::CleanEvent(void *unused) -{ - static int swap_index = 0; - int i; - int j = 0; - int n = 0; - /* - * Assert that there are UFS cache_dirs configured, otherwise - * we should never be called. - */ - assert(NumberOfUFSDirs); - - if (NULL == UFSDirToGlobalDirMapping) { - SwapDir *sd; - /* - * Initialize the little array that translates UFS cache_dir - * number into the Config.cacheSwap.swapDirs array index. - */ - UFSDirToGlobalDirMapping = (int *)xcalloc(NumberOfUFSDirs, sizeof(*UFSDirToGlobalDirMapping)); - - for (i = 0, n = 0; i < Config.cacheSwap.n_configured; ++i) { - /* This is bogus, the controller should just clean each instance once */ - sd = dynamic_cast (INDEXSD(i)); - - if (!UFSSwapDir::IsUFSDir(sd)) - continue; - - UFSSwapDir *usd = dynamic_cast(sd); - - assert (usd); - - UFSDirToGlobalDirMapping[n] = i; - ++n; - - j += (usd->l1 * usd->l2); - } - - assert(n == NumberOfUFSDirs); - /* - * Start the commonUfsDirClean() swap_index with a random - * value. j equals the total number of UFS level 2 - * swap directories - */ - swap_index = (int) (squid_random() % j); - } - - /* if the rebuild is finished, start cleaning directories. */ - if (0 == StoreController::store_dirs_rebuilding) { - n = DirClean(swap_index); - ++swap_index; - } - - eventAdd("storeDirClean", CleanEvent, NULL, - 15.0 * exp(-0.25 * n), 1); -} - -int -UFSSwapDir::IsUFSDir(SwapDir * sd) -{ - UFSSwapDir *mySD = dynamic_cast(sd); - return mySD ? 1 : 0 ; -} - -/* - * Does swapfile number 'fn' belong in cachedir #F0, - * level1 dir #F1, level2 dir #F2? - * XXX: this is broken - it assumes all cache dirs use the same - * l1 and l2 scheme. -RBC 20021215. Partial fix is in place - - * if not UFSSwapDir return 0; - */ -int -UFSSwapDir::FilenoBelongsHere(int fn, int F0, int F1, int F2) -{ - int D1, D2; - int L1, L2; - int filn = fn; - assert(F0 < Config.cacheSwap.n_configured); - assert (UFSSwapDir::IsUFSDir (dynamic_cast(INDEXSD(F0)))); - UFSSwapDir *sd = dynamic_cast(INDEXSD(F0)); - - if (!sd) - return 0; - - L1 = sd->l1; - - L2 = sd->l2; - - D1 = ((filn / L2) / L2) % L1; - - if (F1 != D1) - return 0; - - D2 = (filn / L2) % L2; - - if (F2 != D2) - return 0; - - return 1; -} - - -int -UFSSwapDir::validFileno(sfileno filn, int flag) const -{ - if (filn < 0) - return 0; - - /* - * If flag is set it means out-of-range file number should - * be considered invalid. - */ - if (flag) - if (filn > map->capacity()) - return 0; - - return 1; -} - - - -/* - * UFSSwapDir::unlinkFile - * - * This routine unlinks a file and pulls it out of the bitmap. - * It used to be in commonUfsUnlink(), however an interface change - * forced this bit of code here. Eeek. - */ -void -UFSSwapDir::unlinkFile(sfileno f) -{ - debugs(79, 3, "UFSSwapDir::unlinkFile: unlinking fileno " << std::setfill('0') << - std::hex << std::uppercase << std::setw(8) << f << " '" << - fullPath(f,NULL) << "'"); - /* commonUfsDirMapBitReset(this, f); */ - IO->unlinkFile(fullPath(f,NULL)); -} - -bool -UFSSwapDir::unlinkdUseful() const -{ - // unlinkd may be useful only in workers - return IamWorkerProcess() && IO->io->unlinkdUseful(); -} - -void -UFSSwapDir::unlink(StoreEntry & e) -{ - debugs(79, 3, "storeUfsUnlink: dirno " << index << ", fileno "<< - std::setfill('0') << std::hex << std::uppercase << std::setw(8) << e.swap_filen); - if (e.swap_status == SWAPOUT_DONE) { - cur_size -= fs.blksize * sizeInBlocks(e.swap_file_sz); - --n_disk_objects; - } - replacementRemove(&e); - mapBitReset(e.swap_filen); - UFSSwapDir::unlinkFile(e.swap_filen); -} - -/* - * Add and remove the given StoreEntry from the replacement policy in - * use. - */ - -void -UFSSwapDir::replacementAdd(StoreEntry * e) -{ - debugs(47, 4, "UFSSwapDir::replacementAdd: added node " << e << " to dir " << index); - repl->Add(repl, e, &e->repl); -} - - -void -UFSSwapDir::replacementRemove(StoreEntry * e) -{ - StorePointer SD; - - if (e->swap_dirn < 0) - return; - - SD = INDEXSD(e->swap_dirn); - - assert (dynamic_cast(SD.getRaw()) == this); - - debugs(47, 4, "UFSSwapDir::replacementRemove: remove node " << e << " from dir " << index); - - repl->Remove(repl, e, &e->repl); -} - -void -UFSSwapDir::dump(StoreEntry & entry) const -{ - storeAppendPrintf(&entry, " %" PRIu64 " %d %d", maxSize() >> 20, l1, l2); - dumpOptions(&entry); -} - -char * -UFSSwapDir::fullPath(sfileno filn, char *fullpath) const -{ - LOCAL_ARRAY(char, fullfilename, MAXPATHLEN); - int L1 = l1; - int L2 = l2; - - if (!fullpath) - fullpath = fullfilename; - - fullpath[0] = '\0'; - - snprintf(fullpath, MAXPATHLEN, "%s/%02X/%02X/%08X", - path, - ((filn / L2) / L2) % L1, - (filn / L2) % L2, - filn); - - return fullpath; -} - -int -UFSSwapDir::callback() -{ - return IO->callback(); -} - -void -UFSSwapDir::sync() -{ - IO->sync(); -} - -void -UFSSwapDir::swappedOut(const StoreEntry &e) -{ - cur_size += fs.blksize * sizeInBlocks(e.swap_file_sz); - ++n_disk_objects; -} - -StoreSearch * -UFSSwapDir::search(String const url, HttpRequest *request) -{ - if (url.size()) - fatal ("Cannot search by url yet\n"); - - return new StoreSearchUFS (this); -} - -CBDATA_CLASS_INIT(StoreSearchUFS); -StoreSearchUFS::StoreSearchUFS(RefCount aSwapDir) : sd(aSwapDir), walker (sd->repl->WalkInit(sd->repl)), current (NULL), _done (false) -{} - -/* do not link -StoreSearchUFS::StoreSearchUFS(StoreSearchUFS const &); -*/ - -StoreSearchUFS::~StoreSearchUFS() -{ - walker->Done(walker); - walker = NULL; -} - -void -StoreSearchUFS::next(void (aCallback)(void *cbdata), void *aCallbackArgs) -{ - next(); - aCallback(aCallbackArgs); -} - -bool -StoreSearchUFS::next() -{ - /* the walker API doesn't make sense. the store entries referred to are already readwrite - * from their hash table entries - */ - - if (walker) - current = const_cast(walker->Next(walker)); - - if (current == NULL) - _done = true; - - return current != NULL; -} - -bool -StoreSearchUFS::error() const -{ - return false; -} - -bool -StoreSearchUFS::isDone() const -{ - return _done; -} - -StoreEntry * -StoreSearchUFS::currentItem() -{ - return current; -} === modified file 'src/fs/ufs/store_io_ufs.cc' --- src/fs/ufs/store_io_ufs.cc 2012-01-20 18:55:04 +0000 +++ src/fs/ufs/store_io_ufs.cc 2012-08-02 21:18:43 +0000 @@ -35,7 +35,6 @@ #include "squid-old.h" #include "Store.h" -#include "ufscommon.h" #include "Generic.h" #include "DiskIO/DiskFile.h" #include "DiskIO/DiskIOStrategy.h" @@ -43,45 +42,9 @@ #include "DiskIO/WriteRequest.h" #include "SwapDir.h" - -bool -UFSStrategy::shedLoad() -{ - return io->shedLoad(); -} - -int -UFSStrategy::load() -{ - return io->load(); -} - -UFSStrategy::UFSStrategy (DiskIOStrategy *anIO) : io(anIO) -{} - -UFSStrategy::~UFSStrategy () -{ - delete io; -} - -StoreIOState::Pointer -UFSStrategy::createState(SwapDir *SD, StoreEntry *e, StoreIOState::STIOCB * aCallback, void *callback_data) const -{ - return new UFSStoreState (SD, e, aCallback, callback_data); -} - -DiskFile::Pointer -UFSStrategy::newFile (char const *path) -{ - return io->newFile(path); -} - - -void -UFSStrategy::unlinkFile(char const *path) -{ - io->unlinkFile(path); -} +#include "UFSStrategy.h" +#include "UFSStoreState.h" + CBDATA_CLASS_INIT(UFSStoreState); @@ -140,7 +103,7 @@ UFSStoreState::openDone() { if (closing) - debugs(0,0,HERE << "already closing in openDone()!?"); + debugs(0, DBG_CRITICAL, HERE << "already closing in openDone()!?"); if (theFile->error()) { tryClosing(); @@ -238,8 +201,8 @@ std::setfill('0') << std::hex << std::uppercase << std::setw(8) << swap_filen); if (theFile->error()) { - debugs(79,1,HERE << "avoid write on theFile with error"); - debugs(79,1,HERE << "calling free_func for " << (void*) buf); + debugs(79, DBG_IMPORTANT,HERE << "avoid write on theFile with error"); + debugs(79, DBG_IMPORTANT,HERE << "calling free_func for " << (void*) buf); free_func((void*)buf); return; } @@ -270,7 +233,7 @@ } if (theFile->error()) { - debugs(79,1,HERE << "avoid write on theFile with error"); + debugs(79, DBG_IMPORTANT,HERE << "avoid write on theFile with error"); debugs(79,3,HERE << "calling free_func for " << (void*) q->buf); /* * DPW 2006-05-24 @@ -554,109 +517,3 @@ linklistPush(&pending_writes, q); } -StoreIOState::Pointer -UFSStrategy::open(SwapDir * SD, StoreEntry * e, StoreIOState::STFNCB * file_callback, - StoreIOState::STIOCB * aCallback, void *callback_data) -{ - assert (((UFSSwapDir *)SD)->IO == this); - debugs(79, 3, "UFSStrategy::open: fileno "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << e->swap_filen); - - /* to consider: make createstate a private UFSStrategy call */ - StoreIOState::Pointer sio = createState (SD, e, aCallback, callback_data); - - sio->mode |= O_RDONLY; - - UFSStoreState *state = dynamic_cast (sio.getRaw()); - - assert (state); - - char *path = ((UFSSwapDir *)SD)->fullPath(e->swap_filen, NULL); - - DiskFile::Pointer myFile = newFile (path); - - if (myFile.getRaw() == NULL) - return NULL; - - state->theFile = myFile; - - state->opening = true; - - myFile->open (sio->mode, 0644, state); - - if (myFile->error()) - return NULL; - - return sio; -} - -StoreIOState::Pointer -UFSStrategy::create(SwapDir * SD, StoreEntry * e, StoreIOState::STFNCB * file_callback, - StoreIOState::STIOCB * aCallback, void *callback_data) -{ - assert (((UFSSwapDir *)SD)->IO == this); - /* Allocate a number */ - sfileno filn = ((UFSSwapDir *)SD)->mapBitAllocate(); - debugs(79, 3, "UFSStrategy::create: fileno "<< std::setfill('0') << std::hex << std::uppercase << std::setw(8) << filn); - - /* Shouldn't we handle a 'bitmap full' error here? */ - - StoreIOState::Pointer sio = createState (SD, e, aCallback, callback_data); - - sio->mode |= O_WRONLY | O_CREAT | O_TRUNC; - - sio->swap_filen = filn; - - UFSStoreState *state = dynamic_cast (sio.getRaw()); - - assert (state); - - char *path = ((UFSSwapDir *)SD)->fullPath(filn, NULL); - - DiskFile::Pointer myFile = newFile (path); - - if (myFile.getRaw() == NULL) { - ((UFSSwapDir *)SD)->mapBitReset (filn); - return NULL; - } - - state->theFile = myFile; - - state->creating = true; - - myFile->create (state->mode, 0644, state); - - if (myFile->error()) { - ((UFSSwapDir *)SD)->mapBitReset (filn); - return NULL; - } - - /* now insert into the replacement policy */ - ((UFSSwapDir *)SD)->replacementAdd(e); - - return sio; -} - -int -UFSStrategy::callback() -{ - return io->callback(); -} - -void -UFSStrategy::init() -{ - io->init(); -} - -void -UFSStrategy::sync() -{ - io->sync(); -} - -void -UFSStrategy::statfs(StoreEntry & sentry)const -{ - io->statfs(sentry); -} - === removed file 'src/fs/ufs/ufscommon.cc' --- src/fs/ufs/ufscommon.cc 2012-07-23 07:02:06 +0000 +++ src/fs/ufs/ufscommon.cc 1970-01-01 00:00:00 +0000 @@ -1,841 +0,0 @@ -/* - * $Id$ - * - * DEBUG: section 47 Store Directory Routines - * AUTHOR: Robert Collins - * - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - * Copyright (c) 2003, Robert Collins - */ - -#include "squid.h" -#include "ufscommon.h" -#include "Store.h" -#include "fde.h" -#include "SquidTime.h" -#include "StoreMeta.h" -#include "Generic.h" -#include "StoreMetaUnpacker.h" -#include "RefCount.h" -#include "StoreSwapLogData.h" -#include "swap_log_op.h" - - -CBDATA_CLASS_INIT(RebuildState); - -/// Parse a swap header entry created on a system with 32-bit size_t and sfileno -/// this is typical of 32-bit systems without large file support -/// NP: SQUID_MD5_DIGEST_LENGTH is very risky still. -class UFSSwapLogParser_v1_32bs:public UFSSwapLogParser -{ -public: - /// version 1 cache swap.state entry with 32-bit size_t (swap_file_sz) - /// time_t an sfileno have no variation from the v1 baseline format - struct StoreSwapLogDataOld { - char op; - sfileno swap_filen; - time_t timestamp; - time_t lastref; - time_t expires; - time_t lastmod; - uint32_t swap_file_sz; - uint16_t refcount; - uint16_t flags; - unsigned char key[SQUID_MD5_DIGEST_LENGTH]; - }; - UFSSwapLogParser_v1_32bs(FILE *fp):UFSSwapLogParser(fp) { - record_size = sizeof(UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld); - } - /// Convert the on-disk 32-bit format to our current format while reading - bool ReadRecord(StoreSwapLogData &swapData) { - UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld readData; - int bytes = sizeof(UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld); - - assert(log); - - if (fread(&readData, bytes, 1, log) != 1) { - return false; - } - swapData.op = readData.op; - swapData.swap_filen = readData.swap_filen; - swapData.timestamp = readData.timestamp; - swapData.lastref = readData.lastref; - swapData.expires = readData.expires; - swapData.lastmod = readData.lastmod; - swapData.swap_file_sz = readData.swap_file_sz; - swapData.refcount = readData.refcount; - swapData.flags = readData.flags; - memcpy(swapData.key, readData.key, SQUID_MD5_DIGEST_LENGTH); - return true; - } -}; - -#if UNUSED_CODE -/// Parse a swap header entry created on a system with 32-bit size_t, time_t and sfileno -/// this is typical of 32-bit systems without large file support and with old kernels -/// NP: SQUID_MD5_DIGEST_LENGTH is very risky still. -class UFSSwapLogParser_v1_32bst:public UFSSwapLogParser -{ -public: - /// version 1 cache swap.state entry with 32-bit size_t (swap_file_sz) - /// time_t also differs - /// sfileno has no variation from the v1 baseline format - struct StoreSwapLogDataOld { - char op; - sfileno swap_filen; - int32_t timestamp; - int32_t lastref; - int32_t expires; - int32_t lastmod; - uint32_t swap_file_sz; - uint16_t refcount; - uint16_t flags; - unsigned char key[SQUID_MD5_DIGEST_LENGTH]; - }; - UFSSwapLogParser_v1_32bst(FILE *fp):UFSSwapLogParser(fp) { - record_size = sizeof(UFSSwapLogParser_v1_32bst::StoreSwapLogDataOld); - } - /// Convert the on-disk 32-bit format to our current format while reading - bool ReadRecord(StoreSwapLogData &swapData) { - UFSSwapLogParser_v1_32bst::StoreSwapLogDataOld readData; - int bytes = sizeof(UFSSwapLogParser_v1_32bst::StoreSwapLogDataOld); - - assert(log); - - if (fread(&readData, bytes, 1, log) != 1) { - return false; - } - swapData.op = readData.op; - swapData.swap_filen = readData.swap_filen; - swapData.timestamp = readData.timestamp; - swapData.lastref = readData.lastref; - swapData.expires = readData.expires; - swapData.lastmod = readData.lastmod; - swapData.swap_file_sz = readData.swap_file_sz; - swapData.refcount = readData.refcount; - swapData.flags = readData.flags; - memcpy(swapData.key, readData.key, SQUID_MD5_DIGEST_LENGTH); - return true; - } -}; - -/// Parse a swap header entry created on a system with 64-bit size_t and sfileno -/// this is typical of 64-bit systems prior to this patch fixing sfileno to 32-bits -/// NP: SQUID_MD5_DIGEST_LENGTH is very risky still. -class UFSSwapLogParser_v1_64bfn:public UFSSwapLogParser -{ -public: - /// version 1 cache swap.state entry with 64-bit sfileno - struct StoreSwapLogDataOld { - char op; - int64_t swap_filen; - time_t timestamp; - time_t lastref; - time_t expires; - time_t lastmod; - uint64_t swap_file_sz; - uint16_t refcount; - uint16_t flags; - unsigned char key[SQUID_MD5_DIGEST_LENGTH]; - }; - UFSSwapLogParser_v1_64bfn(FILE *fp):UFSSwapLogParser(fp) { - record_size = sizeof(UFSSwapLogParser_v1_64bfn::StoreSwapLogDataOld); - } - /// Convert the on-disk 64-bit format to our current format while reading - bool ReadRecord(StoreSwapLogData &swapData) { - UFSSwapLogParser_v1_64bfn::StoreSwapLogDataOld readData; - int bytes = sizeof(UFSSwapLogParser_v1_64bfn::StoreSwapLogDataOld); - - assert(log); - - if (fread(&readData, bytes, 1, log) != 1) { - return false; - } - swapData.op = readData.op; - if ((readData.swap_filen>>32) != 0) { - fatalf("File ID on record is greater than maximum cache file ID."); - } - swapData.swap_filen = (int32_t)readData.swap_filen; - swapData.timestamp = readData.timestamp; - swapData.lastref = readData.lastref; - swapData.expires = readData.expires; - swapData.lastmod = readData.lastmod; - swapData.swap_file_sz = readData.swap_file_sz; - swapData.refcount = readData.refcount; - swapData.flags = readData.flags; - memcpy(swapData.key, readData.key, SQUID_MD5_DIGEST_LENGTH); - return true; - } -}; - -class UFSSwapLogParser_v1:public UFSSwapLogParser -{ -public: - UFSSwapLogParser_v1(FILE *fp):UFSSwapLogParser(fp) { - record_size = sizeof(StoreSwapLogData); - } - bool ReadRecord(StoreSwapLogData &swapData); -}; - - -bool UFSSwapLogParser_v1::ReadRecord(StoreSwapLogData &swapData) -{ - int bytes = sizeof(StoreSwapLogData); - - assert(log); - - if (fread(&swapData, bytes, 1, log) != 1) { - return false; - } - return true; -} -#endif /* UNUSED_CODE */ - -/// swap.state v2 log parser -class UFSSwapLogParser_v2: public UFSSwapLogParser -{ -public: - UFSSwapLogParser_v2(FILE *fp): UFSSwapLogParser(fp) { - record_size = sizeof(StoreSwapLogData); - } - bool ReadRecord(StoreSwapLogData &swapData) { - assert(log); - return fread(&swapData, sizeof(StoreSwapLogData), 1, log) == 1; - } -}; - - -UFSSwapLogParser *UFSSwapLogParser::GetUFSSwapLogParser(FILE *fp) -{ - StoreSwapLogHeader header; - - assert(fp); - - if (fread(&header, sizeof(StoreSwapLogHeader), 1, fp) != 1) - return NULL; - - if (header.op != SWAP_LOG_VERSION) { - debugs(47, 1, "Old swap file detected..."); - fseek(fp, 0, SEEK_SET); - return new UFSSwapLogParser_v1_32bs(fp); // Um. 32-bits except time_t, and can't determine that. - } - - debugs(47, 2, "Swap file version: " << header.version); - - if (header.version == 1) { - if (fseek(fp, header.record_size, SEEK_SET) != 0) - return NULL; - - debugs(47, DBG_IMPORTANT, "Rejecting swap file v1 to avoid cache " << - "index corruption. Forcing a full cache index rebuild. " << - "See Squid bug #3441."); - return NULL; - -#if UNUSED_CODE - // baseline - // 32-bit sfileno - // native time_t (hopefully 64-bit) - // 64-bit file size - if (header.record_size == sizeof(StoreSwapLogData)) { - debugs(47, 1, "Version 1 of swap file with LFS support detected... "); - return new UFSSwapLogParser_v1(fp); - } - - // which means we have a 3-way grid of permutations to import (yuck!) - // 1) sfileno 32-bit / 64-bit (64-bit was broken) - // 2) time_t 32-bit / 64-bit - // 3) size_t 32-bit / 64-bit (32-bit was pre-LFS) - - // 32-bit systems... - // only LFS (size_t) differs from baseline - if (header.record_size == sizeof(struct UFSSwapLogParser_v1_32bs::StoreSwapLogDataOld)) { - debugs(47, 1, "Version 1 (32-bit) swap file without LFS support detected... "); - return new UFSSwapLogParser_v1_32bs(fp); - } - // LFS (size_t) and timestamps (time_t) differs from baseline - if (header.record_size == sizeof(struct UFSSwapLogParser_v1_32bst::StoreSwapLogDataOld)) { - debugs(47, 1, "Version 1 (32-bit) swap file with short timestamps and without LFS support detected... "); - return new UFSSwapLogParser_v1_32bst(fp); - } - // No downgrade for 64-bit timestamps to 32-bit. - - // 64-bit systems - // sfileno was 64-bit for a some builds - if (header.record_size == sizeof(struct UFSSwapLogParser_v1_64bfn::StoreSwapLogDataOld)) { - debugs(47, 1, "Version 1 (64-bit) swap file with broken sfileno detected... "); - return new UFSSwapLogParser_v1_64bfn(fp); - } - // NP: 64-bit system with 32-bit size_t/time_t are not handled. - - debugs(47, 1, "WARNING: The swap file has wrong format!... "); - debugs(47, 1, "NOTE: Cannot safely downgrade caches to short (32-bit) timestamps."); - return NULL; -#endif - } - - if (header.version >= 2) { - if (!header.sane()) { - debugs(47, DBG_IMPORTANT, "ERROR: Corrupted v" << header.version << - " swap file header."); - return NULL; - } - - if (fseek(fp, header.record_size, SEEK_SET) != 0) - return NULL; - - if (header.version == 2) - return new UFSSwapLogParser_v2(fp); - } - - // TODO: v3: write to disk in network-order bytes for the larger fields? - - debugs(47, DBG_IMPORTANT, "Unknown swap file version: " << header.version); - return NULL; -} - -int UFSSwapLogParser::SwapLogEntries() -{ - struct stat sb; - - if (log_entries >= 0) - return log_entries; - - if (log && record_size && 0 == fstat(fileno(log), &sb)) { - log_entries = sb.st_size/record_size; - return log_entries; - } - - return 0; -} - - - - -RebuildState::RebuildState (RefCount aSwapDir) : sd (aSwapDir),LogParser(NULL), e(NULL), fromLog(true), _done (false) -{ - /* - * If the swap.state file exists in the cache_dir, then - * we'll use commonUfsDirRebuildFromSwapLog(), otherwise we'll - * use commonUfsDirRebuildFromDirectory() to open up each file - * and suck in the meta data. - */ - int clean = 0; - int zeroLengthLog = 0; - FILE *fp = sd->openTmpSwapLog(&clean, &zeroLengthLog); - - if (fp && !zeroLengthLog) - LogParser = UFSSwapLogParser::GetUFSSwapLogParser(fp); - - if (LogParser == NULL ) { - fromLog = false; - - if (fp != NULL) - fclose(fp); - - } else { - fromLog = true; - flags.clean = (unsigned int) clean; - } - - if (!clean) - flags.need_to_validate = 1; - - debugs(47, DBG_IMPORTANT, "Rebuilding storage in " << sd->path << " (" << - (clean ? "clean log" : (LogParser ? "dirty log" : "no log")) << ")"); -} - -RebuildState::~RebuildState() -{ - sd->closeTmpSwapLog(); - - if (LogParser) - delete LogParser; -} - -void -RebuildState::RebuildStep(void *data) -{ - RebuildState *rb = (RebuildState *)data; - rb->rebuildStep(); - - if (!rb->isDone()) - eventAdd("storeRebuild", RebuildStep, rb, 0.01, 1); - else { - -- StoreController::store_dirs_rebuilding; - storeRebuildComplete(&rb->counts); - delete rb; - } -} - -/// load entries from swap.state or files until we run out of entries or time -void -RebuildState::rebuildStep() -{ - currentEntry(NULL); - - // Balance our desire to maximize the number of entries processed at once - // (and, hence, minimize overheads and total rebuild time) with a - // requirement to also process Coordinator events, disk I/Os, etc. - const int maxSpentMsec = 50; // keep small: most RAM I/Os are under 1ms - const timeval loopStart = current_time; - - const int totalEntries = LogParser ? LogParser->SwapLogEntries() : -1; - - while (!isDone()) { - if (fromLog) - rebuildFromSwapLog(); - else - rebuildFromDirectory(); - - // TODO: teach storeRebuildProgress to handle totalEntries <= 0 - if (totalEntries > 0 && (n_read % 4000 == 0)) - storeRebuildProgress(sd->index, totalEntries, n_read); - - if (opt_foreground_rebuild) - continue; // skip "few entries at a time" check below - - getCurrentTime(); - const double elapsedMsec = tvSubMsec(loopStart, current_time); - if (elapsedMsec > maxSpentMsec || elapsedMsec < 0) { - debugs(47, 5, HERE << "pausing after " << n_read << " entries in " << - elapsedMsec << "ms; " << (elapsedMsec/n_read) << "ms per entry"); - break; - } - } -} - -/// process one cache file -void -RebuildState::rebuildFromDirectory() -{ - cache_key key[SQUID_MD5_DIGEST_LENGTH]; - - struct stat sb; - int fd = -1; - assert(this != NULL); - debugs(47, 3, "commonUfsDirRebuildFromDirectory: DIR #" << sd->index); - - assert(fd == -1); - sfileno filn = 0; - int size; - fd = getNextFile(&filn, &size); - - if (fd == -2) { - debugs(47, DBG_IMPORTANT, "Done scanning " << sd->path << " dir (" << - n_read << " entries)"); - _done = true; - return; - } else if (fd < 0) { - return; - } - - assert(fd > -1); - /* lets get file stats here */ - - ++n_read; - - if (fstat(fd, &sb) < 0) { - debugs(47, 1, "commonUfsDirRebuildFromDirectory: fstat(FD " << fd << "): " << xstrerror()); - file_close(fd); - --store_open_disk_fd; - fd = -1; - return; - } - - MemBuf buf; - buf.init(SM_PAGE_SIZE, SM_PAGE_SIZE); - if (!storeRebuildLoadEntry(fd, sd->index, buf, counts)) - return; - - StoreEntry tmpe; - const bool loaded = storeRebuildParseEntry(buf, tmpe, key, counts, - (int64_t)sb.st_size); - - file_close(fd); - --store_open_disk_fd; - fd = -1; - - if (!loaded) { - // XXX: shouldn't this be a call to commonUfsUnlink? - sd->unlinkFile(filn); // should we unlink in all failure cases? - return; - } - - if (!storeRebuildKeepEntry(tmpe, key, counts)) - return; - - ++counts.objcount; - // tmpe.dump(5); - currentEntry(sd->addDiskRestore(key, - filn, - tmpe.swap_file_sz, - tmpe.expires, - tmpe.timestamp, - tmpe.lastref, - tmpe.lastmod, - tmpe.refcount, /* refcount */ - tmpe.flags, /* flags */ - (int) flags.clean)); - storeDirSwapLog(currentEntry(), SWAP_LOG_ADD); -} - -StoreEntry * -RebuildState::currentEntry() const -{ - return e; -} - -void -RebuildState::currentEntry(StoreEntry *newValue) -{ - e = newValue; -} - -/// process one swap log entry -void -RebuildState::rebuildFromSwapLog() -{ - StoreSwapLogData swapData; - - if (LogParser->ReadRecord(swapData) != 1) { - debugs(47, 1, "Done reading " << sd->path << " swaplog (" << n_read << " entries)"); - LogParser->Close(); - delete LogParser; - LogParser = NULL; - _done = true; - return; - } - - ++n_read; - - if (!swapData.sane()) { - ++counts.invalid; - return; - } - - /* - * BC: during 2.4 development, we changed the way swap file - * numbers are assigned and stored. The high 16 bits used - * to encode the SD index number. There used to be a call - * to storeDirProperFileno here that re-assigned the index - * bits. Now, for backwards compatibility, we just need - * to mask it off. - */ - swapData.swap_filen &= 0x00FFFFFF; - - debugs(47, 3, "commonUfsDirRebuildFromSwapLog: " << - swap_log_op_str[(int) swapData.op] << " " << - storeKeyText(swapData.key) << " "<< std::setfill('0') << - std::hex << std::uppercase << std::setw(8) << - swapData.swap_filen); - - if (swapData.op == SWAP_LOG_ADD) { - (void) 0; - } else if (swapData.op == SWAP_LOG_DEL) { - /* Delete unless we already have a newer copy anywhere in any store */ - /* this needs to become - * 1) unpack url - * 2) make synthetic request with headers ?? or otherwise search - * for a matching object in the store - * TODO FIXME change to new async api - */ - currentEntry (Store::Root().get(swapData.key)); - - if (currentEntry() != NULL && swapData.lastref >= e->lastref) { - undoAdd(); - --counts.objcount; - ++counts.cancelcount; - } - return; - } else { - const double - x = ::log(static_cast(++counts.bad_log_op)) / ::log(10.0); - - if (0.0 == x - (double) (int) x) - debugs(47, 1, "WARNING: " << counts.bad_log_op << " invalid swap log entries found"); - - ++counts.invalid; - - return; - } - - ++counts.scancount; // XXX: should not this be incremented earlier? - - if (!sd->validFileno(swapData.swap_filen, 0)) { - ++counts.invalid; - return; - } - - if (EBIT_TEST(swapData.flags, KEY_PRIVATE)) { - ++counts.badflags; - return; - } - - /* this needs to become - * 1) unpack url - * 2) make synthetic request with headers ?? or otherwise search - * for a matching object in the store - * TODO FIXME change to new async api - */ - currentEntry (Store::Root().get(swapData.key)); - - int used; /* is swapfile already in use? */ - - used = sd->mapBitTest(swapData.swap_filen); - - /* If this URL already exists in the cache, does the swap log - * appear to have a newer entry? Compare 'lastref' from the - * swap log to e->lastref. */ - /* is the log entry newer than current entry? */ - int disk_entry_newer = currentEntry() ? (swapData.lastref > currentEntry()->lastref ? 1 : 0) : 0; - - if (used && !disk_entry_newer) { - /* log entry is old, ignore it */ - ++counts.clashcount; - return; - } else if (used && currentEntry() && currentEntry()->swap_filen == swapData.swap_filen && currentEntry()->swap_dirn == sd->index) { - /* swapfile taken, same URL, newer, update meta */ - - if (currentEntry()->store_status == STORE_OK) { - currentEntry()->lastref = swapData.timestamp; - currentEntry()->timestamp = swapData.timestamp; - currentEntry()->expires = swapData.expires; - currentEntry()->lastmod = swapData.lastmod; - currentEntry()->flags = swapData.flags; - currentEntry()->refcount += swapData.refcount; - sd->dereference(*currentEntry()); - } else { - debug_trap("commonUfsDirRebuildFromSwapLog: bad condition"); - debugs(47, 1, "\tSee " << __FILE__ << ":" << __LINE__); - } - return; - } else if (used) { - /* swapfile in use, not by this URL, log entry is newer */ - /* This is sorta bad: the log entry should NOT be newer at this - * point. If the log is dirty, the filesize check should have - * caught this. If the log is clean, there should never be a - * newer entry. */ - debugs(47, 1, "WARNING: newer swaplog entry for dirno " << - sd->index << ", fileno "<< std::setfill('0') << std::hex << - std::uppercase << std::setw(8) << swapData.swap_filen); - - /* I'm tempted to remove the swapfile here just to be safe, - * but there is a bad race condition in the NOVM version if - * the swapfile has recently been opened for writing, but - * not yet opened for reading. Because we can't map - * swapfiles back to StoreEntrys, we don't know the state - * of the entry using that file. */ - /* We'll assume the existing entry is valid, probably because - * were in a slow rebuild and the the swap file number got taken - * and the validation procedure hasn't run. */ - assert(flags.need_to_validate); - ++counts.clashcount; - return; - } else if (currentEntry() && !disk_entry_newer) { - /* key already exists, current entry is newer */ - /* keep old, ignore new */ - ++counts.dupcount; - return; - } else if (currentEntry()) { - /* key already exists, this swapfile not being used */ - /* junk old, load new */ - undoAdd(); - --counts.objcount; - ++counts.dupcount; - } else { - /* URL doesnt exist, swapfile not in use */ - /* load new */ - (void) 0; - } - - ++counts.objcount; - - currentEntry(sd->addDiskRestore(swapData.key, - swapData.swap_filen, - swapData.swap_file_sz, - swapData.expires, - swapData.timestamp, - swapData.lastref, - swapData.lastmod, - swapData.refcount, - swapData.flags, - (int) flags.clean)); - - storeDirSwapLog(currentEntry(), SWAP_LOG_ADD); -} - -/// undo the effects of adding an entry in rebuildFromSwapLog() -void -RebuildState::undoAdd() -{ - StoreEntry *added = currentEntry(); - assert(added); - currentEntry(NULL); - - // TODO: Why bother with these two if we are going to release?! - added->expireNow(); - added->releaseRequest(); - - if (added->swap_filen > -1) { - UFSSwapDir *sde = dynamic_cast(INDEXSD(added->swap_dirn)); - assert(sde); - sde->undoAddDiskRestore(added); - } - - added->release(); -} - -int -RebuildState::getNextFile(sfileno * filn_p, int *size) -{ - int fd = -1; - int dirs_opened = 0; - debugs(47, 3, "commonUfsDirGetNextFile: flag=" << flags.init << ", " << - sd->index << ": /"<< std::setfill('0') << std::hex << - std::uppercase << std::setw(2) << curlvl1 << "/" << std::setw(2) << - curlvl2); - - if (done) - return -2; - - while (fd < 0 && done == 0) { - fd = -1; - - if (0 == flags.init) { /* initialize, open first file */ - done = 0; - curlvl1 = 0; - curlvl2 = 0; - in_dir = 0; - flags.init = 1; - assert(Config.cacheSwap.n_configured > 0); - } - - if (0 == in_dir) { /* we need to read in a new directory */ - snprintf(fullpath, MAXPATHLEN, "%s/%02X/%02X", - sd->path, - curlvl1, curlvl2); - - if (dirs_opened) - return -1; - - td = opendir(fullpath); - - ++dirs_opened; - - if (td == NULL) { - debugs(47, 1, "commonUfsDirGetNextFile: opendir: " << fullpath << ": " << xstrerror()); - } else { - entry = readdir(td); /* skip . and .. */ - entry = readdir(td); - - if (entry == NULL && errno == ENOENT) - debugs(47, 1, "commonUfsDirGetNextFile: directory does not exist!."); - debugs(47, 3, "commonUfsDirGetNextFile: Directory " << fullpath); - } - } - - if (td != NULL && (entry = readdir(td)) != NULL) { - ++in_dir; - - if (sscanf(entry->d_name, "%x", &fn) != 1) { - debugs(47, 3, "commonUfsDirGetNextFile: invalid " << entry->d_name); - continue; - } - - if (!UFSSwapDir::FilenoBelongsHere(fn, sd->index, curlvl1, curlvl2)) { - debugs(47, 3, "commonUfsDirGetNextFile: "<< std::setfill('0') << - std::hex << std::uppercase << std::setw(8) << fn << - " does not belong in " << std::dec << sd->index << "/" << - curlvl1 << "/" << curlvl2); - - continue; - } - - if (sd->mapBitTest(fn)) { - debugs(47, 3, "commonUfsDirGetNextFile: Locked, continuing with next."); - continue; - } - - snprintf(fullfilename, MAXPATHLEN, "%s/%s", - fullpath, entry->d_name); - debugs(47, 3, "commonUfsDirGetNextFile: Opening " << fullfilename); - fd = file_open(fullfilename, O_RDONLY | O_BINARY); - - if (fd < 0) - debugs(47, 1, "commonUfsDirGetNextFile: " << fullfilename << ": " << xstrerror()); - else - ++store_open_disk_fd; - - continue; - } - - if (td != NULL) - closedir(td); - - td = NULL; - - in_dir = 0; - - if (sd->validL2(++curlvl2)) - continue; - - curlvl2 = 0; - - if (sd->validL1(++curlvl1)) - continue; - - curlvl1 = 0; - - done = 1; - } - - *filn_p = fn; - return fd; -} - -bool -RebuildState::error() const -{ - return false; -} - -bool -RebuildState::isDone() const -{ - return _done; -} - -StoreEntry * -RebuildState::currentItem() -{ - return currentEntry(); -} - -#if !_USE_INLINE_ -#include "ufscommon.cci" -#endif === removed file 'src/fs/ufs/ufscommon.cci' --- src/fs/ufs/ufscommon.cci 2009-01-21 03:47:47 +0000 +++ src/fs/ufs/ufscommon.cci 1970-01-01 00:00:00 +0000 @@ -1,34 +0,0 @@ -/* - * $Id$ - * - * DEBUG: section 47 Store Directory Routines - * AUTHOR: Duane Wessels - * - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - */ - === removed file 'src/fs/ufs/ufscommon.h' --- src/fs/ufs/ufscommon.h 2012-07-20 23:11:02 +0000 +++ src/fs/ufs/ufscommon.h 1970-01-01 00:00:00 +0000 @@ -1,425 +0,0 @@ -/* - * $Id$ - * - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - */ -#ifndef SQUID_UFSCOMMON_H -#define SQUID_UFSCOMMON_H - - -#define DefaultLevelOneDirs 16 -#define DefaultLevelTwoDirs 256 -#define STORE_META_BUFSZ 4096 - -class UFSStrategy; -class ConfigOptionVector; -class DiskIOModule; -class StoreSearch; -class FileMap; - -#include "SwapDir.h" - -/// \ingroup UFS -class UFSSwapDir : public SwapDir -{ - -public: - static int IsUFSDir(SwapDir* sd); - static int DirClean(int swap_index); - static int FilenoBelongsHere(int fn, int F0, int F1, int F2); - - UFSSwapDir(char const *aType, const char *aModuleType); - virtual void init(); - virtual void create(); - virtual void dump(StoreEntry &) const; - ~UFSSwapDir(); - virtual StoreSearch *search(String const url, HttpRequest *); - virtual bool doubleCheck(StoreEntry &); - virtual bool unlinkdUseful() const; - virtual void unlink(StoreEntry &); - virtual void statfs(StoreEntry &)const; - virtual void maintain(); - virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const; - virtual void reference(StoreEntry &); - virtual bool dereference(StoreEntry &); - virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); - virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); - virtual void openLog(); - virtual void closeLog(); - virtual int writeCleanStart(); - virtual void writeCleanDone(); - virtual void logEntry(const StoreEntry & e, int op) const; - virtual void parse(int index, char *path); - virtual void reconfigure(); - virtual int callback(); - virtual void sync(); - virtual void swappedOut(const StoreEntry &e); - virtual uint64_t currentSize() const { return cur_size; } - virtual uint64_t currentCount() const { return n_disk_objects; } - - void unlinkFile(sfileno f); - // move down when unlink is a virtual method - //protected: - UFSStrategy *IO; - char *fullPath(sfileno, char *) const; - /* temp */ - void closeTmpSwapLog(); - FILE *openTmpSwapLog(int *clean_flag, int *zero_flag); - char *swapSubDir(int subdirn) const; - int mapBitTest(sfileno filn); - void mapBitReset(sfileno filn); - void mapBitSet(sfileno filn); - StoreEntry *addDiskRestore(const cache_key * key, - sfileno file_number, - uint64_t swap_file_sz, - time_t expires, - time_t timestamp, - time_t lastref, - time_t lastmod, - uint32_t refcount, - uint16_t flags, - int clean); - /// Undo the effects of UFSSwapDir::addDiskRestore(). - void undoAddDiskRestore(StoreEntry *e); - int validFileno(sfileno filn, int flag) const; - int mapBitAllocate(); - virtual ConfigOption *getOptionTree() const; - - void *fsdata; - - bool validL2(int) const; - bool validL1(int) const; - - void replacementAdd(StoreEntry *e); - void replacementRemove(StoreEntry *e); - -protected: - FileMap *map; - int suggest; - int l1; - int l2; - -private: - void parseSizeL1L2(); - static int NumberOfUFSDirs; - static int * UFSDirToGlobalDirMapping; - bool pathIsDirectory(const char *path)const; - int swaplog_fd; - static EVH CleanEvent; - bool verifyCacheDirs(); - void rebuild(); - int createDirectory(const char *path, int); - void createSwapSubDirs(); - void dumpEntry(StoreEntry &) const; - char *logFile(char const *ext = NULL)const; - void changeIO(DiskIOModule *); - bool optionIOParse(char const *option, const char *value, int reconfiguring); - void optionIODump(StoreEntry * e) const; - mutable ConfigOptionVector *currentIOOptions; - char const *ioType; - uint64_t cur_size; ///< currently used space in the storage area - uint64_t n_disk_objects; ///< total number of objects stored -}; - -#include "RefCount.h" -#include "DiskIO/IORequestor.h" - -/** - * UFS dir specific IO calls - * - \todo This should be whittled away. - * DiskIOModule should be providing the entire needed API. - */ - -class DiskIOStrategy; - -class DiskFile; - -/// \ingroup UFS -class UFSStrategy -{ - -public: - UFSStrategy (DiskIOStrategy *); - virtual ~UFSStrategy (); - /* Not implemented */ - UFSStrategy (UFSStrategy const &); - UFSStrategy &operator=(UFSStrategy const &); - - virtual bool shedLoad(); - - virtual int load(); - - StoreIOState::Pointer createState(SwapDir *SD, StoreEntry *e, StoreIOState::STIOCB * callback, void *callback_data) const; - /* UFS specific */ - virtual RefCount newFile (char const *path); - StoreIOState::Pointer open(SwapDir *, StoreEntry *, StoreIOState::STFNCB *, - StoreIOState::STIOCB *, void *); - StoreIOState::Pointer create(SwapDir *, StoreEntry *, StoreIOState::STFNCB *, - StoreIOState::STIOCB *, void *); - - virtual void unlinkFile (char const *); - virtual void sync(); - - virtual int callback(); - - /** Init per-instance logic */ - virtual void init(); - - /** cachemgr output on the IO instance stats */ - virtual void statfs(StoreEntry & sentry)const; - - /** The io strategy in use */ - DiskIOStrategy *io; -protected: - - friend class UFSSwapDir; -}; - -/** Common ufs-store-dir logic */ - -class ReadRequest; - -/// \ingroup UFS -class UFSStoreState : public StoreIOState, public IORequestor -{ - -public: - void * operator new (size_t); - void operator delete (void *); - UFSStoreState(SwapDir * SD, StoreEntry * anEntry, STIOCB * callback_, void *callback_data_); - ~UFSStoreState(); - virtual void close(int how); - virtual void closeCompleted(); - // protected: - virtual void ioCompletedNotification(); - virtual void readCompleted(const char *buf, int len, int errflag, RefCount); - virtual void writeCompleted(int errflag, size_t len, RefCount); - RefCount theFile; - bool opening; - bool creating; - bool closing; - bool reading; - bool writing; - void read_(char *buf, size_t size, off_t offset, STRCB * callback, void *callback_data); - void write(char const *buf, size_t size, off_t offset, FREE * free_func); - -protected: - virtual void doCloseCallback (int errflag); - - class _queued_read - { - - public: - MEMPROXY_CLASS(UFSStoreState::_queued_read); - char *buf; - size_t size; - off_t offset; - STRCB *callback; - void *callback_data; - - }; - - class _queued_write - { - - public: - MEMPROXY_CLASS(UFSStoreState::_queued_write); - char const *buf; - size_t size; - off_t offset; - FREE *free_func; - - }; - - /** \todo These should be in the IO strategy */ - - struct { - /** - * DPW 2006-05-24 - * the write_draining flag is used to avoid recursion inside - * the UFSStoreState::drainWriteQueue() method. - */ - bool write_draining; - /** - * DPW 2006-05-24 - * The try_closing flag is set by UFSStoreState::tryClosing() - * when UFSStoreState wants to close the file, but cannot - * because of pending I/Os. If set, UFSStoreState will - * try to close again in the I/O callbacks. - */ - bool try_closing; - } flags; - link_list *pending_reads; - link_list *pending_writes; - void queueRead(char *, size_t, off_t, STRCB *, void *); - void queueWrite(char const *, size_t, off_t, FREE *); - bool kickReadQueue(); - void drainWriteQueue(); - void tryClosing(); - char *read_buf; - -private: - CBDATA_CLASS(UFSStoreState); - void openDone(); - void freePending(); - void doWrite(); -}; - -MEMPROXY_CLASS_INLINE(UFSStoreState::_queued_read); -MEMPROXY_CLASS_INLINE(UFSStoreState::_queued_write); - - -#include "StoreSearch.h" - -/// \ingroup UFS -class StoreSearchUFS : public StoreSearch -{ - -public: - StoreSearchUFS(RefCount sd); - StoreSearchUFS(StoreSearchUFS const &); - virtual ~StoreSearchUFS(); - - /** \todo Iterator API - garh, wrong place */ - /** - * callback the client when a new StoreEntry is available - * or an error occurs - */ - virtual void next(void (callback)(void *cbdata), void *cbdata); - - /** - \retval true if a new StoreEntry is immediately available - \retval false if a new StoreEntry is NOT immediately available - */ - virtual bool next(); - - virtual bool error() const; - virtual bool isDone() const; - virtual StoreEntry *currentItem(); - - RefCount sd; - RemovalPolicyWalker *walker; - -private: - CBDATA_CLASS2(StoreSearchUFS); - /// \bug (callback) should be hidden behind a proper human readable name - void (callback)(void *cbdata); - void *cbdata; - StoreEntry * current; - bool _done; -}; - - -class StoreSwapLogData; - -/// \ingroup UFS -class UFSSwapLogParser -{ - -public: - FILE *log; - int log_entries; - int record_size; - - UFSSwapLogParser(FILE *fp):log(fp),log_entries(-1), record_size(0) { - } - virtual ~UFSSwapLogParser() {}; - - static UFSSwapLogParser *GetUFSSwapLogParser(FILE *fp); - - virtual bool ReadRecord(StoreSwapLogData &swapData) = 0; - int SwapLogEntries(); - void Close() { - if (log) { - fclose(log); - log = NULL; - } - } -}; - - -/// \ingroup UFS -class RebuildState : public RefCountable -{ - -public: - static EVH RebuildStep; - - RebuildState(RefCount sd); - ~RebuildState(); - - virtual bool error() const; - virtual bool isDone() const; - virtual StoreEntry *currentItem(); - - RefCount sd; - int n_read; - /* FILE *log;*/ - UFSSwapLogParser *LogParser; - int curlvl1; - int curlvl2; - - struct { - unsigned int need_to_validate:1; - unsigned int clean:1; - unsigned int init:1; - } flags; - int in_dir; - int done; - int fn; - - dirent_t *entry; - DIR *td; - char fullpath[MAXPATHLEN]; - char fullfilename[MAXPATHLEN]; - - struct _store_rebuild_data counts; - -private: - CBDATA_CLASS2(RebuildState); - void rebuildFromDirectory(); - void rebuildFromSwapLog(); - void rebuildStep(); - void undoAdd(); - int getNextFile(sfileno *, int *size); - StoreEntry *currentEntry() const; - void currentEntry(StoreEntry *); - StoreEntry *e; - bool fromLog; - bool _done; - /// \bug (callback) should be hidden behind a proper human readable name - void (callback)(void *cbdata); - void *cbdata; -}; - -#if _USE_INLINE_ -#include "ufscommon.cci" -#endif - -#endif /* SQUID_UFSCOMMON_H */ === modified file 'src/gopher.cc' --- src/gopher.cc 2012-07-23 15:34:12 +0000 +++ src/gopher.cc 2012-08-02 21:10:18 +0000 @@ -454,7 +454,7 @@ llen = left; } if (gopherState->len + llen >= TEMP_BUF_SIZE) { - debugs(10, 1, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url() ); + debugs(10, DBG_IMPORTANT, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url() ); llen = TEMP_BUF_SIZE - gopherState->len - 1; } if (!lpos) { @@ -796,7 +796,7 @@ } if (flag != COMM_OK) { - debugs(50, 1, "gopherReadReply: error reading: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "gopherReadReply: error reading: " << xstrerror()); if (ignoreErrno(xerrno)) { AsyncCall::Pointer call = commCbCall(5,4, "gopherReadReply", === modified file 'src/helper.cc' --- src/helper.cc 2012-07-23 15:34:12 +0000 +++ src/helper.cc 2012-08-02 21:18:43 +0000 @@ -172,10 +172,10 @@ /* figure out how many new child are actually needed. */ int need_new = hlp->childs.needNew(); - debugs(84, 1, "helperOpenServers: Starting " << need_new << "/" << hlp->childs.n_max << " '" << shortname << "' processes"); + debugs(84, DBG_IMPORTANT, "helperOpenServers: Starting " << need_new << "/" << hlp->childs.n_max << " '" << shortname << "' processes"); if (need_new < 1) { - debugs(84, 1, "helperOpenServers: No '" << shortname << "' processes needed."); + debugs(84, DBG_IMPORTANT, "helperOpenServers: No '" << shortname << "' processes needed."); } procname = (char *)xmalloc(strlen(shortname) + 3); @@ -208,7 +208,7 @@ &hIpc); if (pid < 0) { - debugs(84, 1, "WARNING: Cannot run '" << progname << "' process."); + debugs(84, DBG_IMPORTANT, "WARNING: Cannot run '" << progname << "' process."); continue; } @@ -277,7 +277,7 @@ return; if (hlp->childs.concurrency) - debugs(84, 0, "ERROR: concurrency= is not yet supported for stateful helpers ('" << hlp->cmdline << "')"); + debugs(84, DBG_CRITICAL, "ERROR: concurrency= is not yet supported for stateful helpers ('" << hlp->cmdline << "')"); char *progname = hlp->cmdline->key; @@ -290,10 +290,10 @@ /* figure out haw mant new helpers are needed. */ int need_new = hlp->childs.needNew(); - debugs(84, 1, "helperOpenServers: Starting " << need_new << "/" << hlp->childs.n_max << " '" << shortname << "' processes"); + debugs(84, DBG_IMPORTANT, "helperOpenServers: Starting " << need_new << "/" << hlp->childs.n_max << " '" << shortname << "' processes"); if (need_new < 1) { - debugs(84, 1, "helperStatefulOpenServers: No '" << shortname << "' processes needed."); + debugs(84, DBG_IMPORTANT, "helperStatefulOpenServers: No '" << shortname << "' processes needed."); } char *procname = (char *)xmalloc(strlen(shortname) + 3); @@ -328,7 +328,7 @@ &hIpc); if (pid < 0) { - debugs(84, 1, "WARNING: Cannot run '" << progname << "' process."); + debugs(84, DBG_IMPORTANT, "WARNING: Cannot run '" << progname << "' process."); continue; } @@ -680,7 +680,7 @@ /* note, don't free id_name, it probably points to static memory */ if (queue.head) - debugs(84, 0, "WARNING: freeing " << id_name << " helper with " << stats.queue_size << " requests queued"); + debugs(84, DBG_CRITICAL, "WARNING: freeing " << id_name << " helper with " << stats.queue_size << " requests queued"); } /* ====================================================================== */ @@ -725,12 +725,12 @@ debugs(84, DBG_CRITICAL, "WARNING: " << hlp->id_name << " #" << srv->index + 1 << " exited"); if (hlp->childs.needNew() > 0) { - debugs(80, 1, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); + debugs(80, DBG_IMPORTANT, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); if (hlp->childs.n_active < hlp->childs.n_startup && hlp->last_restart > squid_curtime - 30) fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); - debugs(80, 1, "Starting new helpers"); + debugs(80, DBG_IMPORTANT, "Starting new helpers"); helperOpenServers(hlp); } } @@ -783,15 +783,15 @@ if (!srv->flags.shutdown) { assert( hlp->childs.n_active > 0); -- hlp->childs.n_active; - debugs(84, 0, "WARNING: " << hlp->id_name << " #" << srv->index + 1 << " exited"); + debugs(84, DBG_CRITICAL, "WARNING: " << hlp->id_name << " #" << srv->index + 1 << " exited"); if (hlp->childs.needNew() > 0) { - debugs(80, 1, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); + debugs(80, DBG_IMPORTANT, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); if (hlp->childs.n_active < hlp->childs.n_startup && hlp->last_restart > squid_curtime - 30) fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); - debugs(80, 1, "Starting new helpers"); + debugs(80, DBG_IMPORTANT, "Starting new helpers"); helperStatefulOpenServers(hlp); } } @@ -845,7 +845,7 @@ helperRequestFree(r); } else { - debugs(84, 1, "helperHandleRead: unexpected reply on channel " << + debugs(84, DBG_IMPORTANT, "helperHandleRead: unexpected reply on channel " << request_number << " from " << hlp->id_name << " #" << srv->index + 1 << " '" << srv->rbuf << "'"); } @@ -890,7 +890,7 @@ if (!srv->stats.pending) { /* someone spoke without being spoken to */ - debugs(84, 1, "helperHandleRead: unexpected read from " << + debugs(84, DBG_IMPORTANT, "helperHandleRead: unexpected read from " << hlp->id_name << " #" << srv->index + 1 << ", " << (int)len << " bytes '" << srv->rbuf << "'"); @@ -980,7 +980,7 @@ if (r == NULL) { /* someone spoke without being spoken to */ - debugs(84, 1, "helperStatefulHandleRead: unexpected read from " << + debugs(84, DBG_IMPORTANT, "helperStatefulHandleRead: unexpected read from " << hlp->id_name << " #" << srv->index + 1 << ", " << (int)len << " bytes '" << srv->rbuf << "'"); @@ -1000,7 +1000,7 @@ if (r && cbdataReferenceValid(r->data)) { r->callback(r->data, srv, srv->rbuf); } else { - debugs(84, 1, "StatefulHandleRead: no callback data registered"); + debugs(84, DBG_IMPORTANT, "StatefulHandleRead: no callback data registered"); called = 0; } @@ -1058,7 +1058,7 @@ /* do this first so idle=N has a chance to grow the child pool before it hits critical. */ if (hlp->childs.needNew() > 0) { - debugs(84, 0, "Starting new " << hlp->id_name << " helpers..."); + debugs(84, DBG_CRITICAL, "Starting new " << hlp->id_name << " helpers..."); helperOpenServers(hlp); return; } @@ -1074,9 +1074,9 @@ hlp->last_queue_warn = squid_curtime; - debugs(84, 0, "WARNING: All " << hlp->childs.n_active << "/" << hlp->childs.n_max << " " << hlp->id_name << " processes are busy."); - debugs(84, 0, "WARNING: " << hlp->stats.queue_size << " pending requests queued"); - debugs(84, 0, "WARNING: Consider increasing the number of " << hlp->id_name << " processes in your config file."); + debugs(84, DBG_CRITICAL, "WARNING: All " << hlp->childs.n_active << "/" << hlp->childs.n_max << " " << hlp->id_name << " processes are busy."); + debugs(84, DBG_CRITICAL, "WARNING: " << hlp->stats.queue_size << " pending requests queued"); + debugs(84, DBG_CRITICAL, "WARNING: Consider increasing the number of " << hlp->id_name << " processes in your config file."); if (hlp->stats.queue_size > (int)hlp->childs.n_running * 2) fatalf("Too many queued %s requests", hlp->id_name); @@ -1091,7 +1091,7 @@ /* do this first so idle=N has a chance to grow the child pool before it hits critical. */ if (hlp->childs.needNew() > 0) { - debugs(84, 0, "Starting new " << hlp->id_name << " helpers..."); + debugs(84, DBG_CRITICAL, "Starting new " << hlp->id_name << " helpers..."); helperStatefulOpenServers(hlp); return; } @@ -1110,9 +1110,9 @@ hlp->last_queue_warn = squid_curtime; - debugs(84, 0, "WARNING: All " << hlp->childs.n_active << "/" << hlp->childs.n_max << " " << hlp->id_name << " processes are busy."); - debugs(84, 0, "WARNING: " << hlp->stats.queue_size << " pending requests queued"); - debugs(84, 0, "WARNING: Consider increasing the number of " << hlp->id_name << " processes in your config file."); + debugs(84, DBG_CRITICAL, "WARNING: All " << hlp->childs.n_active << "/" << hlp->childs.n_max << " " << hlp->id_name << " processes are busy."); + debugs(84, DBG_CRITICAL, "WARNING: " << hlp->stats.queue_size << " pending requests queued"); + debugs(84, DBG_CRITICAL, "WARNING: Consider increasing the number of " << hlp->id_name << " processes in your config file."); } static helper_request * @@ -1240,7 +1240,7 @@ if (flag != COMM_OK) { /* Helper server has crashed */ - debugs(84, 0, "helperDispatch: Helper " << srv->parent->id_name << " #" << srv->index + 1 << " has crashed"); + debugs(84, DBG_CRITICAL, "helperDispatch: Helper " << srv->parent->id_name << " #" << srv->index + 1 << " has crashed"); return; } @@ -1262,7 +1262,7 @@ unsigned int slot; if (!cbdataReferenceValid(r->data)) { - debugs(84, 1, "helperDispatch: invalid callback data"); + debugs(84, DBG_IMPORTANT, "helperDispatch: invalid callback data"); helperRequestFree(r); return; } @@ -1317,7 +1317,7 @@ statefulhelper *hlp = srv->parent; if (!cbdataReferenceValid(r->data)) { - debugs(84, 1, "helperStatefulDispatch: invalid callback data"); + debugs(84, DBG_IMPORTANT, "helperStatefulDispatch: invalid callback data"); helperStatefulRequestFree(r); helperStatefulReleaseServer(srv); return; === modified file 'src/http.cc' --- src/http.cc 2012-07-23 07:02:06 +0000 +++ src/http.cc 2012-08-02 21:10:18 +0000 @@ -609,7 +609,7 @@ if (Config.onoff.detect_broken_server_pconns && reply->bodySize(request->method) == -1 && !flags.chunked) { - debugs(11, 1, "keepaliveAccounting: Impossible keep-alive header from '" << entry->url() << "'" ); + debugs(11, DBG_IMPORTANT, "keepaliveAccounting: Impossible keep-alive header from '" << entry->url() << "'" ); // debugs(11, 2, "GOT HTTP REPLY HDR:\n---------\n" << readBuf->content() << "\n----------" ); flags.keepalive_broken = 1; } @@ -1682,7 +1682,7 @@ static int warnedCount = 0; if (warnedCount++ < 100) { const char *url = entry ? entry->url() : urlCanonical(request); - debugs(11, 1, "Warning: likely forwarding loop with " << url); + debugs(11, DBG_IMPORTANT, "Warning: likely forwarding loop with " << url); } } @@ -2257,7 +2257,7 @@ // XXX: we should check this condition in other callbacks then! // TODO: Check whether this can actually happen: We should unsubscribe // as a body consumer when the above condition(s) are detected. - debugs(11, 1, HERE << "Transaction aborted while reading HTTP body"); + debugs(11, DBG_IMPORTANT, HERE << "Transaction aborted while reading HTTP body"); return; } @@ -2268,7 +2268,7 @@ if (flags.headers_parsed && !flags.abuse_detected) { flags.abuse_detected = 1; - debugs(11, 1, "http handleMoreRequestBodyAvailable: Likely proxy abuse detected '" << request->client_addr << "' -> '" << entry->url() << "'" ); + debugs(11, DBG_IMPORTANT, "http handleMoreRequestBodyAvailable: Likely proxy abuse detected '" << request->client_addr << "' -> '" << entry->url() << "'" ); if (virginReply()->sline.status == HTTP_INVALID_HEADER) { serverConnection->close(); === modified file 'src/icmp/Icmp4.cc' --- src/icmp/Icmp4.cc 2012-07-20 12:44:39 +0000 +++ src/icmp/Icmp4.cc 2012-08-02 21:18:43 +0000 @@ -79,12 +79,12 @@ icmp_sock = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); if (icmp_sock < 0) { - debugs(50, 0, HERE << " icmp_sock: " << xstrerror()); + debugs(50, DBG_CRITICAL, HERE << " icmp_sock: " << xstrerror()); return -1; } icmp_ident = getpid() & 0xffff; - debugs(42, 1, "pinger: ICMP socket opened."); + debugs(42, DBG_IMPORTANT, "pinger: ICMP socket opened."); return icmp_sock; } @@ -152,7 +152,7 @@ S->ai_addrlen); if (x < 0) { - debugs(42, 1, HERE << "Error sending to ICMP packet to " << to << ". ERR: " << xstrerror()); + debugs(42, DBG_IMPORTANT, HERE << "Error sending to ICMP packet to " << to << ". ERR: " << xstrerror()); } Log(to, ' ', NULL, 0, 0); @@ -172,7 +172,7 @@ static pingerReplyData preply; if (icmp_sock < 0) { - debugs(42, 0, HERE << "No socket! Recv() should not be called."); + debugs(42, DBG_CRITICAL, HERE << "No socket! Recv() should not be called."); return; } === modified file 'src/icmp/Icmp6.cc' --- src/icmp/Icmp6.cc 2012-07-20 12:44:39 +0000 +++ src/icmp/Icmp6.cc 2012-08-02 21:18:43 +0000 @@ -119,12 +119,12 @@ icmp_sock = socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6); if (icmp_sock < 0) { - debugs(50, 0, HERE << " icmp_sock: " << xstrerror()); + debugs(50, DBG_CRITICAL, HERE << " icmp_sock: " << xstrerror()); return -1; } icmp_ident = getpid() & 0xffff; - debugs(42, 1, "pinger: ICMPv6 socket opened"); + debugs(42, DBG_IMPORTANT, "pinger: ICMPv6 socket opened"); return icmp_sock; } @@ -197,7 +197,7 @@ S->ai_addrlen); if (x < 0) { - debugs(42, 1, HERE << "Error sending to ICMPv6 packet to " << to << ". ERR: " << xstrerror()); + debugs(42, DBG_IMPORTANT, HERE << "Error sending to ICMPv6 packet to " << to << ". ERR: " << xstrerror()); } debugs(42,9, HERE << "x=" << x); @@ -220,7 +220,7 @@ static pingerReplyData preply; if (icmp_sock < 0) { - debugs(42,0, HERE << "dropping ICMPv6 read. No socket!?"); + debugs(42, DBG_CRITICAL, HERE << "dropping ICMPv6 read. No socket!?"); return; } @@ -271,7 +271,7 @@ ip = (struct ip6_hdr *) pkt; pkt += sizeof(ip6_hdr); - debugs(42,0, HERE << "ip6_nxt=" << ip->ip6_nxt << + debugs(42, DBG_CRITICAL, HERE << "ip6_nxt=" << ip->ip6_nxt << ", ip6_plen=" << ip->ip6_plen << ", ip6_hlim=" << ip->ip6_hlim << ", ip6_hops=" << ip->ip6_hops << === modified file 'src/icmp/IcmpPinger.cc' --- src/icmp/IcmpPinger.cc 2012-01-20 18:55:04 +0000 +++ src/icmp/IcmpPinger.cc 2012-08-02 21:18:43 +0000 @@ -88,7 +88,7 @@ if (x < (int)sizeof(wpi)) { getCurrentTime(); - debugs(42, 0, HERE << "read: FD 0: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "read: FD 0: " << xstrerror()); write(1, "ERR\n", 4); return -1; } @@ -100,7 +100,7 @@ if (x < (int)sizeof(PS)) { getCurrentTime(); - debugs(42, 0, HERE << "read: FD 0: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "read: FD 0: " << xstrerror()); write(1, "ERR\n", 4); return -1; } @@ -111,7 +111,7 @@ if (icmp_sock == -1) { getCurrentTime(); - debugs(42, 0, HERE << "WSASocket: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "WSASocket: " << xstrerror()); write(1, "ERR\n", 4); return -1; } @@ -120,7 +120,7 @@ if (SOCKET_ERROR == x) { getCurrentTime(); - debugs(42, 0, HERE << "connect: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "connect: " << xstrerror()); write(1, "ERR\n", 4); return -1; } @@ -130,19 +130,19 @@ x = recv(icmp_sock, (void *) buf, sizeof(buf), 0); if (x < 3) { - debugs(42, 0, HERE << "recv: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "recv: " << xstrerror()); return -1; } x = send(icmp_sock, (const void *) buf, strlen(buf), 0); if (x < 3 || strncmp("OK\n", buf, 3)) { - debugs(42, 0, HERE << "recv: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << "recv: " << xstrerror()); return -1; } getCurrentTime(); - debugs(42, 1, "pinger: Squid socket opened"); + debugs(42, DBG_IMPORTANT, "pinger: Squid socket opened"); /* windows uses a socket stream as a dual-direction channel */ socket_to_squid = icmp_sock; @@ -185,14 +185,14 @@ n = recv(socket_from_squid, &pecho, sizeof(pecho), 0); if (n < 0) { - debugs(42, 1, "Pinger exiting."); + debugs(42, DBG_IMPORTANT, "Pinger exiting."); Close(); exit(1); } if (0 == n) { /* EOF indicator */ - debugs(42, 0, HERE << "EOF encountered. Pinger exiting.\n"); + debugs(42, DBG_CRITICAL, HERE << "EOF encountered. Pinger exiting.\n"); errno = 0; Close(); exit(1); @@ -223,7 +223,7 @@ pecho.payload, pecho.psize); } else { - debugs(42, 1, HERE << " IP has unknown Type. " << pecho.to ); + debugs(42, DBG_IMPORTANT, HERE << " IP has unknown Type. " << pecho.to ); } } @@ -233,7 +233,7 @@ debugs(42, 2, HERE << "return result to squid. len=" << len); if (send(socket_to_squid, &preply, len, 0) < 0) { - debugs(42, 0, "pinger: FATAL error on send: " << xstrerror()); + debugs(42, DBG_CRITICAL, "pinger: FATAL error on send: " << xstrerror()); Close(); exit(1); } === modified file 'src/icmp/IcmpSquid.cc' --- src/icmp/IcmpSquid.cc 2012-01-20 18:55:04 +0000 +++ src/icmp/IcmpSquid.cc 2012-08-02 21:18:43 +0000 @@ -115,7 +115,7 @@ x = comm_udp_send(icmp_sock, (char *)&pecho, slen, 0); if (x < 0) { - debugs(37, 1, HERE << "send: " << xstrerror()); + debugs(37, DBG_IMPORTANT, HERE << "send: " << xstrerror()); /** \li If the send results in ECONNREFUSED or EPIPE errors from helper, will cleanly shutdown the module. */ /** \todo This should try restarting the helper a few times?? before giving up? */ @@ -125,7 +125,7 @@ } /** All other send errors are ignored. */ } else if (x != slen) { - debugs(37, 1, HERE << "Wrote " << x << " of " << slen << " bytes"); + debugs(37, DBG_IMPORTANT, HERE << "Wrote " << x << " of " << slen << " bytes"); } } @@ -153,7 +153,7 @@ 0); if (n < 0 && EAGAIN != errno) { - debugs(37, 1, HERE << "recv: " << xstrerror()); + debugs(37, DBG_IMPORTANT, HERE << "recv: " << xstrerror()); if (errno == ECONNREFUSED) Close(); @@ -190,7 +190,7 @@ break; default: - debugs(37, 1, HERE << "Bad opcode: " << preply.opcode << " from " << F); + debugs(37, DBG_IMPORTANT, HERE << "Bad opcode: " << preply.opcode << " from " << F); break; } } @@ -252,7 +252,7 @@ commUnsetFdTimeout(icmp_sock); - debugs(37, 1, HERE << "Pinger socket opened on FD " << icmp_sock); + debugs(37, DBG_IMPORTANT, HERE << "Pinger socket opened on FD " << icmp_sock); /* Tests the pinger immediately using localhost */ if (Ip::EnableIpv6) @@ -279,7 +279,7 @@ if (icmp_sock < 0) return; - debugs(37, 1, HERE << "Closing Pinger socket on FD " << icmp_sock); + debugs(37, DBG_IMPORTANT, HERE << "Closing Pinger socket on FD " << icmp_sock); #if _SQUID_MSWIN_ @@ -294,7 +294,7 @@ if (hIpc) { if (WaitForSingleObject(hIpc, 12000) != WAIT_OBJECT_0) { getCurrentTime(); - debugs(37, 0, HERE << "WARNING: (pinger," << pid << ") didn't exit in 12 seconds"); + debugs(37, DBG_CRITICAL, HERE << "WARNING: (pinger," << pid << ") didn't exit in 12 seconds"); } CloseHandle(hIpc); === modified file 'src/icmp/net_db.cc' --- src/icmp/net_db.cc 2012-07-23 15:34:12 +0000 +++ src/icmp/net_db.cc 2012-08-02 21:18:43 +0000 @@ -307,7 +307,7 @@ x = (net_db_name *) hash_lookup(host_table, hostname); if (x == NULL) { - debugs(38, 1, "netdbSendPing: net_db_name list bug: " << hostname << " not found"); + debugs(38, DBG_IMPORTANT, "netdbSendPing: net_db_name list bug: " << hostname << " not found"); xfree(hostname); return; } @@ -482,7 +482,7 @@ lf = logfileOpen(Config.netdbFilename, 4096, 0); if (NULL == lf) { - debugs(50, 1, "netdbSaveState: " << Config.netdbFilename << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "netdbSaveState: " << Config.netdbFilename << ": " << xstrerror()); return; } @@ -514,7 +514,7 @@ logfileClose(lf); getCurrentTime(); - debugs(38, 1, "NETDB state saved; " << + debugs(38, DBG_IMPORTANT, "NETDB state saved; " << count << " entries, " << tvSubMsec(start, current_time) << " msec" ); eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600.0, 1); @@ -637,7 +637,7 @@ xfree(buf); getCurrentTime(); - debugs(38, 1, "NETDB state reloaded; " << + debugs(38, DBG_IMPORTANT, "NETDB state reloaded; " << count << " entries, " << tvSubMsec(start, current_time) << " msec" ); } @@ -799,7 +799,7 @@ break; default: - debugs(38, 1, "netdbExchangeHandleReply: corrupt data, aborting"); + debugs(38, DBG_IMPORTANT, "netdbExchangeHandleReply: corrupt data, aborting"); netdbExchangeDone(ex); return; } @@ -1024,7 +1024,7 @@ } if (i != memInUse(MEM_NETDBENTRY)) - debugs(38, 0, "WARNING: netdb_addrs count off, found " << i << + debugs(38, DBG_CRITICAL, "WARNING: netdb_addrs count off, found " << i << ", expected " << memInUse(MEM_NETDBENTRY)); qsort((char *) list, @@ -1318,7 +1318,7 @@ ex->r = HttpRequest::CreateFromUrl(uri); if (NULL == ex->r) { - debugs(38, 1, "netdbExchangeStart: Bad URI " << uri); + debugs(38, DBG_IMPORTANT, "netdbExchangeStart: Bad URI " << uri); return; } === modified file 'src/icmp/pinger.cc' --- src/icmp/pinger.cc 2012-01-20 18:55:04 +0000 +++ src/icmp/pinger.cc 2012-08-02 21:18:43 +0000 @@ -150,30 +150,30 @@ _db_init(NULL, debug_args); - debugs(42, 0, "pinger: Initialising ICMP pinger ..."); + debugs(42, DBG_CRITICAL, "pinger: Initialising ICMP pinger ..."); icmp4_worker = icmp4.Open(); if (icmp4_worker < 0) { - debugs(42, 0, "pinger: Unable to start ICMP pinger."); + debugs(42, DBG_CRITICAL, "pinger: Unable to start ICMP pinger."); } max_fd = max(max_fd, icmp4_worker); #if USE_IPV6 icmp6_worker = icmp6.Open(); if (icmp6_worker <0 ) { - debugs(42, 0, "pinger: Unable to start ICMPv6 pinger."); + debugs(42, DBG_CRITICAL, "pinger: Unable to start ICMPv6 pinger."); } max_fd = max(max_fd, icmp6_worker); #endif /** abort if neither worker could open a socket. */ if (icmp4_worker < 0 && icmp6_worker < 0) { - debugs(42, 0, "FATAL: pinger: Unable to open any ICMP sockets."); + debugs(42, DBG_CRITICAL, "FATAL: pinger: Unable to open any ICMP sockets."); exit(1); } if ( (squid_link = control.Open()) < 0) { - debugs(42, 0, "FATAL: pinger: Unable to setup Pinger control sockets."); + debugs(42, DBG_CRITICAL, "FATAL: pinger: Unable to setup Pinger control sockets."); icmp4.Close(); icmp6.Close(); exit(1); // fatal error if the control channel fails. @@ -201,7 +201,7 @@ getCurrentTime(); if (x < 0) { - debugs(42, 0, HERE << " FATAL Shutdown. select()==" << x << ", ERR: " << xstrerror()); + debugs(42, DBG_CRITICAL, HERE << " FATAL Shutdown. select()==" << x << ", ERR: " << xstrerror()); control.Close(); exit(1); } @@ -219,7 +219,7 @@ if (PINGER_TIMEOUT + last_check_time < squid_curtime) { if (send(LINK_TO_SQUID, &tv, 0, 0) < 0) { - debugs(42, 0, "pinger: Closing. No requests in last " << PINGER_TIMEOUT << " seconds."); + debugs(42, DBG_CRITICAL, "pinger: Closing. No requests in last " << PINGER_TIMEOUT << " seconds."); control.Close(); exit(1); } === modified file 'src/icp_v2.cc' --- src/icp_v2.cc 2012-07-23 07:02:06 +0000 +++ src/icp_v2.cc 2012-08-02 21:18:43 +0000 @@ -506,8 +506,8 @@ _icp_common_t::handleReply(char *buf, Ip::Address &from) { if (neighbors_do_private_keys && reqnum == 0) { - debugs(12, 0, "icpHandleIcpV2: Neighbor " << from << " returned reqnum = 0"); - debugs(12, 0, "icpHandleIcpV2: Disabling use of private keys"); + debugs(12, DBG_CRITICAL, "icpHandleIcpV2: Neighbor " << from << " returned reqnum = 0"); + debugs(12, DBG_CRITICAL, "icpHandleIcpV2: Disabling use of private keys"); neighbors_do_private_keys = 0; } @@ -562,7 +562,7 @@ break; default: - debugs(12, 0, "icpHandleIcpV2: UNKNOWN OPCODE: " << header.opcode << " from " << from); + debugs(12, DBG_CRITICAL, "icpHandleIcpV2: UNKNOWN OPCODE: " << header.opcode << " from " << from); break; } @@ -621,7 +621,7 @@ if (errno != ECONNREFUSED && errno != EHOSTUNREACH) #endif - debugs(50, 1, "icpHandleUdp: FD " << sock << " recvfrom: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "icpHandleUdp: FD " << sock << " recvfrom: " << xstrerror()); break; } @@ -652,7 +652,7 @@ else if (icp_version == ICP_VERSION_3) icpHandleIcpV3(sock, from, buf, len); else - debugs(12, 1, "WARNING: Unused ICP version " << icp_version << + debugs(12, DBG_IMPORTANT, "WARNING: Unused ICP version " << icp_version << " received from " << from); } } === modified file 'src/icp_v3.cc' --- src/icp_v3.cc 2012-01-20 18:55:04 +0000 +++ src/icp_v3.cc 2012-08-02 21:18:43 +0000 @@ -150,7 +150,7 @@ break; default: - debugs(12, 0, "icpHandleIcpV3: UNKNOWN OPCODE: " << header.opcode << " from " << from); + debugs(12, DBG_CRITICAL, "icpHandleIcpV3: UNKNOWN OPCODE: " << header.opcode << " from " << from); break; } } === modified file 'src/ip/Address.cc' --- src/ip/Address.cc 2012-07-25 22:29:21 +0000 +++ src/ip/Address.cc 2012-08-02 21:18:43 +0000 @@ -353,7 +353,7 @@ return GetReverseString6(buf, m_SocketAddr.sin6_addr); } - debugs(14,0, "Unable to convert '" << NtoA(buf,MAX_IPSTRLEN) << "' to the rDNS type requested."); + debugs(14, DBG_CRITICAL, "Unable to convert '" << NtoA(buf,MAX_IPSTRLEN) << "' to the rDNS type requested."); buf[0] = '\0'; @@ -858,7 +858,7 @@ GetInAddr(tmp); inet_ntop(AF_INET, &tmp, buf, blen); } else { - debugs(14,0,"WARNING: Corrupt IP Address details OR required to display in unknown format (" << + debugs(14, DBG_CRITICAL, "WARNING: Corrupt IP Address details OR required to display in unknown format (" << force << "). accepted={" << AF_UNSPEC << "," << AF_INET << "," << AF_INET6 << "}"); fprintf(stderr,"WARNING: Corrupt IP Address details OR required to display in unknown format (%d). accepted={%d,%d,%d} ", force, AF_UNSPEC, AF_INET, AF_INET6); @@ -1032,7 +1032,7 @@ // default: // non-compatible IPv6 Pure Address - debugs(14,1, HERE << "Ip::Address::GetInAddr : Cannot convert non-IPv4 to IPv4. IPA=" << *this); + debugs(14, DBG_IMPORTANT, HERE << "Ip::Address::GetInAddr : Cannot convert non-IPv4 to IPv4. IPA=" << *this); memset(&buf,0xFFFFFFFF,sizeof(struct in_addr)); assert(false); return false; === modified file 'src/ipc.cc' --- src/ipc.cc 2012-07-17 17:38:50 +0000 +++ src/ipc.cc 2012-08-02 21:18:43 +0000 @@ -138,14 +138,14 @@ int c2p[2]; if (pipe(p2c) < 0) { - debugs(54, 0, "ipcCreate: pipe: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: pipe: " << xstrerror()); return -1; // maybe ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } fd_open(prfd = p2c[0], FD_PIPE, "IPC FIFO Parent Read"); fd_open(cwfd = p2c[1], FD_PIPE, "IPC FIFO Child Write"); if (pipe(c2p) < 0) { - debugs(54, 0, "ipcCreate: pipe: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: pipe: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } fd_open(crfd = c2p[0], FD_PIPE, "IPC FIFO Child Read"); @@ -161,7 +161,7 @@ int buflen = 32768; if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) { - debugs(54, 0, "ipcCreate: socketpair: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: socketpair: " << xstrerror()); return -1; } @@ -178,7 +178,7 @@ int fds[2]; if (socketpair(AF_UNIX, SOCK_DGRAM, 0, fds) < 0) { - debugs(54, 0, "ipcCreate: socketpair: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: socketpair: " << xstrerror()); return -1; } @@ -203,7 +203,7 @@ if (getsockname(pwfd, AI->ai_addr, &AI->ai_addrlen) < 0) { PaS.FreeAddrInfo(AI); - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -217,7 +217,7 @@ if (getsockname(crfd, AI->ai_addr, &AI->ai_addrlen) < 0) { ChS.FreeAddrInfo(AI); - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -231,7 +231,7 @@ if (type == IPC_TCP_SOCKET) { if (listen(crfd, 1) < 0) { - debugs(54, 1, "ipcCreate: listen FD " << crfd << ": " << xstrerror()); + debugs(54, DBG_IMPORTANT, "ipcCreate: listen FD " << crfd << ": " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -242,7 +242,7 @@ logsFlush(); if ((pid = fork()) < 0) { - debugs(54, 1, "ipcCreate: fork: " << xstrerror()); + debugs(54, DBG_IMPORTANT, "ipcCreate: fork: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -268,13 +268,13 @@ x = read(prfd, hello_buf, HELLO_BUF_SZ - 1); if (x < 0) { - debugs(54, 0, "ipcCreate: PARENT: hello read test failed"); - debugs(54, 0, "--> read: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: hello read test failed"); + debugs(54, DBG_CRITICAL, "--> read: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } else if (strcmp(hello_buf, hello_string)) { - debugs(54, 0, "ipcCreate: PARENT: hello read test failed"); - debugs(54, 0, "--> read returned " << x); - debugs(54, 0, "--> got '" << rfc1738_escape(hello_buf) << "'"); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: hello read test failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(hello_buf) << "'"); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -319,7 +319,7 @@ debugs(54, 3, "ipcCreate: calling accept on FD " << crfd); if ((fd = accept(crfd, NULL, NULL)) < 0) { - debugs(54, 0, "ipcCreate: FD " << crfd << " accept: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: FD " << crfd << " accept: " << xstrerror()); _exit(1); } @@ -335,14 +335,14 @@ x = comm_udp_send(cwfd, hello_string, strlen(hello_string) + 1, 0); if (x < 0) { - debugs(54, 0, "sendto FD " << cwfd << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: hello write test failed"); + debugs(54, DBG_CRITICAL, "sendto FD " << cwfd << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: hello write test failed"); _exit(1); } } else { if (write(cwfd, hello_string, strlen(hello_string) + 1) < 0) { - debugs(54, 0, "write FD " << cwfd << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: hello write test failed"); + debugs(54, DBG_CRITICAL, "write FD " << cwfd << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: hello write test failed"); _exit(1); } } @@ -400,7 +400,7 @@ debug_log = fdopen(2, "a+"); - debugs(54, 0, "ipcCreate: " << prog << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: " << prog << ": " << xstrerror()); _exit(1); === modified file 'src/ipc/Coordinator.cc' --- src/ipc/Coordinator.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/Coordinator.cc 2012-08-02 21:10:18 +0000 @@ -124,7 +124,7 @@ #endif default: - debugs(54, 1, HERE << "Unhandled message type: " << message.type()); + debugs(54, DBG_IMPORTANT, HERE << "Unhandled message type: " << message.type()); break; } } === modified file 'src/ipc/FdNotes.cc' --- src/ipc/FdNotes.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/FdNotes.cc 2012-08-02 21:10:18 +0000 @@ -28,6 +28,6 @@ if (fdnNone < fdNoteId && fdNoteId < fdnEnd) return FdNotes[fdNoteId]; - debugs(54, 1, HERE << "salvaged bug: wrong fd_note ID: " << fdNoteId); + debugs(54, DBG_IMPORTANT, HERE << "salvaged bug: wrong fd_note ID: " << fdNoteId); return FdNotes[fdnNone]; } === modified file 'src/ipc/Queue.cc' --- src/ipc/Queue.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/Queue.cc 2012-08-02 06:19:48 +0000 @@ -51,7 +51,12 @@ Ipc::QueueReaders::QueueReaders(const int aCapacity): theCapacity(aCapacity) { Must(theCapacity > 0); - new (theReaders) QueueReader[theCapacity]; + theReaders=new QueueReader[theCapacity]; +} + +Ipc::QueueReaders::~QueueReaders() +{ + delete[] theReaders; } size_t === modified file 'src/ipc/Queue.h' --- src/ipc/Queue.h 2011-10-28 01:01:41 +0000 +++ src/ipc/Queue.h 2012-08-02 06:19:48 +0000 @@ -64,11 +64,16 @@ { public: QueueReaders(const int aCapacity); + ~QueueReaders(); size_t sharedMemorySize() const; static size_t SharedMemorySize(const int capacity); const int theCapacity; /// number of readers - QueueReader theReaders[]; /// readers + QueueReader *theReaders; /// readers +private: + QueueReaders(); //not implemented + QueueReaders& operator =(const QueueReaders&); //not implemented + QueueReaders(const QueueReaders&); //not implemented }; /** === modified file 'src/ipc/StoreMap.cc' --- src/ipc/StoreMap.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/StoreMap.cc 2012-08-02 06:19:48 +0000 @@ -308,6 +308,12 @@ Ipc::StoreMap::Shared::Shared(const int aLimit, const size_t anExtrasSize): limit(aLimit), extrasSize(anExtrasSize), count(0) { + slots=new Slot[limit]; +} + +Ipc::StoreMap::Shared::~Shared() +{ + delete[] slots; } size_t === modified file 'src/ipc/StoreMap.h' --- src/ipc/StoreMap.h 2011-12-07 18:56:59 +0000 +++ src/ipc/StoreMap.h 2012-08-02 06:19:48 +0000 @@ -62,11 +62,16 @@ Shared(const int aLimit, const size_t anExtrasSize); size_t sharedMemorySize() const; static size_t SharedMemorySize(const int limit, const size_t anExtrasSize); + ~Shared(); const int limit; ///< maximum number of map slots const size_t extrasSize; ///< size of slot extra data Atomic::Word count; ///< current number of map slots - Slot slots[]; ///< slots storage + Slot *slots; ///< slots storage + private: + Shared(); //disabled + Shared &operator=(const Shared&); //disabled + Shared(const Shared&); //disabled }; public: === modified file 'src/ipc/Strand.cc' --- src/ipc/Strand.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/Strand.cc 2012-08-02 21:10:18 +0000 @@ -106,7 +106,7 @@ #endif default: - debugs(54, 1, HERE << "Unhandled message type: " << message.type()); + debugs(54, DBG_IMPORTANT, HERE << "Unhandled message type: " << message.type()); break; } } === modified file 'src/ipc/mem/PageStack.cc' --- src/ipc/mem/PageStack.cc 2012-01-20 18:55:04 +0000 +++ src/ipc/mem/PageStack.cc 2012-08-02 06:19:48 +0000 @@ -23,6 +23,12 @@ // initially, all pages are free for (Offset i = 0; i < theSize; ++i) theItems[i] = i + 1; // skip page number zero to keep numbers positive + theItems=new Item[theSize]; +} + +Ipc::Mem::PageStack::~PageStack() +{ + delete[] theItems; } /* === modified file 'src/ipc/mem/PageStack.h' --- src/ipc/mem/PageStack.h 2011-10-28 01:01:41 +0000 +++ src/ipc/mem/PageStack.h 2012-08-02 06:19:48 +0000 @@ -25,6 +25,7 @@ typedef uint32_t Value; ///< stack item type (a free page number) PageStack(const uint32_t aPoolId, const unsigned int aCapacity, const size_t aPageSize); + ~PageStack(); unsigned int capacity() const { return theCapacity; } size_t pageSize() const { return thePageSize; } @@ -67,7 +68,7 @@ Atomic::WordT theFirstWritable; typedef Atomic::WordT Item; - Item theItems[]; ///< page number storage + Item *theItems; ///< page number storage }; } // namespace Mem === modified file 'src/ipc_win32.cc' --- src/ipc_win32.cc 2012-07-23 19:37:47 +0000 +++ src/ipc_win32.cc 2012-08-02 21:18:43 +0000 @@ -167,7 +167,7 @@ 0, name); } else if (type == IPC_FIFO) { - debugs(54, 0, "ipcCreate: " << prog << ": use IPC_TCP_SOCKET instead of IP_FIFO on Windows"); + debugs(54, DBG_CRITICAL, "ipcCreate: " << prog << ": use IPC_TCP_SOCKET instead of IP_FIFO on Windows"); assert(0); } else { assert(IPC_NONE); @@ -185,12 +185,12 @@ } if (crfd < 0) { - debugs(54, 0, "ipcCreate: Failed to create child FD."); + debugs(54, DBG_CRITICAL, "ipcCreate: Failed to create child FD."); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } if (pwfd < 0) { - debugs(54, 0, "ipcCreate: Failed to create server FD."); + debugs(54, DBG_CRITICAL, "ipcCreate: Failed to create server FD."); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -200,7 +200,7 @@ tmp_addr.InitAddrInfo(aiPS); if (getsockname(pwfd, aiPS->ai_addr, &(aiPS->ai_addrlen) ) < 0) { - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -211,7 +211,7 @@ tmp_addr.InitAddrInfo(aiCS); if (getsockname(crfd, aiCS->ai_addr, &(aiCS->ai_addrlen) ) < 0) { - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -223,7 +223,7 @@ if (type == IPC_TCP_SOCKET) { if (listen(crfd, 1) < 0) { - debugs(54, 1, "ipcCreate: listen FD " << crfd << ": " << xstrerror()); + debugs(54, DBG_IMPORTANT, "ipcCreate: listen FD " << crfd << ": " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -250,7 +250,7 @@ thread = _beginthreadex(NULL, 0, ipc_thread_1, ¶ms, 0, NULL); if (thread == 0) { - debugs(54, 1, "ipcCreate: _beginthread: " << xstrerror()); + debugs(54, DBG_IMPORTANT, "ipcCreate: _beginthread: " << xstrerror()); return ipcCloseAllFD(prfd, pwfd, crfd, cwfd); } @@ -264,14 +264,14 @@ x = recv(prfd, (void *)hello_buf, HELLO_BUF_SZ - 1, 0); if (x < 0) { - debugs(54, 0, "ipcCreate: PARENT: hello read test failed"); - debugs(54, 0, "--> read: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: hello read test failed"); + debugs(54, DBG_CRITICAL, "--> read: " << xstrerror()); CloseHandle((HANDLE) thread); return ipcCloseAllFD(prfd, pwfd, -1, -1); } else if (strcmp(hello_buf, hello_string)) { - debugs(54, 0, "ipcCreate: PARENT: hello read test failed"); - debugs(54, 0, "--> read returned " << x); - debugs(54, 0, "--> got '" << rfc1738_escape(hello_buf) << "'"); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: hello read test failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(hello_buf) << "'"); CloseHandle((HANDLE) thread); return ipcCloseAllFD(prfd, pwfd, -1, -1); } @@ -279,8 +279,8 @@ x = send(pwfd, (const void *)ok_string, strlen(ok_string), 0); if (x < 0) { - debugs(54, 0, "ipcCreate: PARENT: OK write test failed"); - debugs(54, 0, "--> read: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: OK write test failed"); + debugs(54, DBG_CRITICAL, "--> read: " << xstrerror()); CloseHandle((HANDLE) thread); return ipcCloseAllFD(prfd, pwfd, -1, -1); } @@ -289,14 +289,14 @@ x = recv(prfd, (void *)hello_buf, HELLO_BUF_SZ - 1, 0); if (x < 0) { - debugs(54, 0, "ipcCreate: PARENT: OK read test failed"); - debugs(54, 0, "--> read: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: OK read test failed"); + debugs(54, DBG_CRITICAL, "--> read: " << xstrerror()); CloseHandle((HANDLE) thread); return ipcCloseAllFD(prfd, pwfd, -1, -1); } else if (!strcmp(hello_buf, err_string)) { - debugs(54, 0, "ipcCreate: PARENT: OK read test failed"); - debugs(54, 0, "--> read returned " << x); - debugs(54, 0, "--> got '" << rfc1738_escape(hello_buf) << "'"); + debugs(54, DBG_CRITICAL, "ipcCreate: PARENT: OK read test failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(hello_buf) << "'"); CloseHandle((HANDLE) thread); return ipcCloseAllFD(prfd, pwfd, -1, -1); } @@ -353,8 +353,8 @@ x = send(cwfd, (const void *)buf, len, 0); if (x < 0) { - debugs(54, 0, "sendto FD " << cwfd << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: hello write test failed"); + debugs(54, DBG_CRITICAL, "sendto FD " << cwfd << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: hello write test failed"); } return x; @@ -409,7 +409,7 @@ debugs(54, 3, "ipcCreate: calling accept on FD " << crfd); if ((fd = accept(crfd, NULL, NULL)) < 0) { - debugs(54, 0, "ipcCreate: FD " << crfd << " accept: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: FD " << crfd << " accept: " << xstrerror()); goto cleanup; } @@ -427,8 +427,8 @@ x = send(cwfd, (const void *)hello_string, strlen(hello_string) + 1, 0); if (x < 0) { - debugs(54, 0, "sendto FD " << cwfd << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: hello write test failed"); + debugs(54, DBG_CRITICAL, "sendto FD " << cwfd << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: hello write test failed"); goto cleanup; } @@ -437,25 +437,25 @@ x = recv(crfd, (void *)buf1, 8191, 0); if (x < 0) { - debugs(54, 0, "ipcCreate: CHILD: OK read test failed"); - debugs(54, 0, "--> read: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: OK read test failed"); + debugs(54, DBG_CRITICAL, "--> read: " << xstrerror()); goto cleanup; } else if (strcmp(buf1, ok_string)) { - debugs(54, 0, "ipcCreate: CHILD: OK read test failed"); - debugs(54, 0, "--> read returned " << x); - debugs(54, 0, "--> got '" << rfc1738_escape(hello_buf) << "'"); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: OK read test failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(hello_buf) << "'"); goto cleanup; } /* assign file descriptors to child process */ if (_pipe(p2c, 1024, _O_BINARY | _O_NOINHERIT) < 0) { - debugs(54, 0, "ipcCreate: CHILD: pipe: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: pipe: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } if (_pipe(c2p, 1024, _O_BINARY | _O_NOINHERIT) < 0) { - debugs(54, 0, "ipcCreate: CHILD: pipe: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: pipe: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -465,7 +465,7 @@ crfd_ipc = cwfd_ipc = comm_open(SOCK_DGRAM, IPPROTO_UDP, local_addr, 0, buf1); if (crfd_ipc < 0) { - debugs(54, 0, "ipcCreate: CHILD: Failed to create child FD for " << prog << "."); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: Failed to create child FD for " << prog << "."); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -474,7 +474,7 @@ prfd_ipc = pwfd_ipc = comm_open(SOCK_DGRAM, IPPROTO_UDP, local_addr, 0, buf1); if (pwfd_ipc < 0) { - debugs(54, 0, "ipcCreate: CHILD: Failed to create server FD for " << prog << "."); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: Failed to create server FD for " << prog << "."); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -482,7 +482,7 @@ PS_ipc.InitAddrInfo(aiPS_ipc); if (getsockname(pwfd_ipc, aiPS_ipc->ai_addr, &(aiPS_ipc->ai_addrlen)) < 0) { - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -494,7 +494,7 @@ CS_ipc.InitAddrInfo(aiCS_ipc); if (getsockname(crfd_ipc, aiCS_ipc->ai_addr, &(aiCS_ipc->ai_addrlen)) < 0) { - debugs(54, 0, "ipcCreate: getsockname: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: getsockname: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -589,7 +589,7 @@ if (pid == -1) { errno = x; - debugs(54, 0, "ipcCreate: CHILD: " << params->prog << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << params->prog << ": " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; @@ -601,7 +601,7 @@ memset(&wpi, 0, sizeof(wpi)); if (SOCKET_ERROR == WSADuplicateSocket(crfd_ipc, pid, &wpi)) { - debugs(54, 0, "ipcCreate: CHILD: WSADuplicateSocket: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: WSADuplicateSocket: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; @@ -610,8 +610,8 @@ x = write(c2p[1], (const char *) &wpi, sizeof(wpi)); if (x < (ssize_t)sizeof(wpi)) { - debugs(54, 0, "ipcCreate: CHILD: write FD " << c2p[1] << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: write FD " << c2p[1] << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; @@ -620,16 +620,16 @@ x = read(p2c[0], buf1, 8192); if (x < 0) { - debugs(54, 0, "ipcCreate: CHILD: read FD " << p2c[0] << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: read FD " << p2c[0] << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } else if (strncmp(buf1, ok_string, strlen(ok_string))) { - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); - debugs(54, 0, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); buf1[x] = '\0'; - debugs(54, 0, "--> got '" << rfc1738_escape(buf1) << "'"); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(buf1) << "'"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -637,8 +637,8 @@ x = write(c2p[1], (const char *) &PS_ipc, sizeof(PS_ipc)); if (x < (ssize_t)sizeof(PS_ipc)) { - debugs(54, 0, "ipcCreate: CHILD: write FD " << c2p[1] << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: write FD " << c2p[1] << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; @@ -647,16 +647,16 @@ x = read(p2c[0], buf1, 8192); if (x < 0) { - debugs(54, 0, "ipcCreate: CHILD: read FD " << p2c[0] << ": " << xstrerror()); - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: read FD " << p2c[0] << ": " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } else if (strncmp(buf1, ok_string, strlen(ok_string))) { - debugs(54, 0, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); - debugs(54, 0, "--> read returned " << x); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: " << prog << ": socket exchange failed"); + debugs(54, DBG_CRITICAL, "--> read returned " << x); buf1[x] = '\0'; - debugs(54, 0, "--> got '" << rfc1738_escape(buf1) << "'"); + debugs(54, DBG_CRITICAL, "--> got '" << rfc1738_escape(buf1) << "'"); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -695,7 +695,7 @@ thread = (HANDLE)_beginthreadex(NULL, 0, ipc_thread_2, &thread_params, 0, NULL); if (!thread) { - debugs(54, 0, "ipcCreate: CHILD: _beginthreadex: " << xstrerror()); + debugs(54, DBG_CRITICAL, "ipcCreate: CHILD: _beginthreadex: " << xstrerror()); ipcSend(cwfd, err_string, strlen(err_string)); goto cleanup; } @@ -761,14 +761,14 @@ WaitForSingleObject(hProcess, type == IPC_UDP_SOCKET ? 12000 : 5000)) { getCurrentTime(); - debugs(54, 0, "ipc(" << prog << "," << pid << "): WARNING: " << prog << + debugs(54, DBG_CRITICAL, "ipc(" << prog << "," << pid << "): WARNING: " << prog << " didn't exit in " << (type == IPC_UDP_SOCKET ? 12 : 5) << " seconds."); } if (thread && WAIT_OBJECT_0 != WaitForSingleObject(thread, 3000)) { getCurrentTime(); - debugs(54, 0, "ipc(" << prog << "," << pid << "): WARNING: ipc_thread_2 didn't exit in 3 seconds."); + debugs(54, DBG_CRITICAL, "ipc(" << prog << "," << pid << "): WARNING: ipc_thread_2 didn't exit in 3 seconds."); } === modified file 'src/ipcache.cc' --- src/ipcache.cc 2012-07-20 15:31:04 +0000 +++ src/ipcache.cc 2012-08-02 21:18:43 +0000 @@ -186,12 +186,12 @@ ipcacheRelease(ipcache_entry * i, bool dofree) { if (!i) { - debugs(14, 0, "ipcacheRelease: Releasing entry with i="); + debugs(14, DBG_CRITICAL, "ipcacheRelease: Releasing entry with i="); return; } if (!i || !i->hash.key) { - debugs(14, 0, "ipcacheRelease: Releasing entry without hash link!"); + debugs(14, DBG_CRITICAL, "ipcacheRelease: Releasing entry without hash link!"); return; } @@ -371,7 +371,7 @@ i->addrs.count = 0; if (inbuf == NULL) { - debugs(14, 1, "ipcacheParse: Got reply"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: Got reply"); i->error_message = xstrdup("Internal Error"); return -1; } @@ -381,7 +381,7 @@ token = strtok(buf, w_space); if (NULL == token) { - debugs(14, 1, "ipcacheParse: expecting result, got '" << inbuf << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: expecting result, got '" << inbuf << "'"); i->error_message = xstrdup("Internal Error"); return -1; @@ -395,7 +395,7 @@ } if (0 != strcmp(token, "$addr")) { - debugs(14, 1, "ipcacheParse: expecting '$addr', got '" << inbuf << "' in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: expecting '$addr', got '" << inbuf << "' in response to '" << name << "'"); i->error_message = xstrdup("Internal Error"); return -1; @@ -404,7 +404,7 @@ token = strtok(NULL, w_space); if (NULL == token) { - debugs(14, 1, "ipcacheParse: expecting TTL, got '" << inbuf << "' in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: expecting TTL, got '" << inbuf << "' in response to '" << name << "'"); i->error_message = xstrdup("Internal Error"); return -1; @@ -432,14 +432,14 @@ if ( i->addrs.in_addrs[j] = A[k] ) ++j; else - debugs(14, 1, "ipcacheParse: Invalid IP address '" << A[k] << "' in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: Invalid IP address '" << A[k] << "' in response to '" << name << "'"); } i->addrs.count = (unsigned char) j; } if (i->addrs.count <= 0) { - debugs(14, 1, "ipcacheParse: No addresses in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: No addresses in response to '" << name << "'"); return -1; } @@ -496,7 +496,7 @@ if (Ip::EnableIpv6 && answers[k].type == RFC1035_TYPE_AAAA) { if (answers[k].rdlength != sizeof(struct in6_addr)) { - debugs(14, 1, "ipcacheParse: Invalid IPv6 address in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: Invalid IPv6 address in response to '" << name << "'"); continue; } ++na; @@ -506,7 +506,7 @@ if (answers[k].type == RFC1035_TYPE_A) { if (answers[k].rdlength != sizeof(struct in_addr)) { - debugs(14, 1, "ipcacheParse: Invalid IPv4 address in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: Invalid IPv4 address in response to '" << name << "'"); continue; } ++na; @@ -525,7 +525,7 @@ debugs(14, 9, HERE << "Unknown RR type received: type=" << answers[k].type << " starting at " << &(answers[k]) ); } if (na == 0) { - debugs(14, 1, "ipcacheParse: No Address records in response to '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheParse: No Address records in response to '" << name << "'"); i->error_message = xstrdup("No Address records"); if (cname_found) ++IpcacheStats.cname_only; @@ -805,12 +805,12 @@ char buf[MAX_IPSTRLEN]; if (!sentry) { - debugs(14, 0, HERE << "CRITICAL: sentry is NULL!"); + debugs(14, DBG_CRITICAL, HERE << "CRITICAL: sentry is NULL!"); return; } if (!i) { - debugs(14, 0, HERE << "CRITICAL: ipcache_entry is NULL!"); + debugs(14, DBG_CRITICAL, HERE << "CRITICAL: ipcache_entry is NULL!"); storeAppendPrintf(sentry, "CRITICAL ERROR\n"); return; } @@ -983,7 +983,7 @@ ipcacheUnlockEntry(ipcache_entry * i) { if (i->locks < 1) { - debugs(14, 1, "WARNING: ipcacheEntry unlocked with no lock! locks=" << i->locks); + debugs(14, DBG_IMPORTANT, "WARNING: ipcacheEntry unlocked with no lock! locks=" << i->locks); return; } @@ -1188,7 +1188,7 @@ if (strchr(ipaddr, ':') && strspn(ipaddr, "0123456789abcdefABCDEF:") == strlen(ipaddr)) { debugs(14, 3, "ipcacheAddEntryFromHosts: Skipping IPv6 address '" << ipaddr << "'"); } else { - debugs(14, 1, "ipcacheAddEntryFromHosts: Bad IP address '" << ipaddr << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheAddEntryFromHosts: Bad IP address '" << ipaddr << "'"); } return 1; @@ -1198,7 +1198,7 @@ if (1 == i->flags.fromhosts) { ipcacheUnlockEntry(i); } else if (i->locks > 0) { - debugs(14, 1, "ipcacheAddEntryFromHosts: can't add static entry for locked name '" << name << "'"); + debugs(14, DBG_IMPORTANT, "ipcacheAddEntryFromHosts: can't add static entry for locked name '" << name << "'"); return 1; } else { ipcacheRelease(i); === modified file 'src/log/File.cc' --- src/log/File.cc 2012-07-13 10:48:12 +0000 +++ src/log/File.cc 2012-08-02 21:10:18 +0000 @@ -49,7 +49,7 @@ int ret; const char *patharg; - debugs(50, 1, "Logfile: opening log " << path); + debugs(50, DBG_IMPORTANT, "Logfile: opening log " << path); CBDATA_INIT_TYPE(Logfile); Logfile *lf = cbdataAlloc(Logfile); @@ -82,7 +82,7 @@ if (fatal_flag) fatalf("logfileOpen: %s: couldn't open!\n", path); else - debugs(50, 1, "logfileOpen: " << path << ": couldn't open!"); + debugs(50, DBG_IMPORTANT, "logfileOpen: " << path << ": couldn't open!"); lf->f_close(lf); cbdataFree(lf); return NULL; @@ -100,7 +100,7 @@ void logfileClose(Logfile * lf) { - debugs(50, 1, "Logfile: closing log " << lf->path); + debugs(50, DBG_IMPORTANT, "Logfile: closing log " << lf->path); lf->f_flush(lf); lf->f_close(lf); cbdataFree(lf); @@ -109,7 +109,7 @@ void logfileRotate(Logfile * lf) { - debugs(50, 1, "logfileRotate: " << lf->path); + debugs(50, DBG_IMPORTANT, "logfileRotate: " << lf->path); lf->f_rotate(lf); } === modified file 'src/log/ModDaemon.cc' --- src/log/ModDaemon.cc 2012-07-20 15:31:04 +0000 +++ src/log/ModDaemon.cc 2012-08-02 21:10:18 +0000 @@ -238,7 +238,7 @@ lf->f_rotate = logfile_mod_daemon_rotate; cbdataInternalLock(lf); // WTF? - debugs(50, 1, "Logfile Daemon: opening log " << path); + debugs(50, DBG_IMPORTANT, "Logfile Daemon: opening log " << path); ll = static_cast(xcalloc(1, sizeof(*ll))); lf->data = ll; ll->eol = 1; @@ -270,7 +270,7 @@ logfile_mod_daemon_close(Logfile * lf) { l_daemon_t *ll = static_cast(lf->data); - debugs(50, 1, "Logfile Daemon: closing log " << lf->path); + debugs(50, DBG_IMPORTANT, "Logfile Daemon: closing log " << lf->path); logfileFlush(lf); if (ll->rfd == ll->wfd) comm_close(ll->rfd); @@ -289,7 +289,7 @@ logfile_mod_daemon_rotate(Logfile * lf) { char tb[3]; - debugs(50, 1, "logfileRotate: " << lf->path); + debugs(50, DBG_IMPORTANT, "logfileRotate: " << lf->path); tb[0] = 'R'; tb[1] = '\n'; tb[2] = '\0'; === modified file 'src/log/ModSyslog.cc' --- src/log/ModSyslog.cc 2012-07-23 15:34:12 +0000 +++ src/log/ModSyslog.cc 2012-08-02 21:10:18 +0000 @@ -108,7 +108,7 @@ if (!strcmp(s, p->name) || !strcasecmp(s, p->name + 4)) return p->value; - debugs(1, 1, "Unknown syslog facility/priority '" << s << "'"); + debugs(1, DBG_IMPORTANT, "Unknown syslog facility/priority '" << s << "'"); return 0; } === modified file 'src/log/ModTcp.cc' --- src/log/ModTcp.cc 2012-01-20 18:55:04 +0000 +++ src/log/ModTcp.cc 2012-08-02 21:10:18 +0000 @@ -63,10 +63,10 @@ fd_bytes(ll->fd, s, FD_WRITE); #if 0 if (s < 0) { - debugs(1, 1, "logfile (tcp): got errno (" << errno << "):" << xstrerror()); + debugs(1, DBG_IMPORTANT, "logfile (tcp): got errno (" << errno << "):" << xstrerror()); } if (s != len) { - debugs(1, 1, "logfile (tcp): len=" << len << ", wrote=" << s); + debugs(1, DBG_IMPORTANT, "logfile (tcp): len=" << len << ", wrote=" << s); } #endif === modified file 'src/log/ModUdp.cc' --- src/log/ModUdp.cc 2012-01-20 18:55:04 +0000 +++ src/log/ModUdp.cc 2012-08-02 21:10:18 +0000 @@ -61,10 +61,10 @@ fd_bytes(ll->fd, s, FD_WRITE); #if 0 if (s < 0) { - debugs(1, 1, "logfile (udp): got errno (" << errno << "):" << xstrerror()); + debugs(1, DBG_IMPORTANT, "logfile (udp): got errno (" << errno << "):" << xstrerror()); } if (s != len) { - debugs(1, 1, "logfile (udp): len=" << len << ", wrote=" << s); + debugs(1, DBG_IMPORTANT, "logfile (udp): len=" << len << ", wrote=" << s); } #endif === modified file 'src/log/access_log.cc' --- src/log/access_log.cc 2012-07-23 07:02:06 +0000 +++ src/log/access_log.cc 2012-08-02 21:10:18 +0000 @@ -362,7 +362,7 @@ if (mcast_miss_fd < 0) fatal("Cannot open Multicast Miss Stream Socket"); - debugs(46, 1, "Multicast Miss Stream Socket opened on FD " << mcast_miss_fd); + debugs(46, DBG_IMPORTANT, "Multicast Miss Stream Socket opened on FD " << mcast_miss_fd); mcastSetTtl(mcast_miss_fd, Config.mcast_miss.ttl); === modified file 'src/main.cc' --- src/main.cc 2012-06-01 07:44:48 +0000 +++ src/main.cc 2012-08-02 21:18:43 +0000 @@ -236,8 +236,8 @@ void SignalEngine::doShutdown(time_t wait) { - debugs(1, 1, "Preparing for shutdown after " << statCounter.client_http.requests << " requests"); - debugs(1, 1, "Waiting " << wait << " seconds for active connections to finish"); + debugs(1, DBG_IMPORTANT, "Preparing for shutdown after " << statCounter.client_http.requests << " requests"); + debugs(1, DBG_IMPORTANT, "Waiting " << wait << " seconds for active connections to finish"); shutting_down = 1; @@ -724,7 +724,7 @@ static void mainReconfigureStart(void) { - debugs(1, 1, "Reconfiguring Squid Cache (version " << version_string << ")..."); + debugs(1, DBG_IMPORTANT, "Reconfiguring Squid Cache (version " << version_string << ")..."); reconfiguring = 1; // Initiate asynchronous closing sequence @@ -910,10 +910,10 @@ #endif if (geteuid() == 0) { - debugs(0, 0, "Squid is not safe to run as root! If you must"); - debugs(0, 0, "start Squid as root, then you must configure"); - debugs(0, 0, "it to run as a non-priveledged user with the"); - debugs(0, 0, "'cache_effective_user' option in the config file."); + debugs(0, DBG_CRITICAL, "Squid is not safe to run as root! If you must"); + debugs(0, DBG_CRITICAL, "start Squid as root, then you must configure"); + debugs(0, DBG_CRITICAL, "it to run as a non-priveledged user with the"); + debugs(0, DBG_CRITICAL, "'cache_effective_user' option in the config file."); fatal("Don't run Squid as root, set 'cache_effective_user'!"); } } @@ -927,18 +927,18 @@ if (0 == strcmp("none", Config.coredump_dir)) { (void) 0; } else if (chdir(Config.coredump_dir) == 0) { - debugs(0, 1, "Set Current Directory to " << Config.coredump_dir); + debugs(0, DBG_IMPORTANT, "Set Current Directory to " << Config.coredump_dir); return; } else { - debugs(50, 0, "chdir: " << Config.coredump_dir << ": " << xstrerror()); + debugs(50, DBG_CRITICAL, "chdir: " << Config.coredump_dir << ": " << xstrerror()); } } /* If we don't have coredump_dir or couldn't cd there, report current dir */ if (getcwd(pathbuf, MAXPATHLEN)) { - debugs(0, 1, "Current Directory is " << pathbuf); + debugs(0, DBG_IMPORTANT, "Current Directory is " << pathbuf); } else { - debugs(50, 0, "WARNING: Can't find current directory, getcwd: " << xstrerror()); + debugs(50, DBG_CRITICAL, "WARNING: Can't find current directory, getcwd: " << xstrerror()); } } @@ -974,29 +974,29 @@ #endif - debugs(1, 0, "Starting Squid Cache version " << version_string << " for " << CONFIG_HOST_TYPE << "..."); + debugs(1, DBG_CRITICAL, "Starting Squid Cache version " << version_string << " for " << CONFIG_HOST_TYPE << "..."); #if _SQUID_WINDOWS_ if (WIN32_run_mode == _WIN_SQUID_RUN_MODE_SERVICE) { - debugs(1, 0, "Running as " << WIN32_Service_name << " Windows System Service on " << WIN32_OS_string); - debugs(1, 0, "Service command line is: " << WIN32_Service_Command_Line); + debugs(1, DBG_CRITICAL, "Running as " << WIN32_Service_name << " Windows System Service on " << WIN32_OS_string); + debugs(1, DBG_CRITICAL, "Service command line is: " << WIN32_Service_Command_Line); } else - debugs(1, 0, "Running on " << WIN32_OS_string); + debugs(1, DBG_CRITICAL, "Running on " << WIN32_OS_string); #endif - debugs(1, 1, "Process ID " << getpid()); + debugs(1, DBG_IMPORTANT, "Process ID " << getpid()); - debugs(1, 1, "Process Roles:" << ProcessRoles()); + debugs(1, DBG_IMPORTANT, "Process Roles:" << ProcessRoles()); setSystemLimits(); - debugs(1, 1, "With " << Squid_MaxFD << " file descriptors available"); + debugs(1, DBG_IMPORTANT, "With " << Squid_MaxFD << " file descriptors available"); #if _SQUID_MSWIN_ - debugs(1, 1, "With " << _getmaxstdio() << " CRT stdio descriptors available"); + debugs(1, DBG_IMPORTANT, "With " << _getmaxstdio() << " CRT stdio descriptors available"); if (WIN32_Socks_initialized) - debugs(1, 1, "Windows sockets initialized"); + debugs(1, DBG_IMPORTANT, "Windows sockets initialized"); if (WIN32_OS_version > _WIN_OS_WINNT) { WIN32_IpAddrChangeMonitorInit(); @@ -1428,7 +1428,7 @@ } setEffectiveUser(); - debugs(0, 0, "Creating Swap Directories"); + debugs(0, DBG_CRITICAL, "Creating Swap Directories"); Store::Root().create(); return 0; @@ -1516,7 +1516,7 @@ debug_log = stderr; if (strcmp(Config.pidFilename, "none") == 0) { - debugs(0, 1, "No pid_filename specified. Trusting you know what you are doing."); + debugs(0, DBG_IMPORTANT, "No pid_filename specified. Trusting you know what you are doing."); } pid = readPidFile(); @@ -1628,7 +1628,7 @@ if (kill(pid, 0) < 0) return 0; - debugs(0, 0, "Squid is already running! Process ID " << pid); + debugs(0, DBG_CRITICAL, "Squid is already running! Process ID " << pid); return 1; } @@ -1822,7 +1822,7 @@ WIN32_svcstatusupdate(SERVICE_STOP_PENDING, 10000); #endif - debugs(1, 1, "Shutting down..."); + debugs(1, DBG_IMPORTANT, "Shutting down..."); dnsShutdown(); #if USE_SSL_CRTD Ssl::Helper::GetInstance()->Shutdown(); @@ -1919,7 +1919,7 @@ xmalloc_find_leaks(); - debugs(1, 0, "Memory used after shutdown: " << xmalloc_total); + debugs(1, DBG_CRITICAL, "Memory used after shutdown: " << xmalloc_total); #endif #if MEM_GEN_TRACE @@ -1936,7 +1936,7 @@ } } - debugs(1, 1, "Squid Cache (Version " << version_string << "): Exiting normally."); + debugs(1, DBG_IMPORTANT, "Squid Cache (Version " << version_string << "): Exiting normally."); /* * DPW 2006-10-23 === modified file 'src/mem.cc' --- src/mem.cc 2012-07-23 19:37:47 +0000 +++ src/mem.cc 2012-08-02 21:10:18 +0000 @@ -162,9 +162,9 @@ long int leaked = 0, dubious = 0, reachable = 0, suppressed = 0; stream << "Valgrind Report:\n"; stream << "Type\tAmount\n"; - debugs(13, 1, "Asking valgrind for memleaks"); + debugs(13, DBG_IMPORTANT, "Asking valgrind for memleaks"); VALGRIND_DO_LEAK_CHECK; - debugs(13, 1, "Getting valgrind statistics"); + debugs(13, DBG_IMPORTANT, "Getting valgrind statistics"); VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed); stream << "Leaked\t" << leaked << "\n"; stream << "Dubious\t" << dubious << "\n"; @@ -389,7 +389,7 @@ new_pool_limit = Config.MemPools.limit; else { if (Config.MemPools.limit == 0) - debugs(13, 1, "memory_pools_limit 0 has been chagned to memory_pools_limit none. Please update your config"); + debugs(13, DBG_IMPORTANT, "memory_pools_limit 0 has been chagned to memory_pools_limit none. Please update your config"); new_pool_limit = -1; } @@ -401,7 +401,7 @@ * stderr when doing things like 'squid -k reconfigure' */ if (MemPools::GetInstance().idleLimit() > new_pool_limit) - debugs(13, 1, "Shrinking idle mem pools to "<< std::setprecision(3) << toMB(new_pool_limit) << " MB"); + debugs(13, DBG_IMPORTANT, "Shrinking idle mem pools to "<< std::setprecision(3) << toMB(new_pool_limit) << " MB"); #endif MemPools::GetInstance().setIdleLimit(new_pool_limit); @@ -467,7 +467,7 @@ StrPools[i].pool->zeroOnPush(false); if (StrPools[i].pool->objectSize() != StrPoolsAttrs[i].obj_size) - debugs(13, 1, "Notice: " << StrPoolsAttrs[i].name << " is " << StrPools[i].pool->objectSize() << " bytes instead of requested " << StrPoolsAttrs[i].obj_size << " bytes"); + debugs(13, DBG_IMPORTANT, "Notice: " << StrPoolsAttrs[i].name << " is " << StrPools[i].pool->objectSize() << " bytes instead of requested " << StrPoolsAttrs[i].obj_size << " bytes"); } MemIsInitialized = true; === modified file 'src/mime.cc' --- src/mime.cc 2012-01-20 18:55:04 +0000 +++ src/mime.cc 2012-08-02 21:18:43 +0000 @@ -276,7 +276,7 @@ return; if ((fp = fopen(filename, "r")) == NULL) { - debugs(25, 1, "mimeInit: " << filename << ": " << xstrerror()); + debugs(25, DBG_IMPORTANT, "mimeInit: " << filename << ": " << xstrerror()); return; } @@ -302,27 +302,27 @@ xstrncpy(chopbuf, buf, BUFSIZ); if ((pattern = strtok(chopbuf, w_space)) == NULL) { - debugs(25, 1, "mimeInit: parse error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: parse error: '" << buf << "'"); continue; } if ((type = strtok(NULL, w_space)) == NULL) { - debugs(25, 1, "mimeInit: parse error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: parse error: '" << buf << "'"); continue; } if ((icon = strtok(NULL, w_space)) == NULL) { - debugs(25, 1, "mimeInit: parse error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: parse error: '" << buf << "'"); continue; } if ((encoding = strtok(NULL, w_space)) == NULL) { - debugs(25, 1, "mimeInit: parse error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: parse error: '" << buf << "'"); continue; } if ((mode = strtok(NULL, w_space)) == NULL) { - debugs(25, 1, "mimeInit: parse error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: parse error: '" << buf << "'"); continue; } @@ -335,11 +335,11 @@ else if (!strcmp(option, "+view")) view_option = 1; else - debugs(25, 1, "mimeInit: unknown option: '" << buf << "' (" << option << ")"); + debugs(25, DBG_IMPORTANT, "mimeInit: unknown option: '" << buf << "' (" << option << ")"); } if (regcomp(&re, pattern, re_flags) != 0) { - debugs(25, 1, "mimeInit: regcomp error: '" << buf << "'"); + debugs(25, DBG_IMPORTANT, "mimeInit: regcomp error: '" << buf << "'"); continue; } @@ -376,7 +376,7 @@ for (m = MimeTable; m != NULL; m = m->next) m->theIcon.load(); - debugs(25, 1, "Loaded Icons."); + debugs(25, DBG_IMPORTANT, "Loaded Icons."); } void @@ -433,12 +433,12 @@ fd = file_open(path, O_RDONLY | O_BINARY); if (fd < 0) { - debugs(25, 0, "mimeLoadIconFile: " << path << ": " << xstrerror()); + debugs(25, DBG_CRITICAL, "mimeLoadIconFile: " << path << ": " << xstrerror()); return; } if (fstat(fd, &sb) < 0) { - debugs(25, 0, "mimeLoadIconFile: FD " << fd << ": fstat: " << xstrerror()); + debugs(25, DBG_CRITICAL, "mimeLoadIconFile: FD " << fd << ": fstat: " << xstrerror()); file_close(fd); return; } === modified file 'src/multicast.cc' --- src/multicast.cc 2012-07-17 17:38:50 +0000 +++ src/multicast.cc 2012-08-02 21:18:43 +0000 @@ -46,7 +46,7 @@ char ttl = (char) mcast_ttl; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) < 0) - debugs(50, 1, "comm_set_mcast_ttl: FD " << fd << ", TTL: " << mcast_ttl << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "comm_set_mcast_ttl: FD " << fd << ", TTL: " << mcast_ttl << ": " << xstrerror()); #endif @@ -61,7 +61,7 @@ int i; if (ia == NULL) { - debugs(7, 0, "comm_join_mcast_groups: Unknown host"); + debugs(7, DBG_CRITICAL, "comm_join_mcast_groups: Unknown host"); return; } === modified file 'src/neighbors.cc' --- src/neighbors.cc 2012-07-20 15:31:04 +0000 +++ src/neighbors.cc 2012-08-02 21:18:43 +0000 @@ -442,7 +442,7 @@ peerAlive(peer *p) { if (p->stats.logged_state == PEER_DEAD && p->tcp_up) { - debugs(15, 1, "Detected REVIVED " << neighborTypeStr(p) << ": " << p->name); + debugs(15, DBG_IMPORTANT, "Detected REVIVED " << neighborTypeStr(p) << ": " << p->name); p->stats.logged_state = PEER_ALIVE; peerClearRR(); } @@ -681,7 +681,7 @@ /* log it once at the threshold */ if (p->stats.logged_state == PEER_ALIVE) { - debugs(15, 1, "Detected DEAD " << neighborTypeStr(p) << ": " << p->name); + debugs(15, DBG_IMPORTANT, "Detected DEAD " << neighborTypeStr(p) << ": " << p->name); p->stats.logged_state = PEER_DEAD; } } @@ -942,7 +942,7 @@ ++ np->icp.counts[opcode]; if (isPowTen(++np->stats.ignored_replies)) - debugs(15, 1, "WARNING: Ignored " << np->stats.ignored_replies << " replies from non-peer " << np->host); + debugs(15, DBG_IMPORTANT, "WARNING: Ignored " << np->stats.ignored_replies << " replies from non-peer " << np->host); } /* ignoreMulticastReply @@ -1026,7 +1026,7 @@ if (entry->lock_count == 0) { // TODO: many entries are unlocked; why is this reported at level 1? - debugs(12, 1, "neighborsUdpAck: '" << storeKeyText(key) << "' has no locks"); + debugs(12, DBG_IMPORTANT, "neighborsUdpAck: '" << storeKeyText(key) << "' has no locks"); neighborCountIgnored(p); return; } @@ -1063,18 +1063,18 @@ } } else if (opcode == ICP_SECHO) { if (p) { - debugs(15, 1, "Ignoring SECHO from neighbor " << p->host); + debugs(15, DBG_IMPORTANT, "Ignoring SECHO from neighbor " << p->host); neighborCountIgnored(p); } else { - debugs(15, 1, "Unsolicited SECHO from " << from); + debugs(15, DBG_IMPORTANT, "Unsolicited SECHO from " << from); } } else if (opcode == ICP_DENIED) { if (p == NULL) { neighborIgnoreNonPeer(from, opcode); } else if (p->stats.pings_acked > 100) { if (100 * p->icp.counts[ICP_DENIED] / p->stats.pings_acked > 95) { - debugs(15, 0, "95%% of replies from '" << p->host << "' are UDP_DENIED"); - debugs(15, 0, "Disabling '" << p->host << "', please check your configuration."); + debugs(15, DBG_CRITICAL, "95%% of replies from '" << p->host << "' are UDP_DENIED"); + debugs(15, DBG_CRITICAL, "Disabling '" << p->host << "', please check your configuration."); neighborRemove(p); p = NULL; } else { @@ -1084,7 +1084,7 @@ } else if (opcode == ICP_MISS_NOFETCH) { mem->ping_reply_callback(p, ntype, AnyP::PROTO_ICP, header, mem->ircb_data); } else { - debugs(15, 0, "neighborsUdpAck: Unexpected ICP reply: " << opcode_d); + debugs(15, DBG_CRITICAL, "neighborsUdpAck: Unexpected ICP reply: " << opcode_d); } } @@ -1194,21 +1194,21 @@ int j; if (p->n_addresses == 0) { - debugs(15, 1, "Configuring " << neighborTypeStr(p) << " " << p->host << "/" << p->http_port << "/" << p->icp.port); + debugs(15, DBG_IMPORTANT, "Configuring " << neighborTypeStr(p) << " " << p->host << "/" << p->http_port << "/" << p->icp.port); if (p->type == PEER_MULTICAST) - debugs(15, 1, " Multicast TTL = " << p->mcast.ttl); + debugs(15, DBG_IMPORTANT, " Multicast TTL = " << p->mcast.ttl); } p->n_addresses = 0; if (ia == NULL) { - debugs(0, 0, "WARNING: DNS lookup for '" << p->host << "' failed!"); + debugs(0, DBG_CRITICAL, "WARNING: DNS lookup for '" << p->host << "' failed!"); return; } if ((int) ia->count < 1) { - debugs(0, 0, "WARNING: No IP address found for '" << p->host << "'!"); + debugs(0, DBG_CRITICAL, "WARNING: No IP address found for '" << p->host << "'!"); return; } @@ -1270,7 +1270,7 @@ -- p->tcp_up; if (!p->tcp_up) { - debugs(15, 1, "Detected DEAD " << neighborTypeStr(p) << ": " << p->name); + debugs(15, DBG_IMPORTANT, "Detected DEAD " << neighborTypeStr(p) << ": " << p->name); p->stats.logged_state = PEER_DEAD; } } @@ -1278,7 +1278,7 @@ void peerConnectFailed(peer *p) { - debugs(15, 1, "TCP connection to " << p->host << "/" << p->http_port << " failed"); + debugs(15, DBG_IMPORTANT, "TCP connection to " << p->host << "/" << p->http_port << " failed"); peerConnectFailedSilent(p); } @@ -1412,7 +1412,7 @@ peer *p = (peer *)psstate->callback_data; p->mcast.flags.counting = 0; p->mcast.avg_n_members = Math::doubleAverage(p->mcast.avg_n_members, (double) psstate->ping.n_recv, ++p->mcast.n_times_counted, 10); - debugs(15, 1, "Group " << p->host << ": " << psstate->ping.n_recv << + debugs(15, DBG_IMPORTANT, "Group " << p->host << ": " << psstate->ping.n_recv << " replies, "<< std::setw(4)<< std::setprecision(2) << p->mcast.avg_n_members <<" average, RTT " << p->stats.rtt); p->mcast.n_replies_expected = (int) p->mcast.avg_n_members; @@ -1730,7 +1730,7 @@ if (e->lock_count == 0) { // TODO: many entries are unlocked; why is this reported at level 1? - debugs(12, 1, "neighborsUdpAck: '" << storeKeyText(key) << "' has no locks"); + debugs(12, DBG_IMPORTANT, "neighborsUdpAck: '" << storeKeyText(key) << "' has no locks"); neighborCountIgnored(p); return; } === modified file 'src/pconn.cc' --- src/pconn.cc 2012-07-23 19:37:47 +0000 +++ src/pconn.cc 2012-08-02 21:18:43 +0000 @@ -481,7 +481,7 @@ { pools = (PconnPool **) xcalloc(MAX_NUM_PCONN_POOLS, sizeof(*pools)); //TODO: re-link to MemPools. WAS: pconn_fds_pool = memPoolCreate("pconn_fds", PCONN_FDS_SZ * sizeof(int)); - debugs(48, 0, "persistent connection module initialized"); + debugs(48, DBG_CRITICAL, "persistent connection module initialized"); registerWithCacheManager(); } === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2012-01-20 18:55:04 +0000 +++ src/peer_digest.cc 2012-08-02 21:18:43 +0000 @@ -634,7 +634,7 @@ assert (fetch->entry->getReply()->sline.status != 0); if (fetch->entry->getReply()->sline.status != HTTP_OK) { - debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host << + debugs(72, DBG_IMPORTANT, "peerDigestSwapInHeaders: " << fetch->pd->host << " status " << fetch->entry->getReply()->sline.status << " got cached!"); @@ -882,7 +882,7 @@ pd->stats.recv.msgs += fetch->recv.msg; if (err) { - debugs(72, 1, "" << (pcb_valid ? "temporary " : "" ) << "disabling (" << pd->req_result << ") digest from " << host); + debugs(72, DBG_IMPORTANT, "" << (pcb_valid ? "temporary " : "" ) << "disabling (" << pd->req_result << ") digest from " << host); if (pd->cd) { cacheDigestDestroy(pd->cd); @@ -1007,14 +1007,14 @@ /* check version requirements (both ways) */ if (cblock.ver.required > CacheDigestVer.current) { - debugs(72, 1, "" << host << " digest requires version " << + debugs(72, DBG_IMPORTANT, "" << host << " digest requires version " << cblock.ver.required << "; have: " << CacheDigestVer.current); return 0; } if (cblock.ver.current < CacheDigestVer.required) { - debugs(72, 1, "" << host << " digest is version " << + debugs(72, DBG_IMPORTANT, "" << host << " digest is version " << cblock.ver.current << "; we require: " << CacheDigestVer.required); @@ -1025,13 +1025,13 @@ if (cblock.ver.required > cblock.ver.current || cblock.mask_size <= 0 || cblock.capacity <= 0 || cblock.bits_per_entry <= 0 || cblock.hash_func_count <= 0) { - debugs(72, 0, "" << host << " digest cblock is corrupted."); + debugs(72, DBG_CRITICAL, "" << host << " digest cblock is corrupted."); return 0; } /* check consistency further */ if ((size_t)cblock.mask_size != cacheDigestCalcMaskSize(cblock.capacity, cblock.bits_per_entry)) { - debugs(72, 0, host << " digest cblock is corrupted " << + debugs(72, DBG_CRITICAL, host << " digest cblock is corrupted " << "(mask size mismatch: " << cblock.mask_size << " ? " << cacheDigestCalcMaskSize(cblock.capacity, cblock.bits_per_entry) << ")."); @@ -1040,7 +1040,7 @@ /* there are some things we cannot do yet */ if (cblock.hash_func_count != CacheDigestHashFuncCount) { - debugs(72, 0, "" << host << " digest: unsupported #hash functions: " << + debugs(72, DBG_CRITICAL, "" << host << " digest: unsupported #hash functions: " << cblock.hash_func_count << " ? " << CacheDigestHashFuncCount << "."); return 0; } @@ -1080,7 +1080,7 @@ const int bit_util = cacheDigestBitUtil(pd->cd); if (bit_util > 65) { - debugs(72, 0, "Warning: " << pd->host << + debugs(72, DBG_CRITICAL, "Warning: " << pd->host << " peer digest has too many bits on (" << bit_util << "%%)."); return 0; === modified file 'src/peer_select.cc' --- src/peer_select.cc 2012-07-29 08:15:17 +0000 +++ src/peer_select.cc 2012-08-02 21:18:43 +0000 @@ -93,7 +93,7 @@ } if (psstate->acl_checklist) { - debugs(44, 1, "calling aclChecklistFree() from peerSelectStateFree"); + debugs(44, DBG_IMPORTANT, "calling aclChecklistFree() from peerSelectStateFree"); delete (psstate->acl_checklist); } @@ -561,7 +561,7 @@ &ps->ping.timeout); if (ps->ping.n_sent == 0) - debugs(44, 0, "WARNING: neighborsUdpPing returned 0"); + debugs(44, DBG_CRITICAL, "WARNING: neighborsUdpPing returned 0"); debugs(44, 3, "peerSelect: " << ps->ping.n_replies_expected << " ICP replies expected, RTT " << ps->ping.timeout << " msec"); @@ -899,7 +899,7 @@ #endif else - debugs(44, 1, "peerHandlePingReply: unknown protocol " << proto); + debugs(44, DBG_IMPORTANT, "peerHandlePingReply: unknown protocol " << proto); } static void === modified file 'src/repl/heap/store_repl_heap.cc' --- src/repl/heap/store_repl_heap.cc 2012-01-20 18:55:04 +0000 +++ src/repl/heap/store_repl_heap.cc 2012-08-02 21:18:43 +0000 @@ -320,7 +320,7 @@ keytype = args->key; args = args->next; } else { - debugs(81, 1, "createRemovalPolicy_heap: No key type specified. Using LRU"); + debugs(81, DBG_IMPORTANT, "createRemovalPolicy_heap: No key type specified. Using LRU"); keytype = "LRU"; } @@ -331,7 +331,7 @@ else if (!strcmp(keytype, "LRU")) heap_data->keyfunc = HeapKeyGen_StoreEntry_LRU; else { - debugs(81, 0, "createRemovalPolicy_heap: Unknown key type \"" << keytype << "\". Using LRU"); + debugs(81, DBG_CRITICAL, "createRemovalPolicy_heap: Unknown key type \"" << keytype << "\". Using LRU"); heap_data->keyfunc = HeapKeyGen_StoreEntry_LRU; } === modified file 'src/send-announce.cc' --- src/send-announce.cc 2012-01-20 18:55:04 +0000 +++ src/send-announce.cc 2012-08-02 21:10:18 +0000 @@ -71,11 +71,11 @@ int fd; if (ia == NULL) { - debugs(27, 1, "send_announce: Unknown host '" << host << "'"); + debugs(27, DBG_IMPORTANT, "send_announce: Unknown host '" << host << "'"); return; } - debugs(27, 1, "Sending Announcement to " << host); + debugs(27, DBG_IMPORTANT, "Sending Announcement to " << host); sndbuf[0] = '\0'; snprintf(tbuf, 256, "cache_version SQUID/%s\n", version_string); strcat(sndbuf, tbuf); @@ -106,7 +106,7 @@ sndbuf[l] = '\0'; file_close(fd); } else { - debugs(50, 1, "send_announce: " << file << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "send_announce: " << file << ": " << xstrerror()); } } @@ -115,5 +115,5 @@ assert(Comm::IsConnOpen(icpOutgoingConn)); if (comm_udp_sendto(icpOutgoingConn->fd, S, sndbuf, strlen(sndbuf) + 1) < 0) - debugs(27, 1, "ERROR: Failed to announce to " << S << " from " << icpOutgoingConn->local << ": " << xstrerror()); + debugs(27, DBG_IMPORTANT, "ERROR: Failed to announce to " << S << " from " << icpOutgoingConn->local << ": " << xstrerror()); } === modified file 'src/snmp_core.cc' --- src/snmp_core.cc 2012-07-23 19:37:47 +0000 +++ src/snmp_core.cc 2012-08-02 21:10:18 +0000 @@ -387,7 +387,7 @@ xfree(snmp_rq->outbuf); xfree(snmp_rq); } else { - debugs(49, 1, "snmpHandleUdp: FD " << sock << " recvfrom: " << xstrerror()); + debugs(49, DBG_IMPORTANT, "snmpHandleUdp: FD " << sock << " recvfrom: " << xstrerror()); } } === modified file 'src/ssl/helper.cc' --- src/ssl/helper.cc 2012-06-07 17:46:16 +0000 +++ src/ssl/helper.cc 2012-08-02 21:10:18 +0000 @@ -93,7 +93,7 @@ first_warn = squid_curtime; if (squid_curtime - first_warn > 3 * 60) fatal("SSL servers not responding for 3 minutes"); - debugs(34, 1, HERE << "Queue overload, rejecting"); + debugs(34, DBG_IMPORTANT, HERE << "Queue overload, rejecting"); callback(data, (char *)"error 45 Temporary network problem, please retry later"); return; } === modified file 'src/ssl/support.cc' --- src/ssl/support.cc 2012-07-23 07:02:06 +0000 +++ src/ssl/support.cc 2012-08-02 21:10:18 +0000 @@ -125,12 +125,12 @@ break; default: - debugs(83, 1, "ssl_temp_rsa_cb: Unexpected key length " << keylen); + debugs(83, DBG_IMPORTANT, "ssl_temp_rsa_cb: Unexpected key length " << keylen); return NULL; } if (rsa == NULL) { - debugs(83, 1, "ssl_temp_rsa_cb: Failed to generate key " << keylen); + debugs(83, DBG_IMPORTANT, "ssl_temp_rsa_cb: Failed to generate key " << keylen); return NULL; } @@ -138,7 +138,7 @@ if (do_debug(83, 5)) PEM_write_RSAPrivateKey(debug_log, rsa, NULL, NULL, 0, NULL, NULL); - debugs(83, 1, "Generated ephemeral RSA key of length " << keylen); + debugs(83, DBG_IMPORTANT, "Generated ephemeral RSA key of length " << keylen); } return rsa; @@ -1017,7 +1017,7 @@ } if (certfile) { - debugs(83, 1, "Using certificate in " << certfile); + debugs(83, DBG_IMPORTANT, "Using certificate in " << certfile); if (!SSL_CTX_use_certificate_chain_file(sslContext, certfile)) { ssl_error = ERR_get_error(); @@ -1025,7 +1025,7 @@ certfile, ERR_error_string(ssl_error, NULL)); } - debugs(83, 1, "Using private key in " << keyfile); + debugs(83, DBG_IMPORTANT, "Using private key in " << keyfile); ssl_ask_password(sslContext, keyfile); if (!SSL_CTX_use_PrivateKey_file(sslContext, keyfile, SSL_FILETYPE_PEM)) { @@ -1150,7 +1150,7 @@ nid = OBJ_txt2nid((char *) attribute_name); if (nid == 0) { - debugs(83, 1, "WARNING: Unknown SSL attribute name '" << attribute_name << "'"); + debugs(83, DBG_IMPORTANT, "WARNING: Unknown SSL attribute name '" << attribute_name << "'"); return NULL; } === modified file 'src/stat.cc' --- src/stat.cc 2012-07-18 15:47:58 +0000 +++ src/stat.cc 2012-08-02 21:18:43 +0000 @@ -1076,7 +1076,7 @@ l = &CountHourHist[hours]; } else { - debugs(18, 1, "statAvgDump: Invalid args, minutes=" << minutes << ", hours=" << hours); + debugs(18, DBG_IMPORTANT, "statAvgDump: Invalid args, minutes=" << minutes << ", hours=" << hours); return; } @@ -1436,7 +1436,7 @@ int i = (int) statPctileSvc(0.5, 20, PCTILE_HTTP); if (Config.warnings.high_rptm < i) - debugs(18, 0, "WARNING: Median response time is " << i << " milliseconds"); + debugs(18, DBG_CRITICAL, "WARNING: Median response time is " << i << " milliseconds"); } if (Config.warnings.high_pf) { @@ -1447,7 +1447,7 @@ i /= (int) dt; if (Config.warnings.high_pf < i) - debugs(18, 0, "WARNING: Page faults occuring at " << i << "/sec"); + debugs(18, DBG_CRITICAL, "WARNING: Page faults occuring at " << i << "/sec"); } } @@ -1467,7 +1467,7 @@ #endif if (Config.warnings.high_memory < i) - debugs(18, 0, "WARNING: Memory usage at " << ((unsigned long int)(i >> 20)) << " MB"); + debugs(18, DBG_CRITICAL, "WARNING: Memory usage at " << ((unsigned long int)(i >> 20)) << " MB"); } } @@ -1984,7 +1984,7 @@ cd = CountHist[0].cd.kbytes_recv.kb - CountHist[minutes].cd.kbytes_recv.kb; if (s < cd) - debugs(18, 1, "STRANGE: srv_kbytes=" << s << ", cd_kbytes=" << cd); + debugs(18, DBG_IMPORTANT, "STRANGE: srv_kbytes=" << s << ", cd_kbytes=" << cd); s -= cd; === modified file 'src/stmem.cc' --- src/stmem.cc 2012-01-20 18:55:04 +0000 +++ src/stmem.cc 2012-08-02 21:18:43 +0000 @@ -92,7 +92,7 @@ mem_hdr::unlink(mem_node *aNode) { if (aNode->write_pending) { - debugs(0, 0, "cannot unlink mem_node " << aNode << " while write_pending"); + debugs(0, DBG_CRITICAL, "cannot unlink mem_node " << aNode << " while write_pending"); return false; } @@ -255,7 +255,7 @@ /* we shouldn't ever ask for absent offsets */ if (nodes.size() == 0) { - debugs(19, 1, "mem_hdr::copy: No data to read"); + debugs(19, DBG_IMPORTANT, "mem_hdr::copy: No data to read"); debugDump(); assert (0); return 0; @@ -268,7 +268,7 @@ mem_node *p = getBlockContainingLocation(target.offset); if (!p) { - debugs(19, 1, "memCopy: could not find start of " << target.range() << + debugs(19, DBG_IMPORTANT, "memCopy: could not find start of " << target.range() << " in memory."); debugDump(); fatal("Squid has attempted to read data from memory that is not present. This is an indication of of (pre-3.0) code that hasn't been updated to deal with sparse objects in memory. Squid should coredump.allowing to review the cause. Immediately preceeding this message is a dump of the available data in the format [start,end). The [ means from the value, the ) means up to the value. I.e. [1,5) means that there are 4 bytes of data, at offsets 1,2,3,4.\n"); @@ -369,7 +369,7 @@ debugs(19, 6, "mem_hdr::write: " << this << " " << writeBuffer.range() << " object end " << endOffset()); if (unionNotEmpty(writeBuffer)) { - debugs(19,0,"mem_hdr::write: writeBuffer: " << writeBuffer.range()); + debugs(19, DBG_CRITICAL, "mem_hdr::write: writeBuffer: " << writeBuffer.range()); debugDump(); fatal("Attempt to overwrite already in-memory data. Preceeding this there should be a mem_hdr::write output that lists the attempted write, and the currently present data. Please get a 'backtrace full' from this error - using the generated core, and file a bug report with the squid developers including the last 10 lines of cache.log and the backtrace.\n"); PROF_stop(mem_hdr_write); @@ -424,8 +424,8 @@ void mem_hdr::dump() const { - debugs(20, 1, "mem_hdr: " << (void *)this << " nodes.start() " << nodes.start()); - debugs(20, 1, "mem_hdr: " << (void *)this << " nodes.finish() " << nodes.finish()); + debugs(20, DBG_IMPORTANT, "mem_hdr: " << (void *)this << " nodes.start() " << nodes.start()); + debugs(20, DBG_IMPORTANT, "mem_hdr: " << (void *)this << " nodes.finish() " << nodes.finish()); } size_t === modified file 'src/store.cc' --- src/store.cc 2012-07-23 07:02:06 +0000 +++ src/store.cc 2012-08-02 21:18:43 +0000 @@ -323,7 +323,7 @@ if (EBIT_TEST(flags, ENTRY_ABORTED)) { /* I don't think we should be adding clients to aborted entries */ - debugs(20, 1, "storeClientType: adding to ENTRY_ABORTED entry"); + debugs(20, DBG_IMPORTANT, "storeClientType: adding to ENTRY_ABORTED entry"); return STORE_MEM_CLIENT; } @@ -572,7 +572,7 @@ } if (EBIT_TEST(flags, KEY_PRIVATE)) - debugs(20, 1, "WARNING: " << __FILE__ << ":" << __LINE__ << ": found KEY_PRIVATE"); + debugs(20, DBG_IMPORTANT, "WARNING: " << __FILE__ << ":" << __LINE__ << ": found KEY_PRIVATE"); Store::Root().handleIdleEntry(*this); // may delete us return 0; @@ -709,7 +709,7 @@ #if MORE_DEBUG_OUTPUT if (EBIT_TEST(flags, RELEASE_REQUEST)) - debugs(20, 1, "assertion failed: RELEASE key " << key << ", url " << mem_obj->url); + debugs(20, DBG_IMPORTANT, "assertion failed: RELEASE key " << key << ", url " << mem_obj->url); #endif @@ -1131,7 +1131,7 @@ */ if (mem_obj->abort.callback) { if (!cbdataReferenceValid(mem_obj->abort.data)) - debugs(20,1,HERE << "queueing event when abort.data is not valid"); + debugs(20, DBG_IMPORTANT,HERE << "queueing event when abort.data is not valid"); eventAdd("mem_obj->abort.callback", mem_obj->abort.callback, mem_obj->abort.data, @@ -1320,7 +1320,7 @@ if (e == NULL) { /* done! */ - debugs(20, 1, "storeLateRelease: released " << n << " objects"); + debugs(20, DBG_IMPORTANT, "storeLateRelease: released " << n << " objects"); return; } @@ -1763,7 +1763,7 @@ /* find the number of currently known repl types */ for (i = 0; storerepl_list && storerepl_list[i].typestr; ++i) { if (strcmp(storerepl_list[i].typestr, type) == 0) { - debugs(20, 1, "WARNING: Trying to load store replacement policy " << type << " twice."); + debugs(20, DBG_IMPORTANT, "WARNING: Trying to load store replacement policy " << type << " twice."); return; } } @@ -1791,9 +1791,9 @@ return r->create(settings->args); } - debugs(20, 1, "ERROR: Unknown policy " << settings->type); - debugs(20, 1, "ERROR: Be sure to have set cache_replacement_policy"); - debugs(20, 1, "ERROR: and memory_replacement_policy in squid.conf!"); + debugs(20, DBG_IMPORTANT, "ERROR: Unknown policy " << settings->type); + debugs(20, DBG_IMPORTANT, "ERROR: Be sure to have set cache_replacement_policy"); + debugs(20, DBG_IMPORTANT, "ERROR: and memory_replacement_policy in squid.conf!"); fatalf("ERROR: Unknown policy %s\n", settings->type); return NULL; /* NOTREACHED */ } @@ -1830,7 +1830,7 @@ debugs(20, 3, "StoreEntry::replaceHttpReply: " << url()); if (!mem_obj) { - debugs(20, 0, "Attempt to replace object with no in-memory representation"); + debugs(20, DBG_CRITICAL, "Attempt to replace object with no in-memory representation"); return; } === modified file 'src/store_client.cc' --- src/store_client.cc 2012-07-20 15:31:04 +0000 +++ src/store_client.cc 2012-08-02 21:18:43 +0000 @@ -412,7 +412,7 @@ return; } else { - debugs(90, 1, "WARNING: Averted multiple fd operation (1)"); + debugs(90, DBG_IMPORTANT, "WARNING: Averted multiple fd operation (1)"); flags.store_copying = 0; return; } @@ -498,7 +498,7 @@ HttpReply *rep = (HttpReply *) entry->getReply(); // bypass const if (!rep->parseCharBuf(copyInto.data, headersEnd(copyInto.data, len))) { - debugs(90, 0, "Could not parse headers from on disk object"); + debugs(90, DBG_CRITICAL, "Could not parse headers from on disk object"); } else { parsed_header = 1; } @@ -571,7 +571,7 @@ if (!aBuilder.isBufferSane()) { /* oops, bad disk file? */ - debugs(90, 1, "WARNING: swapfile header inconsistent with available data"); + debugs(90, DBG_IMPORTANT, "WARNING: swapfile header inconsistent with available data"); fail(); return; } @@ -579,7 +579,7 @@ tlv *tlv_list = aBuilder.createStoreMeta (); if (tlv_list == NULL) { - debugs(90, 1, "WARNING: failed to unpack meta data"); + debugs(90, DBG_IMPORTANT, "WARNING: failed to unpack meta data"); fail(); return; } === modified file 'src/store_digest.cc' --- src/store_digest.cc 2012-07-18 15:47:58 +0000 +++ src/store_digest.cc 2012-08-02 21:10:18 +0000 @@ -125,7 +125,7 @@ } store_digest = cacheDigestCreate(cap, Config.digest.bits_per_entry); - debugs(71, 1, "Local cache digest enabled; rebuild/rewrite every " << + debugs(71, DBG_IMPORTANT, "Local cache digest enabled; rebuild/rewrite every " << (int) Config.digest.rebuild_period << "/" << (int) Config.digest.rewrite_period << " sec"); @@ -299,7 +299,7 @@ /* prevent overlapping if rebuild schedule is too tight */ if (sd_state.rebuild_lock) { - debugs(71, 1, "storeDigestRebuildStart: overlap detected, consider increasing rebuild period"); + debugs(71, DBG_IMPORTANT, "storeDigestRebuildStart: overlap detected, consider increasing rebuild period"); return; } @@ -381,7 +381,7 @@ /* prevent overlapping if rewrite schedule is too tight */ if (sd_state.rewrite_lock) { - debugs(71, 1, "storeDigestRewrite: overlap detected, consider increasing rewrite period"); + debugs(71, DBG_IMPORTANT, "storeDigestRewrite: overlap detected, consider increasing rewrite period"); return; } === modified file 'src/store_dir.cc' --- src/store_dir.cc 2012-08-01 11:54:23 +0000 +++ src/store_dir.cc 2012-08-02 21:10:18 +0000 @@ -101,10 +101,10 @@ if (0 == strcasecmp(Config.store_dir_select_algorithm, "round-robin")) { storeDirSelectSwapDir = storeDirSelectSwapDirRoundRobin; - debugs(47, 1, "Using Round Robin store dir selection"); + debugs(47, DBG_IMPORTANT, "Using Round Robin store dir selection"); } else { storeDirSelectSwapDir = storeDirSelectSwapDirLeastLoad; - debugs(47, 1, "Using Least Load store dir selection"); + debugs(47, DBG_IMPORTANT, "Using Least Load store dir selection"); } } @@ -408,7 +408,7 @@ max_size = currentSize(); - debugs(20, 1, "WARNING: Shrinking cache_dir #" << index << " to " << currentSize() / 1024.0 << " KB"); + debugs(20, DBG_IMPORTANT, "WARNING: Shrinking cache_dir #" << index << " to " << currentSize() / 1024.0 << " KB"); } void @@ -447,12 +447,12 @@ int notdone = 1; if (StoreController::store_dirs_rebuilding) { - debugs(20, 1, "Not currently OK to rewrite swap log."); - debugs(20, 1, "storeDirWriteCleanLogs: Operation aborted."); + debugs(20, DBG_IMPORTANT, "Not currently OK to rewrite swap log."); + debugs(20, DBG_IMPORTANT, "storeDirWriteCleanLogs: Operation aborted."); return 0; } - debugs(20, 1, "storeDirWriteCleanLogs: Starting..."); + debugs(20, DBG_IMPORTANT, "storeDirWriteCleanLogs: Starting..."); getCurrentTime(); start = current_time; @@ -460,7 +460,7 @@ sd = dynamic_cast(INDEXSD(dirn)); if (sd->writeCleanStart() < 0) { - debugs(20, 1, "log.clean.start() failed for dir #" << sd->index); + debugs(20, DBG_IMPORTANT, "log.clean.start() failed for dir #" << sd->index); continue; } } @@ -493,7 +493,7 @@ if ((++n & 0xFFFF) == 0) { getCurrentTime(); - debugs(20, 1, " " << std::setw(7) << n << + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << n << " entries written so far."); } } @@ -510,8 +510,8 @@ dt = tvSubDsec(start, current_time); - debugs(20, 1, " Finished. Wrote " << n << " entries."); - debugs(20, 1, " Took "<< std::setw(3)<< std::setprecision(2) << dt << + debugs(20, DBG_IMPORTANT, " Finished. Wrote " << n << " entries."); + debugs(20, DBG_IMPORTANT, " Took "<< std::setw(3)<< std::setprecision(2) << dt << " seconds ("<< std::setw(6) << ((double) n / (dt > 0.0 ? dt : 1.0)) << " entries/sec)."); @@ -572,7 +572,7 @@ struct statvfs sfs; if (statvfs(path, &sfs)) { - debugs(50, 1, "" << path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << path << ": " << xstrerror()); *blksize = 2048; return 1; } @@ -583,7 +583,7 @@ struct statfs sfs; if (statfs(path, &sfs)) { - debugs(50, 1, "" << path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << path << ": " << xstrerror()); *blksize = 2048; return 1; } @@ -611,7 +611,7 @@ struct statvfs sfs; if (statvfs(path, &sfs)) { - debugs(50, 1, "" << path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << path << ": " << xstrerror()); return 1; } @@ -624,7 +624,7 @@ struct statfs sfs; if (statfs(path, &sfs)) { - debugs(50, 1, "" << path << ": " << xstrerror()); + debugs(50, DBG_IMPORTANT, "" << path << ": " << xstrerror()); return 1; } @@ -935,17 +935,17 @@ /* this is very bogus, its specific to the any Store maintaining an * in-core index, not global */ size_t buckets = (Store::Root().maxSize() + Config.memMaxSize) / Config.Store.avgObjectSize; - debugs(20, 1, "Swap maxSize " << (Store::Root().maxSize() >> 10) << + debugs(20, DBG_IMPORTANT, "Swap maxSize " << (Store::Root().maxSize() >> 10) << " + " << ( Config.memMaxSize >> 10) << " KB, estimated " << buckets << " objects"); buckets /= Config.Store.objectsPerBucket; - debugs(20, 1, "Target number of buckets: " << buckets); + debugs(20, DBG_IMPORTANT, "Target number of buckets: " << buckets); /* ideally the full scan period should be configurable, for the * moment it remains at approximately 24 hours. */ store_hash_buckets = storeKeyHashBuckets(buckets); - debugs(20, 1, "Using " << store_hash_buckets << " Store buckets"); - debugs(20, 1, "Max Mem size: " << ( Config.memMaxSize >> 10) << " KB" << + debugs(20, DBG_IMPORTANT, "Using " << store_hash_buckets << " Store buckets"); + debugs(20, DBG_IMPORTANT, "Max Mem size: " << ( Config.memMaxSize >> 10) << " KB" << (Config.memShared ? " [shared]" : "")); - debugs(20, 1, "Max Swap size: " << (Store::Root().maxSize() >> 10) << " KB"); + debugs(20, DBG_IMPORTANT, "Max Swap size: " << (Store::Root().maxSize() >> 10) << " KB"); store_table = hash_create(storeKeyHashCmp, store_hash_buckets, storeKeyHashHash); === modified file 'src/store_log.cc' --- src/store_log.cc 2012-07-18 15:47:58 +0000 +++ src/store_log.cc 2012-08-02 21:10:18 +0000 @@ -71,7 +71,7 @@ ++storeLogTagsCounts[tag]; if (mem != NULL) { if (mem->log_url == NULL) { - debugs(20, 1, "storeLog: NULL log_url for " << mem->url); + debugs(20, DBG_IMPORTANT, "storeLog: NULL log_url for " << mem->url); mem->dump(); mem->log_url = xstrdup(mem->url); } @@ -150,7 +150,7 @@ storeLogRegisterWithCacheManager(); if (Config.Log.store == NULL || strcmp(Config.Log.store, "none") == 0) { - debugs(20, 1, "Store logging disabled"); + debugs(20, DBG_IMPORTANT, "Store logging disabled"); return; } === modified file 'src/store_rebuild.cc' --- src/store_rebuild.cc 2012-07-23 07:02:06 +0000 +++ src/store_rebuild.cc 2012-08-02 21:10:18 +0000 @@ -103,13 +103,13 @@ if ((++validated & 0x3FFFF) == 0) /* TODO format the int with with a stream operator */ - debugs(20, 1, " " << validated << " Entries Validated so far."); + debugs(20, DBG_IMPORTANT, " " << validated << " Entries Validated so far."); } if (currentSearch->isDone()) { - debugs(20, 1, " Completed Validation Procedure"); - debugs(20, 1, " Validated " << validated << " Entries"); - debugs(20, 1, " store_swap_size = " << Store::Root().currentSize() / 1024.0 << " KB"); + debugs(20, DBG_IMPORTANT, " Completed Validation Procedure"); + debugs(20, DBG_IMPORTANT, " Validated " << validated << " Entries"); + debugs(20, DBG_IMPORTANT, " store_swap_size = " << Store::Root().currentSize() / 1024.0 << " KB"); --StoreController::store_dirs_rebuilding; assert(0 == StoreController::store_dirs_rebuilding); @@ -155,18 +155,18 @@ dt = tvSubDsec(rebuild_start, current_time); - debugs(20, 1, "Finished rebuilding storage from disk."); - debugs(20, 1, " " << std::setw(7) << counts.scancount << " Entries scanned"); - debugs(20, 1, " " << std::setw(7) << counts.invalid << " Invalid entries."); - debugs(20, 1, " " << std::setw(7) << counts.badflags << " With invalid flags."); - debugs(20, 1, " " << std::setw(7) << counts.objcount << " Objects loaded."); - debugs(20, 1, " " << std::setw(7) << counts.expcount << " Objects expired."); - debugs(20, 1, " " << std::setw(7) << counts.cancelcount << " Objects cancelled."); - debugs(20, 1, " " << std::setw(7) << counts.dupcount << " Duplicate URLs purged."); - debugs(20, 1, " " << std::setw(7) << counts.clashcount << " Swapfile clashes avoided."); - debugs(20, 1, " Took "<< std::setw(3)<< std::setprecision(2) << dt << " seconds ("<< std::setw(6) << + debugs(20, DBG_IMPORTANT, "Finished rebuilding storage from disk."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.scancount << " Entries scanned"); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.invalid << " Invalid entries."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.badflags << " With invalid flags."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.objcount << " Objects loaded."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.expcount << " Objects expired."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.cancelcount << " Objects cancelled."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.dupcount << " Duplicate URLs purged."); + debugs(20, DBG_IMPORTANT, " " << std::setw(7) << counts.clashcount << " Swapfile clashes avoided."); + debugs(20, DBG_IMPORTANT, " Took "<< std::setw(3)<< std::setprecision(2) << dt << " seconds ("<< std::setw(6) << ((double) counts.objcount / (dt > 0.0 ? dt : 1.0)) << " objects/sec)."); - debugs(20, 1, "Beginning Validation Procedure"); + debugs(20, DBG_IMPORTANT, "Beginning Validation Procedure"); eventAdd("storeCleanup", storeCleanup, NULL, 0.0, 1); @@ -232,7 +232,7 @@ d += (double) RebuildProgress[sd_index].total; } - debugs(20, 1, "Store rebuilding is "<< std::setw(4)<< std::setprecision(2) << 100.0 * n / d << "% complete"); + debugs(20, DBG_IMPORTANT, "Store rebuilding is "<< std::setw(4)<< std::setprecision(2) << 100.0 * n / d << "% complete"); last_report = squid_curtime; } === modified file 'src/store_swapin.cc' --- src/store_swapin.cc 2012-01-20 18:55:04 +0000 +++ src/store_swapin.cc 2012-08-02 21:10:18 +0000 @@ -59,12 +59,12 @@ e->swap_filen << " " << e->getMD5Text()); if (e->swap_status != SWAPOUT_WRITING && e->swap_status != SWAPOUT_DONE) { - debugs(20, 1, "storeSwapInStart: bad swap_status (" << swapStatusStr[e->swap_status] << ")"); + debugs(20, DBG_IMPORTANT, "storeSwapInStart: bad swap_status (" << swapStatusStr[e->swap_status] << ")"); return; } if (e->swap_filen < 0) { - debugs(20, 1, "storeSwapInStart: swap_filen < 0"); + debugs(20, DBG_IMPORTANT, "storeSwapInStart: swap_filen < 0"); return; } === modified file 'src/store_swapout.cc' --- src/store_swapout.cc 2012-07-13 14:33:19 +0000 +++ src/store_swapout.cc 2012-08-02 21:18:43 +0000 @@ -220,7 +220,7 @@ #if SIZEOF_OFF_T <= 4 if (mem_obj->endOffset() > 0x7FFF0000) { - debugs(20, 0, "WARNING: preventing off_t overflow for " << url()); + debugs(20, DBG_CRITICAL, "WARNING: preventing off_t overflow for " << url()); abort(); return; } === modified file 'src/tests/testCoss.cc' --- src/tests/testCoss.cc 2012-01-20 18:55:04 +0000 +++ src/tests/testCoss.cc 2012-07-31 21:45:27 +0000 @@ -4,7 +4,6 @@ #include "Store.h" #include "SwapDir.h" #include "DiskIO/DiskIOModule.h" -#include "fs/ufs/ufscommon.h" #include "fs/coss/CossSwapDir.h" #include "Mem.h" #include "MemObject.h" === modified file 'src/tests/testDiskIO.cc' --- src/tests/testDiskIO.cc 2012-01-20 18:55:04 +0000 +++ src/tests/testDiskIO.cc 2012-07-31 21:45:27 +0000 @@ -5,7 +5,6 @@ #include "Store.h" #include "SwapDir.h" #include "DiskIO/DiskIOModule.h" -#include "fs/ufs/ufscommon.h" #if 0 // AYJ: COSS in Squid-3 is disabled. #include "fs/coss/CossSwapDir.h" #endif === modified file 'src/tests/testNull.cc' --- src/tests/testNull.cc 2012-01-20 18:55:04 +0000 +++ src/tests/testNull.cc 2012-07-31 21:45:27 +0000 @@ -4,7 +4,6 @@ #include "Store.h" #include "SwapDir.h" #include "DiskIO/DiskIOModule.h" -#include "fs/ufs/ufscommon.h" #include "fs/null/store_null.h" #include "Mem.h" #include "MemObject.h" === modified file 'src/tests/testUfs.cc' --- src/tests/testUfs.cc 2012-01-20 18:55:04 +0000 +++ src/tests/testUfs.cc 2012-08-04 12:11:57 +0000 @@ -1,15 +1,15 @@ #define SQUID_UNIT_TEST 1 #include "squid.h" -#include "testUfs.h" -#include "Store.h" -#include "SwapDir.h" #include "DiskIO/DiskIOModule.h" -#include "fs/ufs/ufscommon.h" +#include "HttpHeader.h" +#include "HttpReply.h" #include "Mem.h" #include "MemObject.h" -#include "HttpHeader.h" -#include "HttpReply.h" #include "testStoreSupport.h" +#include "testUfs.h" +#include "Store.h" +#include "SwapDir.h" +#include "fs/ufs/UFSSwapDir.h" #if HAVE_STDEXCEPT #include @@ -98,7 +98,6 @@ commonInit(); mem_policy = createRemovalPolicy(Config.replPolicy); - char *path=xstrdup(TESTDIR); char *config_line=xstrdup("foo 100 1 1"); === modified file 'src/tools.cc' --- src/tools.cc 2012-07-18 15:47:58 +0000 +++ src/tools.cc 2012-08-02 21:18:43 +0000 @@ -428,7 +428,7 @@ #if !HAVE_SIGACTION if (signal(sig, sigusr2_handle) == SIG_ERR) /* reinstall */ - debugs(50, 0, "signal: sig=" << sig << " func=sigusr2_handle: " << xstrerror()); + debugs(50, DBG_CRITICAL, "signal: sig=" << sig << " func=sigusr2_handle: " << xstrerror()); #endif } @@ -698,7 +698,7 @@ #endif if (setgid(Config2.effectiveGroupID) < 0) - debugs(50, 0, "ALERT: setgid: " << xstrerror()); + debugs(50, DBG_CRITICAL, "ALERT: setgid: " << xstrerror()); } @@ -714,10 +714,10 @@ if (!Config.effectiveGroup) { if (setgid(Config2.effectiveGroupID) < 0) - debugs(50, 0, "ALERT: setgid: " << xstrerror()); + debugs(50, DBG_CRITICAL, "ALERT: setgid: " << xstrerror()); if (initgroups(Config.effectiveUser, Config2.effectiveGroupID) < 0) { - debugs(50, 0, "ALERT: initgroups: unable to set groups for User " << + debugs(50, DBG_CRITICAL, "ALERT: initgroups: unable to set groups for User " << Config.effectiveUser << " and Group " << (unsigned) Config2.effectiveGroupID << ""); } @@ -726,17 +726,17 @@ #if HAVE_SETRESUID if (setresuid(Config2.effectiveUserID, Config2.effectiveUserID, 0) < 0) - debugs(50, 0, "ALERT: setresuid: " << xstrerror()); + debugs(50, DBG_CRITICAL, "ALERT: setresuid: " << xstrerror()); #elif HAVE_SETEUID if (seteuid(Config2.effectiveUserID) < 0) - debugs(50, 0, "ALERT: seteuid: " << xstrerror()); + debugs(50, DBG_CRITICAL, "ALERT: seteuid: " << xstrerror()); #else if (setuid(Config2.effectiveUserID) < 0) - debugs(50, 0, "ALERT: setuid: " << xstrerror()); + debugs(50, DBG_CRITICAL, "ALERT: setuid: " << xstrerror()); #endif @@ -785,7 +785,7 @@ setuid(0); if (setuid(uid) < 0) - debugs(50, 1, "no_suid: setuid: " << xstrerror()); + debugs(50, DBG_IMPORTANT, "no_suid: setuid: " << xstrerror()); restoreCapabilities(0); @@ -911,7 +911,7 @@ leave_suid(); if (fd < 0) { - debugs(50, 0, "" << f << ": " << xstrerror()); + debugs(50, DBG_CRITICAL, "" << f << ": " << xstrerror()); debug_trap("Could not write pid file"); return; } @@ -1177,7 +1177,7 @@ fp = fopen(Config.etcHostsPath, "r"); if (fp == NULL) { - debugs(1, 1, "parseEtcHosts: " << Config.etcHostsPath << ": " << xstrerror()); + debugs(1, DBG_IMPORTANT, "parseEtcHosts: " << Config.etcHostsPath << ": " << xstrerror()); return; } === modified file 'src/unlinkd.cc' --- src/unlinkd.cc 2012-07-20 15:31:04 +0000 +++ src/unlinkd.cc 2012-08-02 21:10:18 +0000 @@ -124,11 +124,11 @@ bytes_written = write(unlinkd_wfd, buf, l); if (bytes_written < 0) { - debugs(2, 1, "unlinkdUnlink: write FD " << unlinkd_wfd << " failed: " << xstrerror()); + debugs(2, DBG_IMPORTANT, "unlinkdUnlink: write FD " << unlinkd_wfd << " failed: " << xstrerror()); safeunlink(path, 0); return; } else if (bytes_written != l) { - debugs(2, 1, "unlinkdUnlink: FD " << unlinkd_wfd << " only wrote " << bytes_written << " of " << l << " bytes"); + debugs(2, DBG_IMPORTANT, "unlinkdUnlink: FD " << unlinkd_wfd << " only wrote " << bytes_written << " of " << l << " bytes"); safeunlink(path, 0); return; } @@ -149,7 +149,7 @@ { if (unlinkd_wfd > -1) { - debugs(2, 1, "Closing unlinkd pipe on FD " << unlinkd_wfd); + debugs(2, DBG_IMPORTANT, "Closing unlinkd pipe on FD " << unlinkd_wfd); shutdown(unlinkd_wfd, SD_BOTH); comm_close(unlinkd_wfd); @@ -164,7 +164,7 @@ if (hIpc) { if (WaitForSingleObject(hIpc, 5000) != WAIT_OBJECT_0) { getCurrentTime(); - debugs(2, 1, "unlinkdClose: WARNING: (unlinkd," << pid << "d) didn't exit in 5 seconds"); + debugs(2, DBG_IMPORTANT, "unlinkdClose: WARNING: (unlinkd," << pid << "d) didn't exit in 5 seconds"); } CloseHandle(hIpc); @@ -176,7 +176,7 @@ if (unlinkd_wfd < 0) return; - debugs(2, 1, "Closing unlinkd pipe on FD " << unlinkd_wfd); + debugs(2, DBG_IMPORTANT, "Closing unlinkd pipe on FD " << unlinkd_wfd); file_close(unlinkd_wfd); @@ -259,7 +259,7 @@ if (FD_PIPE == fd_table[unlinkd_wfd].type) commUnsetNonBlocking(unlinkd_wfd); - debugs(2, 1, "Unlinkd pipe opened on FD " << unlinkd_wfd); + debugs(2, DBG_IMPORTANT, "Unlinkd pipe opened on FD " << unlinkd_wfd); #if _SQUID_MSWIN_ === modified file 'src/url.cc' --- src/url.cc 2012-07-23 07:02:06 +0000 +++ src/url.cc 2012-08-02 21:18:43 +0000 @@ -232,7 +232,7 @@ if ((l = strlen(url)) + Config.appendDomainLen > (MAX_URL - 1)) { /* terminate so it doesn't overflow other buffers */ *(url + (MAX_URL >> 1)) = '\0'; - debugs(23, 1, "urlParse: URL too large (" << l << " bytes)"); + debugs(23, DBG_IMPORTANT, "urlParse: URL too large (" << l << " bytes)"); return NULL; } if (method == METHOD_CONNECT) { @@ -382,7 +382,7 @@ debugs(23, 3, "urlParse: Split URL '" << url << "' into proto='" << proto << "', host='" << host << "', port='" << port << "', path='" << urlpath << "'"); if (Config.onoff.check_hostnames && strspn(host, Config.onoff.allow_underscore ? valid_hostname_chars_u : valid_hostname_chars) != strlen(host)) { - debugs(23, 1, "urlParse: Illegal character in hostname '" << host << "'"); + debugs(23, DBG_IMPORTANT, "urlParse: Illegal character in hostname '" << host << "'"); return NULL; } @@ -396,7 +396,7 @@ /* reject duplicate or leading dots */ if (strstr(host, "..") || *host == '.') { - debugs(23, 1, "urlParse: Illegal hostname '" << host << "'"); + debugs(23, DBG_IMPORTANT, "urlParse: Illegal hostname '" << host << "'"); return NULL; } @@ -409,7 +409,7 @@ /* These ports are filtered in the default squid.conf, but * maybe someone wants them hardcoded... */ if (port == 7 || port == 9 || port == 19) { - debugs(23, 0, "urlParse: Deny access to port " << port); + debugs(23, DBG_CRITICAL, "urlParse: Deny access to port " << port); return NULL; } #endif === modified file 'src/urn.cc' --- src/urn.cc 2012-07-19 13:49:54 +0000 +++ src/urn.cc 2012-08-02 21:10:18 +0000 @@ -156,7 +156,7 @@ if (rtt_ret) *rtt_ret = min_rtt; - debugs(52, 1, "urnFindMinRtt: Returning '" << + debugs(52, DBG_IMPORTANT, "urnFindMinRtt: Returning '" << (min_u ? min_u->url : "NONE") << "' RTT " << min_rtt ); @@ -360,7 +360,7 @@ k = headersEnd(buf, urnState->reqofs); if (0 == k) { - debugs(52, 1, "urnHandleReply: didn't find end-of-headers for " << e->url() ); + debugs(52, DBG_IMPORTANT, "urnHandleReply: didn't find end-of-headers for " << e->url() ); urnHandleReplyError(urnState, urlres_e); return; } === modified file 'src/wccp.cc' --- src/wccp.cc 2012-07-19 13:49:54 +0000 +++ src/wccp.cc 2012-08-02 21:10:18 +0000 @@ -162,7 +162,7 @@ Comm::SetSelect(theWccpConnection, COMM_SELECT_READ, wccpHandleUdp, NULL, 0); - debugs(80, 1, "Accepting WCCPv1 messages on " << Config.Wccp.address << ", FD " << theWccpConnection << "."); + debugs(80, DBG_IMPORTANT, "Accepting WCCPv1 messages on " << Config.Wccp.address << ", FD " << theWccpConnection << "."); // Sadly WCCP only does IPv4 @@ -186,7 +186,7 @@ wccpConnectionClose(void) { if (theWccpConnection > -1) { - debugs(80, 1, "FD " << theWccpConnection << " Closing WCCPv1 socket"); + debugs(80, DBG_IMPORTANT, "FD " << theWccpConnection << " Closing WCCPv1 socket"); comm_close(theWccpConnection); theWccpConnection = -1; } @@ -237,7 +237,7 @@ return; if (ntohl(wccp_i_see_you.number) > WCCP_ACTIVE_CACHES) { - debugs(80, 1, "Ignoring WCCP_I_SEE_YOU from " << + debugs(80, DBG_IMPORTANT, "Ignoring WCCP_I_SEE_YOU from " << from << " with number of caches set to " << (int) ntohl(wccp_i_see_you.number)); === modified file 'src/wccp2.cc' --- src/wccp2.cc 2012-07-23 07:02:06 +0000 +++ src/wccp2.cc 2012-08-02 21:18:43 +0000 @@ -642,7 +642,7 @@ /* Make sure the security type matches what we expect */ if (ntohl(ws->security_option) != srv->wccp2_security_type) { - debugs(80, 1, "wccp2_check_security: received packet has the wrong security option"); + debugs(80, DBG_IMPORTANT, "wccp2_check_security: received packet has the wrong security option"); return 0; } @@ -651,7 +651,7 @@ } if (srv->wccp2_security_type != WCCP2_MD5_SECURITY) { - debugs(80, 1, "wccp2_check_security: invalid security option"); + debugs(80, DBG_IMPORTANT, "wccp2_check_security: invalid security option"); return 0; } @@ -1015,8 +1015,8 @@ #endif Comm::SetSelect(theWccp2Connection, COMM_SELECT_READ, wccp2HandleUdp, NULL, 0); - debugs(80, 1, "Accepting WCCPv2 messages on port " << WCCP_PORT << ", FD " << theWccp2Connection << "."); - debugs(80, 1, "Initialising all WCCPv2 lists"); + debugs(80, DBG_IMPORTANT, "Accepting WCCPv2 messages on port " << WCCP_PORT << ", FD " << theWccp2Connection << "."); + debugs(80, DBG_IMPORTANT, "Initialising all WCCPv2 lists"); /* Initialise all routers on all services */ memset(&null, 0, sizeof(null)); @@ -1079,7 +1079,7 @@ } if (theWccp2Connection > -1) { - debugs(80, 1, "FD " << theWccp2Connection << " Closing WCCPv2 socket"); + debugs(80, DBG_IMPORTANT, "FD " << theWccp2Connection << " Closing WCCPv2 socket"); comm_close(theWccp2Connection); theWccp2Connection = -1; } @@ -1204,7 +1204,7 @@ offset = 0; if (data_length > len) { - debugs(80, 1, "ERROR: Malformed WCCPv2 packet claiming it's bigger than received data"); + debugs(80, DBG_IMPORTANT, "ERROR: Malformed WCCPv2 packet claiming it's bigger than received data"); return; } @@ -1220,7 +1220,7 @@ case WCCP2_SECURITY_INFO: if (security_info != NULL) { - debugs(80, 1, "Duplicate security definition"); + debugs(80, DBG_IMPORTANT, "Duplicate security definition"); return; } @@ -1230,7 +1230,7 @@ case WCCP2_SERVICE_INFO: if (service_info != NULL) { - debugs(80, 1, "Duplicate service_info definition"); + debugs(80, DBG_IMPORTANT, "Duplicate service_info definition"); return; } @@ -1240,7 +1240,7 @@ case WCCP2_ROUTER_ID_INFO: if (router_identity_info != NULL) { - debugs(80, 1, "Duplicate router_identity_info definition"); + debugs(80, DBG_IMPORTANT, "Duplicate router_identity_info definition"); return; } @@ -1250,7 +1250,7 @@ case WCCP2_RTR_VIEW_INFO: if (router_view_header != NULL) { - debugs(80, 1, "Duplicate router_view definition"); + debugs(80, DBG_IMPORTANT, "Duplicate router_view definition"); return; } @@ -1260,7 +1260,7 @@ case WCCP2_CAPABILITY_INFO: if (router_capability_header != NULL) { - debugs(80, 1, "Duplicate router_capability definition"); + debugs(80, DBG_IMPORTANT, "Duplicate router_capability definition"); return; } @@ -1274,20 +1274,20 @@ break; default: - debugs(80, 1, "Unknown record type in WCCPv2 Packet (" << ntohs(header->type) << ")."); + debugs(80, DBG_IMPORTANT, "Unknown record type in WCCPv2 Packet (" << ntohs(header->type) << ")."); } offset += sizeof(struct wccp2_item_header_t); offset += ntohs(header->length); if (offset > data_length) { - debugs(80, 1, "Error: WCCPv2 packet tried to tell us there is data beyond the end of the packet"); + debugs(80, DBG_IMPORTANT, "Error: WCCPv2 packet tried to tell us there is data beyond the end of the packet"); return; } } if ((security_info == NULL) || (service_info == NULL) || (router_identity_info == NULL) || (router_view_header == NULL)) { - debugs(80, 1, "Incomplete WCCPv2 Packet"); + debugs(80, DBG_IMPORTANT, "Incomplete WCCPv2 Packet"); return; } @@ -1305,17 +1305,17 @@ } if (service_list_ptr == NULL) { - debugs(80, 1, "WCCPv2 Unknown service received from router (" << service_info->service_id << ")"); + debugs(80, DBG_IMPORTANT, "WCCPv2 Unknown service received from router (" << service_info->service_id << ")"); return; } if (ntohl(security_info->security_option) != ntohl(service_list_ptr->security_info->security_option)) { - debugs(80, 1, "Invalid security option in WCCPv2 Packet (" << ntohl(security_info->security_option) << " vs " << ntohl(service_list_ptr->security_info->security_option) << ")."); + debugs(80, DBG_IMPORTANT, "Invalid security option in WCCPv2 Packet (" << ntohl(security_info->security_option) << " vs " << ntohl(service_list_ptr->security_info->security_option) << ")."); return; } if (!wccp2_check_security(service_list_ptr, (char *) security_info, (char *) &wccp2_i_see_you, len)) { - debugs(80, 1, "Received WCCPv2 Packet failed authentication"); + debugs(80, DBG_IMPORTANT, "Received WCCPv2 Packet failed authentication"); return; } @@ -1326,7 +1326,7 @@ } if (router_list_ptr->next == NULL) { - debugs(80, 1, "WCCPv2 Packet received from unknown router"); + debugs(80, DBG_IMPORTANT, "WCCPv2 Packet received from unknown router"); return; } @@ -1342,7 +1342,7 @@ /* TODO: check return/forwarding methods */ if (router_capability_header == NULL) { if ((Config.Wccp2.return_method != WCCP2_PACKET_RETURN_METHOD_GRE) || (Config.Wccp2.forwarding_method != WCCP2_FORWARDING_METHOD_GRE)) { - debugs(80, 1, "wccp2HandleUdp: fatal error - A WCCP router does not support the forwarding method specified, only GRE supported"); + debugs(80, DBG_IMPORTANT, "wccp2HandleUdp: fatal error - A WCCP router does not support the forwarding method specified, only GRE supported"); wccp2ConnectionClose(); return; } @@ -1359,7 +1359,7 @@ case WCCP2_CAPABILITY_FORWARDING_METHOD: if (!(ntohl(router_capability_element->capability_value) & Config.Wccp2.forwarding_method)) { - debugs(80, 1, "wccp2HandleUdp: fatal error - A WCCP router has specified a different forwarding method " << ntohl(router_capability_element->capability_value) << ", expected " << Config.Wccp2.forwarding_method); + debugs(80, DBG_IMPORTANT, "wccp2HandleUdp: fatal error - A WCCP router has specified a different forwarding method " << ntohl(router_capability_element->capability_value) << ", expected " << Config.Wccp2.forwarding_method); wccp2ConnectionClose(); return; } @@ -1369,7 +1369,7 @@ case WCCP2_CAPABILITY_ASSIGNMENT_METHOD: if (!(ntohl(router_capability_element->capability_value) & Config.Wccp2.assignment_method)) { - debugs(80, 1, "wccp2HandleUdp: fatal error - A WCCP router has specified a different assignment method " << ntohl(router_capability_element->capability_value) << ", expected "<< Config.Wccp2.assignment_method); + debugs(80, DBG_IMPORTANT, "wccp2HandleUdp: fatal error - A WCCP router has specified a different assignment method " << ntohl(router_capability_element->capability_value) << ", expected "<< Config.Wccp2.assignment_method); wccp2ConnectionClose(); return; } @@ -1379,7 +1379,7 @@ case WCCP2_CAPABILITY_RETURN_METHOD: if (!(ntohl(router_capability_element->capability_value) & Config.Wccp2.return_method)) { - debugs(80, 1, "wccp2HandleUdp: fatal error - A WCCP router has specified a different return method " << ntohl(router_capability_element->capability_value) << ", expected " << Config.Wccp2.return_method); + debugs(80, DBG_IMPORTANT, "wccp2HandleUdp: fatal error - A WCCP router has specified a different return method " << ntohl(router_capability_element->capability_value) << ", expected " << Config.Wccp2.return_method); wccp2ConnectionClose(); return; } @@ -1391,7 +1391,7 @@ break; // ignore silently for now default: - debugs(80, 1, "Unknown capability type in WCCPv2 Packet (" << ntohs(router_capability_element->capability_type) << ")."); + debugs(80, DBG_IMPORTANT, "Unknown capability type in WCCPv2 Packet (" << ntohs(router_capability_element->capability_type) << ")."); } router_capability_element = (struct wccp2_capability_element_t *) (((char *) router_capability_element) + sizeof(struct wccp2_item_header_t) + ntohs(router_capability_element->capability_length)); @@ -1551,7 +1551,7 @@ debugs(80, 6, "wccp2HereIam: Called"); if (wccp2_connected == 0) { - debugs(80, 1, "wccp2HereIam: wccp2 socket closed. Shutting down WCCP2"); + debugs(80, DBG_IMPORTANT, "wccp2HereIam: wccp2 socket closed. Shutting down WCCP2"); return; } @@ -2118,13 +2118,13 @@ char wccp_password[WCCP2_PASSWORD_LEN + 1]; if (wccp2_connected == 1) { - debugs(80, 1, "WCCPv2: Somehow reparsing the configuration without having shut down WCCP! Try reloading squid again."); + debugs(80, DBG_IMPORTANT, "WCCPv2: Somehow reparsing the configuration without having shut down WCCP! Try reloading squid again."); return; } /* Snarf the type */ if ((t = strtok(NULL, w_space)) == NULL) { - debugs(80, 0, "wccp2ParseServiceInfo: missing service info type (standard|dynamic)"); + debugs(80, DBG_CRITICAL, "wccp2ParseServiceInfo: missing service info type (standard|dynamic)"); self_destruct(); } @@ -2133,7 +2133,7 @@ } else if (strcmp(t, "dynamic") == 0) { service = WCCP2_SERVICE_DYNAMIC; } else { - debugs(80, 0, "wccp2ParseServiceInfo: bad service info type (expected standard|dynamic, got " << t << ")"); + debugs(80, DBG_CRITICAL, "wccp2ParseServiceInfo: bad service info type (expected standard|dynamic, got " << t << ")"); self_destruct(); } @@ -2302,7 +2302,7 @@ int priority = -1; if (wccp2_connected == 1) { - debugs(80, 1, "WCCPv2: Somehow reparsing the configuration without having shut down WCCP! Try reloading squid again."); + debugs(80, DBG_IMPORTANT, "WCCPv2: Somehow reparsing the configuration without having shut down WCCP! Try reloading squid again."); return; } === modified file 'test-suite/debug.cc' --- test-suite/debug.cc 2012-01-20 18:55:04 +0000 +++ test-suite/debug.cc 2012-08-02 21:10:18 +0000 @@ -81,10 +81,10 @@ if (true) debugs(1,9,"this won't compile if the macro is broken."); else - debugs(1,1,"bar"); + debugs(1, DBG_IMPORTANT,"bar"); StreamTest aStreamObject; StreamTest *streamPointer (&aStreamObject); - debugs(1,1,aStreamObject); - debugs(1,1,streamPointer->getAnInt() << " " << aStreamObject.getACString()); + debugs(1, DBG_IMPORTANT,aStreamObject); + debugs(1, DBG_IMPORTANT,streamPointer->getAnInt() << " " << aStreamObject.getACString()); return 0; } # Begin bundle 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