From a114bb5f95c819bea38c25daf2b8612269d8883a Mon Sep 17 00:00:00 2001 From: Alex Rousskov Date: Tue, 4 Mar 2014 19:49:29 -0700 Subject: [PATCH] Fixed stalled concurrent rock store reads by insuring their ID uniqueness. Added a check to prevent similar bugs from occurring in the future. --- src/DiskIO/IpcIo/IpcIoFile.cc | 14 ++++++++------ src/DiskIO/IpcIo/IpcIoFile.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/DiskIO/IpcIo/IpcIoFile.cc b/src/DiskIO/IpcIo/IpcIoFile.cc index dba711984e..12589f1d75 100644 --- a/src/DiskIO/IpcIo/IpcIoFile.cc +++ b/src/DiskIO/IpcIo/IpcIoFile.cc @@ -301,9 +301,11 @@ IpcIoFile::ioInProgress() const /// 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 result = + newerRequests->insert(std::make_pair(id, pending)); + Must(result.second); // failures means that id was not unique if (!timeoutCheckScheduled) scheduleTimeoutCheck(); } @@ -313,6 +315,7 @@ void 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); @@ -322,6 +325,8 @@ IpcIoFile::push(IpcIoPendingRequest *const pending) IpcIoMsg ipcIo; try { + if (++lastRequestId == 0) // don't use zero value as requestId + ++lastRequestId; ipcIo.requestId = lastRequestId; ipcIo.start = current_time; if (pending->readRequest) { @@ -345,7 +350,7 @@ IpcIoFile::push(IpcIoPendingRequest *const pending) 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 @@ -603,9 +608,6 @@ IpcIoMsg::IpcIoMsg(): 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 diff --git a/src/DiskIO/IpcIo/IpcIoFile.h b/src/DiskIO/IpcIo/IpcIoFile.h index 3d1409ad2b..0898721b40 100644 --- a/src/DiskIO/IpcIo/IpcIoFile.h +++ b/src/DiskIO/IpcIo/IpcIoFile.h @@ -85,7 +85,7 @@ protected: bool canWait() const; private: - void trackPendingRequest(IpcIoPendingRequest *const pending); + void trackPendingRequest(const unsigned int id, IpcIoPendingRequest *const pending); void push(IpcIoPendingRequest *const pending); IpcIoPendingRequest *dequeueRequest(const unsigned int requestId); -- 2.47.2