Parth's Session Timeout Fix in GitHub
Applies Parth’s session timeout fix to GitHub. closes: https://github.com/vmware/pyvmomi/issues/43
This commit is contained in:
@@ -1452,18 +1452,14 @@ class SessionOrientedStub(StubAdapterBase):
|
|||||||
self.retryCount = retryCount
|
self.retryCount = retryCount
|
||||||
|
|
||||||
def InvokeMethod(self, mo, info, args):
|
def InvokeMethod(self, mo, info, args):
|
||||||
|
# This retry logic is replicated in InvokeAccessor and the two copies need
|
||||||
|
# to be in sync
|
||||||
retriesLeft = self.retryCount
|
retriesLeft = self.retryCount
|
||||||
while retriesLeft > 0:
|
while retriesLeft > 0:
|
||||||
try:
|
try:
|
||||||
if self.state == self.STATE_UNAUTHENTICATED:
|
if self.state == self.STATE_UNAUTHENTICATED:
|
||||||
try:
|
self._CallLoginMethod()
|
||||||
self.lock.acquire()
|
# Invoke the method
|
||||||
if self.state == self.STATE_UNAUTHENTICATED:
|
|
||||||
self.loginMethod(self.soapStub)
|
|
||||||
self.state = self.STATE_AUTHENTICATED
|
|
||||||
finally:
|
|
||||||
self.lock.release()
|
|
||||||
|
|
||||||
status, obj = self.soapStub.InvokeMethod(mo, info, args, self)
|
status, obj = self.soapStub.InvokeMethod(mo, info, args, self)
|
||||||
except (socket.error, httplib.HTTPException, ExpatError):
|
except (socket.error, httplib.HTTPException, ExpatError):
|
||||||
if self.retryDelay and retriesLeft:
|
if self.retryDelay and retriesLeft:
|
||||||
@@ -1478,13 +1474,60 @@ class SessionOrientedStub(StubAdapterBase):
|
|||||||
# An exceptional return from the server
|
# An exceptional return from the server
|
||||||
if isinstance(obj, self.SESSION_EXCEPTIONS):
|
if isinstance(obj, self.SESSION_EXCEPTIONS):
|
||||||
# Our session might've timed out, change our state and retry.
|
# Our session might've timed out, change our state and retry.
|
||||||
self.lock.acquire()
|
self._SetStateUnauthenticated()
|
||||||
if self.state == self.STATE_AUTHENTICATED:
|
|
||||||
self.state = self.STATE_UNAUTHENTICATED
|
|
||||||
self.lock.release()
|
|
||||||
else:
|
else:
|
||||||
# It's an exception from the method that was called, send it up.
|
# It's an exception from the method that was called, send it up.
|
||||||
raise obj
|
raise obj
|
||||||
|
|
||||||
# Raise any socket/httplib errors caught above.
|
# Raise any socket/httplib errors caught above.
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
## Retrieve a managed property
|
||||||
|
#
|
||||||
|
# @param self self
|
||||||
|
# @param mo managed object
|
||||||
|
# @param info property info
|
||||||
|
def InvokeAccessor(self, mo, info):
|
||||||
|
# This retry logic is replicated in InvokeMethod and the two copies need
|
||||||
|
# to be in sync
|
||||||
|
retriesLeft = self.retryCount
|
||||||
|
while retriesLeft > 0:
|
||||||
|
try:
|
||||||
|
if self.state == self.STATE_UNAUTHENTICATED:
|
||||||
|
self._CallLoginMethod()
|
||||||
|
# Invoke the method
|
||||||
|
obj = StubAdapterBase.InvokeAccessor(self, mo, info)
|
||||||
|
except (socket.error, httplib.HTTPException, ExpatError):
|
||||||
|
if self.retryDelay and retriesLeft:
|
||||||
|
time.sleep(self.retryDelay)
|
||||||
|
retriesLeft -= 1
|
||||||
|
continue
|
||||||
|
except Exception, e:
|
||||||
|
if isinstance(e, self.SESSION_EXCEPTIONS):
|
||||||
|
# Our session might've timed out, change our state and retry.
|
||||||
|
self._SetStateUnauthenticated()
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
return obj
|
||||||
|
# Raise any socket/httplib errors caught above.
|
||||||
|
raise
|
||||||
|
|
||||||
|
## Handle the login method call
|
||||||
|
#
|
||||||
|
# This method calls the login method on the soap stub and changes the state
|
||||||
|
# to authenticated
|
||||||
|
def _CallLoginMethod(self):
|
||||||
|
try:
|
||||||
|
self.lock.acquire()
|
||||||
|
if self.state == self.STATE_UNAUTHENTICATED:
|
||||||
|
self.loginMethod(self.soapStub)
|
||||||
|
self.state = self.STATE_AUTHENTICATED
|
||||||
|
finally:
|
||||||
|
self.lock.release()
|
||||||
|
|
||||||
|
## Change the state to unauthenticated
|
||||||
|
def _SetStateUnauthenticated(self):
|
||||||
|
self.lock.acquire()
|
||||||
|
if self.state == self.STATE_AUTHENTICATED:
|
||||||
|
self.state = self.STATE_UNAUTHENTICATED
|
||||||
|
self.lock.release()
|
||||||
|
|||||||
Reference in New Issue
Block a user