diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-12-27 14:10:36 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-12-27 14:10:36 -0500 |
| commit | f1a22596e2283371f2216245ac4b7ff9a0fb6a9a (patch) | |
| tree | 8562df8283a74c13fea539ae90fae252c27a8ba0 /lib/sqlalchemy/pool | |
| parent | 60e7034a7423955cd89d5624f8769d3804ca6d82 (diff) | |
| download | sqlalchemy-f1a22596e2283371f2216245ac4b7ff9a0fb6a9a.tar.gz | |
Note time passage requirement for pool.invalidate()
For Windows, time.time() may only have 16 millisecond
accuracy, so invalidation routines which compare
the time.time() of invalidate() to the time.time() when
the ConnectionRecord last connected may fail in a unit test
environment that does not pause at least this much time
since the ConnectionRecord startup. Using >= for comparison
instead of > was considered but this only leads to more confusing
results as the ConnecitonRecord goes into a re-connect loop
as time continues to not pass.
Overall, while using routines such as Python 3.7's time_ns()
might be helpful, for now make sure tests which rely on this
are marked under timing intensive and add small sleeps.
Change-Id: I1a7162e67912d22c135fa517b687a073f8fd9151
Diffstat (limited to 'lib/sqlalchemy/pool')
| -rw-r--r-- | lib/sqlalchemy/pool/base.py | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/sqlalchemy/pool/base.py b/lib/sqlalchemy/pool/base.py index db1197eec..276dfad86 100644 --- a/lib/sqlalchemy/pool/base.py +++ b/lib/sqlalchemy/pool/base.py @@ -511,6 +511,19 @@ class _ConnectionRecord(object): def get_connection(self): recycle = False + + # NOTE: the various comparisons here are assuming that measurable time + # passes between these state changes. however, time.time() is not + # guaranteed to have sub-second precision. comparisons of + # "invalidation time" to "starttime" should perhaps use >= so that the + # state change can take place assuming no measurable time has passed, + # however this does not guarantee correct behavior here as if time + # continues to not pass, it will try to reconnect repeatedly until + # these timestamps diverge, so in that sense using > is safer. Per + # https://stackoverflow.com/a/1938096/34549, Windows time.time() may be + # within 16 milliseconds accuracy, so unit tests for connection + # invalidation need a sleep of at least this long between initial start + # time and invalidation for the logic below to work reliably. if self.connection is None: self.info.clear() self.__connect() |
