From 9172ea9e4283e5c1075213edcac081ab317302aa Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 7 Jun 2013 02:10:50 +0200 Subject: Client/Tools/POSIX: only execute needed directory installs Remember the purge actions per Path entry, so that only needed install actions are executed. --- debian/changelog | 6 ++++++ src/lib/Client/Tools/POSIX.py | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index a38c40258..4414147a1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +bcfg2 (1.2.3-15) unstable; urgency=low + + * Client/Tools/POSIX: only execute needed directory installs + + -- Alexander Sulfrian Fri, 07 Jun 2013 02:10:14 +0200 + bcfg2 (1.2.3-14) unstable; urgency=low * Client/Tools/POSIX: fix indentation diff --git a/src/lib/Client/Tools/POSIX.py b/src/lib/Client/Tools/POSIX.py index 5f380023b..dd8272749 100644 --- a/src/lib/Client/Tools/POSIX.py +++ b/src/lib/Client/Tools/POSIX.py @@ -116,7 +116,7 @@ class POSIX(Bcfg2.Client.Tools.Tool): setup.parse([]) ppath = setup['ppath'] max_copies = setup['max_copies'] - prune_list = list() + prunes = dict() def canInstall(self, entry): """Check if entry is complete for installation.""" @@ -305,7 +305,10 @@ class POSIX(Bcfg2.Client.Tools.Tool): try: entries = ['/'.join([entry.get('name'), ent]) \ for ent in os.listdir(entry.get('name'))] - ex_ents = [e for e in entries if e not in modlist and e not in self.prune_list] + prune_list = list() + if entry.get('name') in self.prunes: + prune_list = self.prunes[entry.get('name')] + ex_ents = [e for e in entries if e not in modlist and e not in prune_list] if ex_ents: pruneTrue = False self.logger.debug("Directory %s contains extra entries:" % \ @@ -318,8 +321,11 @@ class POSIX(Bcfg2.Client.Tools.Tool): entry.set('qtest', nqtext) [entry.append(XML.Element('Prune', path=x)) \ for x in ex_ents] - self.prune_list += ex_ents - elif self.prune_list: + if entry.get('name') not in self.prunes: + self.prunes[entry.get('name')] = list() + self.prunes[entry.get('name')] += ex_ents + elif entry.get('name') in self.prunes \ + and len(self.prunes[entry.get('name')]) > 0: pruneTrue = False except OSError: ex_ents = [] @@ -443,6 +449,8 @@ class POSIX(Bcfg2.Client.Tools.Tool): try: self.logger.debug("Unlinking file %s" % pname) os.unlink(pname) + if entry.get('name') in self.prunes: + self.prunes[entry.get('name')].remove(pname) except OSError: self.logger.error("Failed to unlink path %s" % pname) ulfailed = True -- cgit v1.2.3-1-g7c22