gh-105623 Fix performance degradation in logging RotatingFileHandler (GH-105887)

The check for whether the log file is a real file is expensive on NFS
filesystems.  This commit reorders the rollover condition checking to
not do the file type check if the expected file size is less than the
rotation threshold.

Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
This commit is contained in:
Craig Robson 2024-06-27 09:44:40 -07:00 committed by GitHub
parent 0890ad7c02
commit e9b4ec614b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 5 additions and 3 deletions

View file

@ -193,15 +193,15 @@ def shouldRollover(self, record):
Basically, see if the supplied record would cause the file to exceed Basically, see if the supplied record would cause the file to exceed
the size limit we have. the size limit we have.
""" """
# See bpo-45401: Never rollover anything other than regular files
if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename):
return False
if self.stream is None: # delay was set... if self.stream is None: # delay was set...
self.stream = self._open() self.stream = self._open()
if self.maxBytes > 0: # are we rolling over? if self.maxBytes > 0: # are we rolling over?
msg = "%s\n" % self.format(record) msg = "%s\n" % self.format(record)
self.stream.seek(0, 2) #due to non-posix-compliant Windows feature self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
if self.stream.tell() + len(msg) >= self.maxBytes: if self.stream.tell() + len(msg) >= self.maxBytes:
# See bpo-45401: Never rollover anything other than regular files
if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename):
return False
return True return True
return False return False

View file

@ -0,0 +1,2 @@
Fix performance degradation in
:class:`logging.handlers.RotatingFileHandler`. Patch by Craig Robson.