/// track a new pending request
void
-IpcIoFile::trackPendingRequest(IpcIoPendingRequest *const pending)
+IpcIoFile::trackPendingRequest(const unsigned int id, IpcIoPendingRequest *const pending)
{
- newerRequests->insert(std::make_pair(lastRequestId, pending));
+ const std::pair<RequestMap::iterator,bool> result =
+ newerRequests->insert(std::make_pair(id, pending));
+ Must(result.second); // failures means that id was not unique
if (!timeoutCheckScheduled)
scheduleTimeoutCheck();
}
IpcIoFile::push(IpcIoPendingRequest *const pending)
{
// prevent queue overflows: check for responses to earlier requests
+ // warning: this call may result in indirect push() recursion
HandleResponses("before push");
debugs(47, 7, HERE);
IpcIoMsg ipcIo;
try {
+ if (++lastRequestId == 0) // don't use zero value as requestId
+ ++lastRequestId;
ipcIo.requestId = lastRequestId;
ipcIo.start = current_time;
if (pending->readRequest) {
if (queue->push(diskId, ipcIo))
Notify(diskId); // must notify disker
- trackPendingRequest(pending);
+ trackPendingRequest(ipcIo.requestId, pending);
} catch (const Queue::Full &) {
debugs(47, DBG_IMPORTANT, "Worker I/O push queue overflow: " <<
SipcIo(KidIdentifier, ipcIo, diskId)); // TODO: report queue len
IpcIoPendingRequest::IpcIoPendingRequest(const IpcIoFile::Pointer &aFile):
file(aFile), readRequest(NULL), writeRequest(NULL)
{
- Must(file != NULL);
- if (++file->lastRequestId == 0) // don't use zero value as requestId
- ++file->lastRequestId;
}
void