From: Zac Medico <zmedico@gentoo.org>
To: gentoo-portage-dev@lists.gentoo.org
Cc: Zac Medico <zmedico@gentoo.org>
Subject: [gentoo-portage-dev] [PATCH] postsync: skip hooks and metadata-transfer when appropriate (bug 564988)
Date: Thu, 5 Nov 2015 23:44:38 -0800 [thread overview]
Message-ID: <1446795878-24665-1-git-send-email-zmedico@gentoo.org> (raw)
Fix flaws in logic involving the updatecache_flg variable. Use this
variable to skip hooks and metadata-transfer when sync fails (or the
server timestamp has not changed).
X-Gentoo-Bug: 564988
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=564988
---
pym/portage/emaint/modules/sync/sync.py | 15 ++++++++++-----
pym/portage/sync/controller.py | 3 ++-
pym/portage/sync/modules/rsync/rsync.py | 17 ++++++++++-------
3 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/pym/portage/emaint/modules/sync/sync.py b/pym/portage/emaint/modules/sync/sync.py
index 57c779d..faa20d9 100644
--- a/pym/portage/emaint/modules/sync/sync.py
+++ b/pym/portage/emaint/modules/sync/sync.py
@@ -232,16 +232,19 @@ class SyncRepos(object):
sync_scheduler.wait()
retvals = sync_scheduler.retvals
msgs.extend(sync_scheduler.msgs)
+ updatecache_flg = sync_scheduler.updatecache_flg
- # run the post_sync_hook one last time for
- # run only at sync completion hooks
- rcode = sync_manager.perform_post_sync_hook('')
if retvals:
msgs.extend(self.rmessage(retvals, 'sync'))
else:
msgs.extend(self.rmessage([('None', os.EX_OK)], 'sync'))
- if rcode:
- msgs.extend(self.rmessage([('None', rcode)], 'post-sync'))
+
+ if updatecache_flg:
+ # run the post_sync_hook one last time for
+ # run only at sync completion hooks
+ rcode = sync_manager.perform_post_sync_hook('')
+ if rcode:
+ msgs.extend(self.rmessage([('None', rcode)], 'post-sync'))
# Reload the whole config.
portage._sync_mode = False
@@ -321,6 +324,7 @@ class SyncScheduler(AsyncScheduler):
self._init_graph()
self.retvals = []
self.msgs = []
+ self.updatecache_flg = False
def _init_graph(self):
'''
@@ -350,6 +354,7 @@ class SyncScheduler(AsyncScheduler):
returncode = task.returncode
if task.returncode == os.EX_OK:
returncode, message, updatecache_flg = task.result
+ self.updatecache_flg |= updatecache_flg
if message:
self.msgs.append(message)
repo = task.kwargs['repo'].name
diff --git a/pym/portage/sync/controller.py b/pym/portage/sync/controller.py
index e8132c2..1beb545 100644
--- a/pym/portage/sync/controller.py
+++ b/pym/portage/sync/controller.py
@@ -156,7 +156,8 @@ class SyncManager(object):
taskmaster = TaskHandler(callback=self.do_callback)
taskmaster.run_tasks(tasks, func, status, options=task_opts)
- self.perform_post_sync_hook(repo.name, repo.sync_uri, repo.location)
+ if self.updatecache_flg:
+ self.perform_post_sync_hook(repo.name, repo.sync_uri, repo.location)
return self.exitcode, None, self.updatecache_flg
diff --git a/pym/portage/sync/modules/rsync/rsync.py b/pym/portage/sync/modules/rsync/rsync.py
index 8ae8a5c..e0f76b3 100644
--- a/pym/portage/sync/modules/rsync/rsync.py
+++ b/pym/portage/sync/modules/rsync/rsync.py
@@ -112,10 +112,10 @@ class RsyncSync(NewBase):
if syncuri.startswith("file://"):
self.proto = "file"
dosyncuri = syncuri[6:]
- is_synced, exitcode = self._do_rsync(
+ is_synced, exitcode, updatecache_flg = self._do_rsync(
dosyncuri, timestamp, opts)
self._process_exitcode(exitcode, dosyncuri, out, 1)
- return (exitcode, exitcode == os.EX_OK)
+ return (exitcode, updatecache_flg)
retries=0
try:
@@ -138,7 +138,7 @@ class RsyncSync(NewBase):
else:
# getaddrinfo needs the brackets stripped
getaddrinfo_host = hostname[1:-1]
- updatecache_flg=True
+ updatecache_flg = False
all_rsync_opts = set(self.rsync_opts)
all_rsync_opts.update(self.extra_rsync_opts)
@@ -240,7 +240,8 @@ class RsyncSync(NewBase):
if dosyncuri.startswith('ssh://'):
dosyncuri = dosyncuri[6:].replace('/', ':/', 1)
- is_synced, exitcode = self._do_rsync(dosyncuri, timestamp, opts)
+ is_synced, exitcode, updatecache_flg = self._do_rsync(
+ dosyncuri, timestamp, opts)
if is_synced:
break
@@ -251,7 +252,6 @@ class RsyncSync(NewBase):
else:
# over retries
# exit loop
- updatecache_flg=False
exitcode = EXCEEDED_MAX_RETRIES
break
self._process_exitcode(exitcode, dosyncuri, out, maxretries)
@@ -382,6 +382,7 @@ class RsyncSync(NewBase):
def _do_rsync(self, syncuri, timestamp, opts):
+ updatecache_flg = False
is_synced = False
if timestamp != 0 and "--quiet" not in opts:
print(">>> Checking server timestamp ...")
@@ -489,7 +490,7 @@ class RsyncSync(NewBase):
print(">>> In order to force sync, remove '%s'." % self.servertimestampfile)
print(">>>")
print()
- return is_synced, exitcode
+ return is_synced, exitcode, updatecache_flg
elif (servertimestamp != 0) and (servertimestamp < timestamp):
self.logger(self.xterm_titles,
">>> Server out of date: %s" % syncuri)
@@ -543,6 +544,8 @@ class RsyncSync(NewBase):
os.unlink(self.servertimestampfile)
except OSError:
pass
+ else:
+ updatecache_flg = True
if exitcode in [0,1,3,4,11,14,20,21]:
is_synced = True
@@ -554,4 +557,4 @@ class RsyncSync(NewBase):
# --prune-empty-directories. Retry for a server that supports
# at least rsync protocol version 29 (>=rsync-2.6.4).
pass
- return is_synced, exitcode
+ return is_synced, exitcode, updatecache_flg
--
2.4.9
next reply other threads:[~2015-11-06 7:45 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-06 7:44 Zac Medico [this message]
2015-11-06 7:50 ` [gentoo-portage-dev] [PATCH] postsync: skip hooks and metadata-transfer when appropriate (bug 564988) Alexander Berntsen
2015-11-06 8:05 ` Michał Górny
2015-11-06 8:20 ` Alexander Berntsen
2015-11-06 17:24 ` Zac Medico
2015-11-06 18:39 ` Michał Górny
2015-11-06 18:58 ` Zac Medico
2015-11-06 19:34 ` Michał Górny
2015-11-06 19:49 ` Zac Medico
2015-11-06 20:19 ` Michał Górny
2015-11-06 20:28 ` Zac Medico
2015-11-06 18:54 ` Brian Dolbec
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1446795878-24665-1-git-send-email-zmedico@gentoo.org \
--to=zmedico@gentoo.org \
--cc=gentoo-portage-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox