@@ -27,9 +27,19 @@ class PgExceptionHandler(ExceptionHandler):
2727 _PAM_AUTHENTICATION_FAILED_MSG = "PAM authentication failed"
2828 _CONNECTION_FAILED = "connection failed"
2929 _CONSUMING_INPUT_FAILED = "consuming input failed"
30+ _CONNECTION_SOCKET_CLOSED = "connection socket closed"
3031
31- _NETWORK_ERRORS : List [str ]
32- _ACCESS_ERRORS : List [str ]
32+ _NETWORK_ERROR_MESSAGES : List [str ] = [
33+ _CONNECTION_FAILED ,
34+ _CONSUMING_INPUT_FAILED ,
35+ _CONNECTION_SOCKET_CLOSED
36+ ]
37+ _ACCESS_ERROR_MESSAGES : List [str ] = [
38+ _PASSWORD_AUTHENTICATION_FAILED_MSG ,
39+ _PAM_AUTHENTICATION_FAILED_MSG
40+ ]
41+ _NETWORK_ERROR_CODES : List [str ]
42+ _ACCESS_ERROR_CODES : List [str ]
3343
3444 def is_network_exception (self , error : Optional [Exception ] = None , sql_state : Optional [str ] = None ) -> bool :
3545 if isinstance (error , QueryTimeoutError ) or isinstance (error , ConnectionTimeout ):
@@ -43,15 +53,15 @@ def is_network_exception(self, error: Optional[Exception] = None, sql_state: Opt
4353 # getattr may throw an AttributeError if the error does not have a `sqlstate` attribute
4454 pass
4555
46- if sql_state is not None and sql_state in self ._NETWORK_ERRORS :
56+ if sql_state is not None and sql_state in self ._NETWORK_ERROR_CODES :
4757 return True
4858
4959 if isinstance (error , OperationalError ):
5060 if len (error .args ) == 0 :
5161 return False
5262 # Check the error message if this is a generic error
5363 error_msg : str = error .args [0 ]
54- return self . _CONNECTION_FAILED in error_msg or self . _CONSUMING_INPUT_FAILED in error_msg
64+ return any ( msg in error_msg for msg in self . _NETWORK_ERROR_MESSAGES )
5565
5666 return False
5767
@@ -63,7 +73,7 @@ def is_login_exception(self, error: Optional[Exception] = None, sql_state: Optio
6373 if sql_state is None and hasattr (error , "sqlstate" ) and error .sqlstate is not None :
6474 sql_state = error .sqlstate
6575
66- if sql_state is not None and sql_state in self ._ACCESS_ERRORS :
76+ if sql_state is not None and sql_state in self ._ACCESS_ERROR_CODES :
6777 return True
6878
6979 if isinstance (error , OperationalError ):
@@ -72,15 +82,14 @@ def is_login_exception(self, error: Optional[Exception] = None, sql_state: Optio
7282
7383 # Check the error message if this is a generic error
7484 error_msg : str = error .args [0 ]
75- if self ._PASSWORD_AUTHENTICATION_FAILED_MSG in error_msg \
76- or self ._PAM_AUTHENTICATION_FAILED_MSG in error_msg :
85+ if any (msg in error_msg for msg in self ._ACCESS_ERROR_MESSAGES ):
7786 return True
7887
7988 return False
8089
8190
8291class SingleAzPgExceptionHandler (PgExceptionHandler ):
83- _NETWORK_ERRORS : List [str ] = [
92+ _NETWORK_ERROR_CODES : List [str ] = [
8493 "53" , # insufficient resources
8594 "57P01" , # admin shutdown
8695 "57P02" , # crash shutdown
@@ -92,14 +101,14 @@ class SingleAzPgExceptionHandler(PgExceptionHandler):
92101 "XX" # internal error(backend)
93102 ]
94103
95- _ACCESS_ERRORS : List [str ] = [
104+ _ACCESS_ERROR_CODES : List [str ] = [
96105 "28000" , # PAM authentication errors
97106 "28P01"
98107 ]
99108
100109
101110class MultiAzPgExceptionHandler (PgExceptionHandler ):
102- _NETWORK_ERRORS : List [str ] = [
111+ _NETWORK_ERROR_CODES : List [str ] = [
103112 "28000" , # access denied during reboot, this should be considered a temporary failure
104113 "53" , # insufficient resources
105114 "57P01" , # admin shutdown
@@ -112,4 +121,4 @@ class MultiAzPgExceptionHandler(PgExceptionHandler):
112121 "XX" # internal error(backend)
113122 ]
114123
115- _ACCESS_ERRORS : List [str ] = ["28P01" ]
124+ _ACCESS_ERROR_CODES : List [str ] = ["28P01" ]
0 commit comments