The interdiff again:
--- a/lib/jqueue/post_hooks_exec.py
+++ b/lib/jqueue/post_hooks_exec.py
@@ -28,11 +28,11 @@
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""Module implementing the executing of opcode post hooks in a separate
process
+"""Module implementing the execution of opcode post hooks in a separate
process
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.
+hooks for the last opcode whose execution started before the job process
+disappeared.
"""
@@ -89,7 +89,7 @@ def main():
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.
+ # Note that currently the opcodes inside a job execute sequentially.
if target_op is None:
sys.exit(0)
@@ -108,7 +108,8 @@ def main():
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)
+ logging.exception("Exception when trying to run post hooks of job %d",
+ job_id)
finally:
logging.debug("Post hooks exec for disappeared job %d finalized",
job_id)
logging.debug("Removing livelock file %s", livelock_name.GetPath())
On 11/24/2015 08:35 PM, Hrvoje Ribicic wrote:
LGTM with nits.
Fix patch title - executing.
On Fri, Nov 20, 2015 at 5:11 PM, 'Oleg Ponomarev' via ganeti-devel
<[email protected] <mailto:[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]
<mailto:[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 <http://job.id> == job_id, "The job id received
%d differs " % job_id + \
+ "from the serialized one %d" % job.id <http://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.