From c352949cd38bcb78459c679a7161f77833df0d7f Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 15 Feb 2021 14:29:38 +0100 Subject: [PATCH] PICARD-2088: Override QSettings config file syncing As the default implementation for synchronizing the config file can lead to application freezes override it. Ensure the config file is not updated by more than one process by locking the file using fasteners. --- picard/config.py | 15 +++++++++++++++ requirements-macos-10.12.txt | 1 + requirements-macos-10.14.txt | 1 + requirements-win.txt | 1 + requirements.txt | 1 + 5 files changed, 19 insertions(+) diff --git a/picard/config.py b/picard/config.py index 9c77362e5..be1c31d10 100644 --- a/picard/config.py +++ b/picard/config.py @@ -32,6 +32,8 @@ import os import shutil import threading +import fasteners + from PyQt5 import QtCore from picard import ( @@ -129,6 +131,7 @@ class Config(QtCore.QSettings): """Common initializer method for :meth:`from_app` and :meth:`from_file`.""" + self.setAtomicSyncRequired(False) self.application = ConfigSection(self, "application") self.setting = ConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") @@ -139,6 +142,18 @@ class Config(QtCore.QSettings): self._version = Version.from_string(self.application["version"]) self._upgrade_hooks = dict() + def event(self, event): + if event.type() == QtCore.QEvent.UpdateRequest: + log.debug('Config file update requested on thread %r', threading.get_ident()) + self.sync() + return True + else: + return super().event(event) + + def sync(self): + with fasteners.InterProcessLock(self.fileName()): + super().sync() + @classmethod def from_app(cls, parent): """Build a Config object using the default configuration file diff --git a/requirements-macos-10.12.txt b/requirements-macos-10.12.txt index 4dadc134b..30a04c0c8 100644 --- a/requirements-macos-10.12.txt +++ b/requirements-macos-10.12.txt @@ -1,5 +1,6 @@ python-dateutil==2.8.1 discid==1.2.0 +fasteners==0.16 markdown==3.2.2 mutagen==1.45.1 pyobjc-core==6.2.2 diff --git a/requirements-macos-10.14.txt b/requirements-macos-10.14.txt index c92cd4385..d5ff30c0e 100644 --- a/requirements-macos-10.14.txt +++ b/requirements-macos-10.14.txt @@ -1,5 +1,6 @@ python-dateutil==2.8.1 discid==1.2.0 +fasteners==0.16 markdown==3.2.2 mutagen==1.45.1 pyobjc-core==6.2.2 diff --git a/requirements-win.txt b/requirements-win.txt index b67811b21..0ff66fec5 100644 --- a/requirements-win.txt +++ b/requirements-win.txt @@ -1,5 +1,6 @@ python-dateutil==2.8.1 discid==1.2.0 +fasteners==0.16 markdown==3.2.2 mutagen==1.45.1 PyQt5==5.15.2 diff --git a/requirements.txt b/requirements.txt index 86b7ecfed..1e4ce674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ python-dateutil>=2.7.3 discid +fasteners markdown mutagen>=1.37 pyobjc-core<7.0; sys_platform == 'darwin'