/* Flush all pending I/O */ void aioSync(SwapDir * SD) { if (!initialised) return; /* nothing to do then */ /* Flush all pending operations */ debug(32, 1) ("aioSync: flushing pending I/O operations\n"); do { aioCheckCallbacks(SD); } while (squidaio_sync()); debug(32, 1) ("aioSync: done\n"); }
static void squidaio_queue_request(squidaio_request_t * request) { static int high_start = 0; debug(43, 9) ("squidaio_queue_request: %p type=%d result=%p\n", request, request->request_type, request->resultp); /* Mark it as not executed (failing result, no error) */ request->ret = -1; request->err = 0; /* Internal housekeeping */ request_queue_len += 1; request->resultp->_data = request; /* Play some tricks with the request_queue2 queue */ request->next = NULL; if (!request_queue2.head) { if (WaitForSingleObject(request_queue.mutex, 0) == WAIT_OBJECT_0) { /* Normal path */ *request_queue.tailp = request; request_queue.tailp = &request->next; if (!SetEvent(request_queue.cond)) fatal("couldn't push queue\n"); if (!ReleaseMutex(request_queue.mutex)) { /* unexpected error */ fatal("couldn't push queue\n"); } } else { /* Oops, the request queue is blocked, use request_queue2 */ *request_queue2.tailp = request; request_queue2.tailp = &request->next; } } else { /* Secondary path. We have blocked requests to deal with */ /* add the request to the chain */ *request_queue2.tailp = request; if (WaitForSingleObject(request_queue.mutex, 0) == WAIT_OBJECT_0) { /* Ok, the queue is no longer blocked */ *request_queue.tailp = request_queue2.head; request_queue.tailp = &request->next; if (!SetEvent(request_queue.cond)) fatal("couldn't push queue\n"); if (!ReleaseMutex(request_queue.mutex)) { /* unexpected error */ fatal("couldn't push queue\n"); } request_queue2.head = NULL; request_queue2.tailp = &request_queue2.head; } else { /* still blocked, bump the blocked request chain */ request_queue2.tailp = &request->next; } } if (request_queue2.head) { static int filter = 0; static int filter_limit = 8; if (++filter >= filter_limit) { filter_limit += filter; filter = 0; debug(43, 1) ("squidaio_queue_request: WARNING - Queue congestion\n"); } } /* Warn if out of threads */ if (request_queue_len > MAGIC1) { static int last_warn = 0; static int queue_high, queue_low; if (high_start == 0) { high_start = squid_curtime; queue_high = request_queue_len; queue_low = request_queue_len; } if (request_queue_len > queue_high) queue_high = request_queue_len; if (request_queue_len < queue_low) queue_low = request_queue_len; if (squid_curtime >= (last_warn + 15) && squid_curtime >= (high_start + 5)) { debug(43, 1) ("squidaio_queue_request: WARNING - Disk I/O overloading\n"); if (squid_curtime >= (high_start + 15)) debug(43, 1) ("squidaio_queue_request: Queue Length: current=%d, high=%d, low=%d, duration=%ld\n", request_queue_len, queue_high, queue_low, (long int) (squid_curtime - high_start)); last_warn = squid_curtime; } } else { high_start = 0; } /* Warn if seriously overloaded */ if (request_queue_len > RIDICULOUS_LENGTH) { debug(43, 0) ("squidaio_queue_request: Async request queue growing uncontrollably!\n"); debug(43, 0) ("squidaio_queue_request: Syncing pending I/O operations.. (blocking)\n"); squidaio_sync(); debug(43, 0) ("squidaio_queue_request: Synced\n"); } } /* squidaio_queue_request */