nfs4: Avoid conflicts between threads attempting to repair TCP connection
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user