From bebf68d376c1538999e57c41b95b7064a01e28dc Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Fri, 14 May 2010 08:45:53 +0100
Subject: [PATCH] ganeti-noded: add the --no-mlock option

While mlock on noded is definitely good in most situations, there are
some - namely my laptop - where it has no benefit, and uses precious
non-swappable memory. To avoid this we make it optional, with a new
--no-mlock option. Note that only the main node daemon and its http
children are affected: the powercycle node child still uses mlock, which
doesn't harm, since it's a short lived process happening just before
node reboot anyway. The manpage is updated.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Luca Bigliardi <shammash@google.com>
---
 daemons/ganeti-noded  | 12 ++++++++++--
 man/ganeti-noded.sgml |  7 +++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded
index 76fcb1b42..e40771cb6 100755
--- a/daemons/ganeti-noded
+++ b/daemons/ganeti-noded
@@ -844,7 +844,11 @@ def ExecNoded(options, _):
   """Main node daemon function, executed with the PID file held.
 
   """
-  utils.Mlockall()
+  if options.mlock:
+    utils.Mlockall()
+    request_executor_class = MlockallRequestExecutor
+  else:
+    request_executor_class = http.server.HttpServerRequestExecutor
 
   # Read SSL certificate
   if options.ssl:
@@ -863,7 +867,7 @@ def ExecNoded(options, _):
   mainloop = daemon.Mainloop()
   server = NodeHttpServer(mainloop, options.bind_address, options.port,
                           ssl_params=ssl_params, ssl_verify_peer=True,
-                          request_executor_class=MlockallRequestExecutor)
+                          request_executor_class=request_executor_class)
   server.Start()
   try:
     mainloop.Run()
@@ -879,6 +883,10 @@ def main():
                         usage="%prog [-f] [-d] [-p port] [-b ADDRESS]",
                         version="%%prog (ganeti) %s" %
                         constants.RELEASE_VERSION)
+  parser.add_option("--no-mlock", dest="mlock",
+                    help="Do not mlock the node memory in ram",
+                    default=True, action="store_false")
+
   dirs = [(val, constants.RUN_DIRS_MODE) for val in constants.SUB_RUN_DIRS]
   dirs.append((constants.LOG_OS_DIR, 0750))
   dirs.append((constants.LOCK_DIR, 1777))
diff --git a/man/ganeti-noded.sgml b/man/ganeti-noded.sgml
index 2693700bb..d590fe2de 100644
--- a/man/ganeti-noded.sgml
+++ b/man/ganeti-noded.sgml
@@ -52,6 +52,13 @@
       responsible for the node functions in the ganeti system.
     </para>
 
+    <para>
+      By default, in order to be able to support features such as node
+      powercycling even on systems with a very damaged root disk, ganeti-noded
+      mlocks itself in ram. You can disable this feature by passing in the
+      <option>--no-mlock</option>.
+    </para>
+
     <para>
       For testing purposes, you can give the <option>-f</option>
       option and the program won't detach from the running terminal.
-- 
GitLab