Fabian Deutsch has uploaded a new change for review. Change subject: utils: Add lockfile to transactions ......................................................................
utils: Add lockfile to transactions Previously multiple transaction could be run at once. Now a lock is acuired before each transaction run to enforce only one transaction urn at a time. Change-Id: I0f3bfd60f2cda41ffcf13ff6dfc224d6d2d4a3ab Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=971673 Signed-off-by: Fabian Deutsch <[email protected]> --- M ovirt-node.spec.in M src/ovirt/node/utils/__init__.py 2 files changed, 22 insertions(+), 11 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/08/15508/1 diff --git a/ovirt-node.spec.in b/ovirt-node.spec.in index a9cd42f..df169f3 100644 --- a/ovirt-node.spec.in +++ b/ovirt-node.spec.in @@ -25,6 +25,7 @@ %if %{is_systemd} BuildRequires: systemd-units %endif +BuildRequires: python-lockfile Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig diff --git a/src/ovirt/node/utils/__init__.py b/src/ovirt/node/utils/__init__.py index f0c6b95..5641f15 100644 --- a/src/ovirt/node/utils/__init__.py +++ b/src/ovirt/node/utils/__init__.py @@ -20,6 +20,8 @@ # also available at http://www.gnu.org/copyleft/gpl.html. from ovirt.node import base, exceptions import augeas as _augeas +import glob +import lockfile import time import traceback @@ -185,6 +187,10 @@ >>> txs [[<StepA 'None'>], [<StepB 'None'>]] """ + title = None + _lockfilename = "/tmp/transaction-in-progress" + _prepared_elements = None + def __init__(self, title, elements=[]): super(Transaction, self).__init__() base.Base.__init__(self) @@ -216,30 +222,34 @@ self._prepared_elements = [] return True - def __call__(self): + def run(self): self.logger.debug("Running transaction '%s'" % self) try: - self.prepare() - self.commit() + with lockfile.FileLock(self._lockfilename): + self.prepare() + self.commit() except Exception as e: - self.logger.warning("Transaction failed (%s): %s" % (e, e.message), - exc_info=True) + self.logger.exception("Transaction failed (%s): %s" % (e, + e.message)) self.abort() raise exceptions.TransactionError("Transaction failed: " + "%s" % e.message) self.logger.info("Transaction '%s' succeeded" % self) return True + def __call__(self): + self.run() + def __str__(self): - return "<%s '%s' with %s>" % (self.__class__.__name__, - self.title, list.__str__(self)) + return self.build_str(["title"], {"elements": list.__str__(self)}) def step(self): try: - self.logger.debug("Preparing transaction %s" % self) - self.prepare() - for idx, e in enumerate(self): - yield (idx, e) + with lockfile.FileLock(self._lockfilename): + self.logger.debug("Preparing transaction %s" % self) + self.prepare() + for idx, e in enumerate(self): + yield (idx, e) except Exception as e: self.logger.warning("'%s' on transaction '%s': %s - %s" % (type(e), self, e, e.message)) -- To view, visit http://gerrit.ovirt.org/15508 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0f3bfd60f2cda41ffcf13ff6dfc224d6d2d4a3ab Gerrit-PatchSet: 1 Gerrit-Project: ovirt-node Gerrit-Branch: master Gerrit-Owner: Fabian Deutsch <[email protected]> _______________________________________________ node-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/node-patches
