nfs4: Avoid conflicts between threads attempting to repair TCP connection

This commit is contained in:
Pawel Dziepak
2013-01-02 20:17:57 +01:00
parent 8837efd025
commit 47e68f1c7a
2 changed files with 18 additions and 1 deletions
@@ -81,12 +81,14 @@ Server::Server(Connection* connection, PeerAddress* address)
fAddress(address), fAddress(address),
fPrivateData(NULL), fPrivateData(NULL),
fCallback(NULL), fCallback(NULL),
fRepairCount(0),
fXID(rand() << 1) fXID(rand() << 1)
{ {
ASSERT(connection != NULL); ASSERT(connection != NULL);
ASSERT(address != NULL); ASSERT(address != NULL);
mutex_init(&fCallbackLock, NULL); mutex_init(&fCallbackLock, NULL);
mutex_init(&fRepairLock, NULL);
_StartListening(); _StartListening();
} }
@@ -98,6 +100,7 @@ Server::~Server()
gRPCCallbackServer->UnregisterCallback(fCallback); gRPCCallbackServer->UnregisterCallback(fCallback);
delete fCallback; delete fCallback;
mutex_destroy(&fCallbackLock); mutex_destroy(&fCallbackLock);
mutex_destroy(&fRepairLock);
delete fPrivateData; delete fPrivateData;
@@ -229,6 +232,12 @@ Server::WakeCall(Request* request)
status_t status_t
Server::Repair() Server::Repair()
{ {
uint32 thisRepair = fRepairCount;
MutexLocker _(fRepairLock);
if (fRepairCount == thisRepair)
return B_OK;
fThreadCancel = true; fThreadCancel = true;
status_t result = fConnection->Reconnect(); status_t result = fConnection->Reconnect();
@@ -236,7 +245,12 @@ Server::Repair()
return result; return result;
wait_for_thread(fThread, &result); wait_for_thread(fThread, &result);
return _StartListening(); result = _StartListening();
if (result == B_OK)
fRepairCount++;
return result;
} }
@@ -103,6 +103,9 @@ private:
mutex fCallbackLock; mutex fCallbackLock;
Callback* fCallback; Callback* fCallback;
uint32 fRepairCount;
mutex fRepairLock;
vint32 fXID; vint32 fXID;
static const bigtime_t kWaitTime = 1000000; static const bigtime_t kWaitTime = 1000000;
}; };