You are viewing a plain text version of this content. The canonical link for it is here.
Posted to tashi-commits@incubator.apache.org by st...@apache.org on 2010/01/05 21:38:46 UTC

svn commit: r896233 - in /incubator/tashi/trunk: Makefile src/utils/nmd.py

Author: stroucki
Date: Tue Jan  5 21:38:45 2010
New Revision: 896233

URL: http://svn.apache.org/viewvc?rev=896233&view=rev
Log:
convert nmd to be a python script


Added:
    incubator/tashi/trunk/src/utils/nmd.py   (with props)
Modified:
    incubator/tashi/trunk/Makefile

Modified: incubator/tashi/trunk/Makefile
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/Makefile?rev=896233&r1=896232&r2=896233&view=diff
==============================================================================
--- incubator/tashi/trunk/Makefile (original)
+++ incubator/tashi/trunk/Makefile Tue Jan  5 21:38:45 2010
@@ -52,13 +52,18 @@
 	if test -e src/tashi/aws/wsdl/2009-04-04.ec2.wsdl; then echo Removing aws...; rm -f src/tashi/aws/wsdl/2009-04-04.ec2.wsdl; rm -f src/tashi/aws/wsdl/AmazonEC2_*.py; fi
 
 # Implicit builds
-src/utils/nmd: src/utils/Makefile src/utils/nmd.c
-	@echo Building nmd...
-	(cd src/utils; make)
-	ln -s ../src/utils/nmd ./bin/nmd
+# src/utils/nmd: src/utils/Makefile src/utils/nmd.c
+#	@echo Building nmd...
+#	(cd src/utils; make)
+#	ln -s ../src/utils/nmd ./bin/nmd
 
+src/utils/nmd: src/utils/nmd.py
+	ln -s ../src/utils/nmd.py ./bin/nmd.py
+
+#rmnmd:
+#	if test -e src/utils/nmd; then echo Removing nmd...; (cd src/utils; make clean); rm -f bin/nmd; fi
 rmnmd:
-	if test -e src/utils/nmd; then echo Removing nmd...; (cd src/utils; make clean); rm -f bin/nmd; fi
+	echo Removing nmd...; rm -f bin/nmd.py
 
 bin: bindir bin/clustermanager.py bin/nodemanager.py bin/tashi-client.py bin/primitive.py
 bindir:

Added: incubator/tashi/trunk/src/utils/nmd.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/utils/nmd.py?rev=896233&view=auto
==============================================================================
--- incubator/tashi/trunk/src/utils/nmd.py (added)
+++ incubator/tashi/trunk/src/utils/nmd.py Tue Jan  5 21:38:45 2010
@@ -0,0 +1,116 @@
+#!/usr/bin/python
+"""
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+"""
+
+import os
+import sys
+import getopt
+import subprocess
+import time
+
+SLEEP_INTERVAL=10
+TASHI_PATH="/usr/local/tashi/"
+LOG_FILE="/var/log/nodemanager.log"
+
+"""
+/* This function changes (on Linux!) its oom scoring, to make it
+ * unattractive to kill
+ */
+"""
+def make_invincible():
+   # dependent on linux
+   try:
+      oom_adj_fd = os.open("/proc/self/oom_adj", os.O_WRONLY)
+   except IOError:
+      pass
+   else:
+      os.write(oom_adj_fd, "-17\n")
+      os.close(oom_adj_fd)
+
+"""
+/* This function resets (on Linux!) its oom scoring to default
+ */
+"""
+def make_vulnerable():
+   # dependent on linux
+   try:
+      oom_adj_fd = os.open("/proc/self/oom_adj", os.O_WRONLY)
+   except IOError:
+      pass
+   else:
+      os.write(oom_adj_fd, "0\n")
+      os.close(oom_adj_fd)
+
+def main(argv=None):
+   if argv is None:
+      argv = sys.argv
+   try:
+      opts, args = getopt.getopt(argv[1:], "f", ["foreground"])
+   except getopt.GetoptError, err:
+      # print help information and exit:
+      print str(err) # will print something like "option -a not recognized"
+      # usage()
+      return 2
+   foreground = False
+   for o, a in opts:
+      if o in ("-f", "--foreground"):
+         foreground = True
+      else:
+         assert False, "unhandled option"
+   if foreground == False:
+      pid = os.fork();
+      if pid != 0:
+         os._exit(0)
+      os.close(0)
+      os.close(1)
+      os.close(2)
+
+   # adjust oom preference
+   make_invincible()
+
+   # configure environment of children
+   env = {"PYTHONPATH":TASHI_PATH+"/src"}
+   while True:
+      pid = os.fork();
+      if pid == 0:
+         # child
+         # nodemanagers are vulnerable, not the supervisor
+         make_vulnerable()
+         if foreground == False:
+            try:
+               lfd = os.open(LOG_FILE, os.O_APPEND|os.O_CREAT|os.O_WRONLY)
+            except IOError:
+               lfd = os.open("/dev/null", os.O_WRONLY)
+            # make this fd stdout and stderr
+            os.dup2(lfd, 1)
+            os.dup2(lfd, 2)
+            # close stdin
+            os.close(0)
+         os.chdir(TASHI_PATH)
+         os.execle("./bin/nodemanager.py", "./bin/nodemanager.py", env)
+         os._exit(-1)
+      # sleep before checking child status
+      time.sleep(SLEEP_INTERVAL)
+      os.waitpid(pid, 0)
+   return 0
+
+if __name__ == "__main__":
+   sys.exit(main())

Propchange: incubator/tashi/trunk/src/utils/nmd.py
------------------------------------------------------------------------------
    svn:executable = *