[rhel7/master] Check for ready before baseRepo in completed (#1044985)
David Lehman
dlehman at redhat.com
Fri Dec 20 20:07:08 UTC 2013
On Thu, 2013-12-19 at 16:48 -0800, Brian C. Lane wrote:
> From: "Brian C. Lane" <bcl at redhat.com>
>
> The completed spoke method can be called before the spoke has finished
> initializing itself in cases where the spoke launches its initialize
> method in a thread. This can lead to attributes being accessed before
> they are ready (namely yum related items).
>
> This adds a check for self.ready to the source and software completed
> methods and re-orders the checks so that ready will short out access to
> problem attributes like baseRepo.
>
> It also adds some warning docstrings so we don't forget why this can
> be a problem.
>
> Resolves: rhbz#1044985
ACK
> ---
> pyanaconda/ui/common.py | 4 ++++
> pyanaconda/ui/gui/spokes/__init__.py | 4 ++++
> pyanaconda/ui/gui/spokes/source.py | 5 ++++-
> pyanaconda/ui/tui/spokes/software.py | 12 ++++++++----
> pyanaconda/ui/tui/spokes/source.py | 2 +-
> 5 files changed, 21 insertions(+), 6 deletions(-)
>
> diff --git a/pyanaconda/ui/common.py b/pyanaconda/ui/common.py
> index 6fc51ae..f73f3d2 100644
> --- a/pyanaconda/ui/common.py
> +++ b/pyanaconda/ui/common.py
> @@ -282,6 +282,10 @@ class Spoke(UIObject):
> spoke, and a highlighted message will be shown at the bottom of the
> Hub. Installation will not be allowed to proceed until all mandatory
> spokes are complete.
> +
> + WARNING: This can be called before the spoke is finished initializing
> + if the spoke starts a thread. It should make sure it doesn't access
> + things until they are completely setup.
> """
> return False
>
> diff --git a/pyanaconda/ui/gui/spokes/__init__.py b/pyanaconda/ui/gui/spokes/__init__.py
> index c1a35b3..3581668 100644
> --- a/pyanaconda/ui/gui/spokes/__init__.py
> +++ b/pyanaconda/ui/gui/spokes/__init__.py
> @@ -43,6 +43,10 @@ class Spoke(GUIObject):
> icon will be shown on the Hub beside the spoke, and a highlighted
> message will be shown at the bottom of the Hub. Installation will not
> be allowed to proceed until all spokes are complete.
> +
> + WARNING: This can be called before the spoke is finished initializing
> + if the spoke starts a thread. It should make sure it doesn't access
> + things until they are completely setup.
> """
> return False
>
> diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
> index 67aeab3..431acf1 100644
> --- a/pyanaconda/ui/gui/spokes/source.py
> +++ b/pyanaconda/ui/gui/spokes/source.py
> @@ -485,7 +485,10 @@ class SourceSpoke(NormalSpoke):
>
> @property
> def completed(self):
> - if flags.automatedInstall and (not self.data.method.method or not self.payload.baseRepo):
> + """ WARNING: This can be called before _initialize is done, make sure that it
> + doesn't access things that are not setup (eg. payload.*) until it is ready
> + """
> + if flags.automatedInstall and self.ready and (not self.data.method.method or not self.payload.baseRepo):
> return False
> else:
> return not self._error and self.ready and (self.data.method.method or self.payload.baseRepo)
> diff --git a/pyanaconda/ui/tui/spokes/software.py b/pyanaconda/ui/tui/spokes/software.py
> index 3c88445..e1ecfae 100644
> --- a/pyanaconda/ui/tui/spokes/software.py
> +++ b/pyanaconda/ui/tui/spokes/software.py
> @@ -103,14 +103,18 @@ class SoftwareSpoke(NormalTUISpoke):
>
> @property
> def completed(self):
> - """ Make sure our threads are done running and vars are set. """
> - processingDone = not threadMgr.get(THREAD_CHECK_SOFTWARE) and \
> - not self.errors and self.txid_valid
> + """ Make sure our threads are done running and vars are set.
> +
> + WARNING: This can be called before the spoke is finished initializing
> + if the spoke starts a thread. It should make sure it doesn't access
> + things until they are completely setup.
> + """
> + processingDone = self.ready and not self.errors and self.txid_valid
>
> if flags.automatedInstall:
> return processingDone and self.payload.baseRepo and self.data.packages.seen
> else:
> - return self.payload.baseRepo and self.environment is not None and processingDone
> + return processingDone and self.payload.baseRepo and self.environment is not None
>
> def refresh(self, args=None):
> """ Refresh screen. """
> diff --git a/pyanaconda/ui/tui/spokes/source.py b/pyanaconda/ui/tui/spokes/source.py
> index b1aed2d..aefdb0f 100644
> --- a/pyanaconda/ui/tui/spokes/source.py
> +++ b/pyanaconda/ui/tui/spokes/source.py
> @@ -221,7 +221,7 @@ class SourceSpoke(SourceSwitchHandler, EditTUISpoke):
>
> @property
> def completed(self):
> - if flags.automatedInstall and (not self.data.method.method or not self.payload.baseRepo):
> + if flags.automatedInstall and self.ready and (not self.data.method.method or not self.payload.baseRepo):
> return False
> else:
> return not self.errors and self.ready and (self.data.method.method or self.payload.baseRepo)
More information about the anaconda-patches
mailing list