LGTM with nits. Fix patch title - executing.
On Fri, Nov 20, 2015 at 5:11 PM, 'Oleg Ponomarev' via ganeti-devel < [email protected]> wrote: > Implement ppost_hooks_exec.py which has already been reffered to by > s/reffered/referred/ > forkPostHooksProcess. This python process will be used in order to > run global POST hooks for opcodes whose processes have disappeared. > > Signed-off-by: Oleg Ponomarev <[email protected]> > --- > Makefile.am | 3 +- > lib/jqueue/post_hooks_exec.py | 120 > ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 122 insertions(+), 1 deletion(-) > create mode 100644 lib/jqueue/post_hooks_exec.py > > diff --git a/Makefile.am b/Makefile.am > index a721089..8ba84a5 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -546,7 +546,8 @@ hypervisor_hv_kvm_PYTHON = \ > > jqueue_PYTHON = \ > lib/jqueue/__init__.py \ > - lib/jqueue/exec.py > + lib/jqueue/exec.py \ > + lib/jqueue/post_hooks_exec.py > > storage_PYTHON = \ > lib/storage/__init__.py \ > diff --git a/lib/jqueue/post_hooks_exec.py b/lib/jqueue/post_hooks_exec.py > new file mode 100644 > index 0000000..97a236f > --- /dev/null > +++ b/lib/jqueue/post_hooks_exec.py > @@ -0,0 +1,120 @@ > +# > +# > + > +# Copyright (C) 2015 Google Inc. > +# All rights reserved. > +# > +# Redistribution and use in source and binary forms, with or without > +# modification, are permitted provided that the following conditions are > +# met: > +# > +# 1. Redistributions of source code must retain the above copyright > notice, > +# this list of conditions and the following disclaimer. > +# > +# 2. Redistributions in binary form must reproduce the above copyright > +# notice, this list of conditions and the following disclaimer in the > +# documentation and/or other materials provided with the distribution. > +# > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED > +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, > +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, > +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR > +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING > +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS > +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + > + > +"""Module implementing the executing of opcode post hooks in a separate > process > s/executing/execution/ > + > +This process receives the job_id from the master process and runs global > post > +hooks for the last opcode whose executon has started before the job > process > +disappear. > whose execution started before the job process disappeared. > + > +""" > + > +import contextlib > +import logging > +import os > +import sys > + > +from ganeti import constants > +from ganeti import hooksmaster > +from ganeti import pathutils > +from ganeti import utils > +from ganeti.jqueue import JobQueue > +from ganeti.rpc import transport > +from ganeti.server import masterd > +from ganeti.utils import livelock > + > + > +def _GetMasterInfo(): > + """Retrieve the job id from the master process > + > + This also closes standard input/output > + > + @rtype: int > + > + """ > + logging.debug("Reading job id from the master process") > + logging.debug("Opening transport over stdin/out") > + with contextlib.closing(transport.FdTransport((0, 1))) as trans: > + job_id = int(trans.Call("")) > + logging.debug("Got job id %d", job_id) > + return job_id > + > + > +def main(): > + > + debug = int(os.environ["GNT_DEBUG"]) > + > + logname = pathutils.GetLogFilename("jobs") > + utils.SetupLogging(logname, "job-post-hooks-startup", debug=debug) > + job_id = _GetMasterInfo() > + utils.SetupLogging(logname, "job-%s-post-hooks" % (job_id,), > debug=debug) > + > + try: > + job = JobQueue.SafeLoadJobFromDisk(None, job_id, try_archived=False, > + writable=False) > + assert job.id == job_id, "The job id received %d differs " % job_id > + \ > + "from the serialized one %d" % job.id > + > + target_op = None > + for op in job.ops: > + if op.start_timestamp is None: > + break > + target_op = op > + > + # We should run post hooks only if opcode execution has been started. > + # Note, that currently the opcodes inside a job execute sequentially. > s/,// > + if target_op is None: > + sys.exit(0) > + > + livelock_name = livelock.LiveLockName("post-hooks-executor-%d" % > job_id) > + context = masterd.GanetiContext(livelock_name) > + cfg_tmp = context.GetConfig(job_id) > + # Get static snapshot of the config and release it in order to prevent > + # further synchronizations. > + cfg = cfg_tmp.GetDetachedConfig() > + cfg_tmp.OutDate() > + > + hooksmaster.ExecGlobalPostHooks(target_op.input.OP_ID, > + cfg.GetMasterNodeName(), > + context.GetRpc(cfg).call_hooks_runner, > + logging.warning, cfg.GetClusterName(), > + cfg.GetMasterNode(), job_id, > + constants.POST_HOOKS_STATUS_DISAPPEAR) > + except Exception: # pylint: disable=W0703 > + logging.exception("Exception when trying to run job post hooks %d", > job_id) > s/job post hooks %d/post hooks of job %d/ > + finally: > + logging.debug("Post hooks exec for disappeared job %d finalized", > job_id) > + logging.debug("Removing livelock file %s", livelock_name.GetPath()) > + os.remove(livelock_name.GetPath()) > + > + sys.exit(0) > + > +if __name__ == '__main__': > + main() > -- > 2.6.0.rc2.230.g3dd15c0 > > Hrvoje Ribicic Ganeti Engineering Google Germany GmbH Dienerstr. 12, 80331, München Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen Sie die E-Mail und alle Anhänge. Vielen Dank. This e-mail is confidential. If you are not the right addressee please do not forward it, please inform the sender, and please erase this e-mail including any attachments. Thanks.
