From 26ca53fa3db534e04070f451040b9383b023416d Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Wed, 14 Jan 2009 20:00:15 -0700
Subject: [PATCH] node.py: use NODEDIR/tmp for the 'tempfile' module's
 temporary directory, so webapi upload tempfiles are put there instead of /tmp
 . You can set it to something else by setting [node]tempdir in tahoe.cfg

---
 docs/configuration.txt | 12 ++++++++++++
 src/allmydata/node.py  | 19 +++++++++++++++++--
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/docs/configuration.txt b/docs/configuration.txt
index bb53bee8..6df08624 100644
--- a/docs/configuration.txt
+++ b/docs/configuration.txt
@@ -205,6 +205,18 @@ ssh.authorized_keys_file = (filename, optional)
    ssh.port = 8022
    ssh.authorized_keys_file = ~/.ssh/authorized_keys
 
+tempdir = (string, optional)
+
+ This specifies a temporary directory for the webapi server to use, for
+ holding large files while they are being uploaded. If a webapi client
+ attempts to upload a 10GB file, this tempdir will need to have at least 10GB
+ available for the upload to complete.
+
+ The default value is the "tmp" directory in the node's base directory (i.e.
+ $NODEDIR/tmp), but it can be placed elsewhere. This directory is used for
+ files that usually (on a unix system) go into /tmp . The string will be
+ interpreted relative to the node's base directory.
+
 == Client Configuration ==
 
 [client]
diff --git a/src/allmydata/node.py b/src/allmydata/node.py
index da4b860c..e9dd3b7e 100644
--- a/src/allmydata/node.py
+++ b/src/allmydata/node.py
@@ -1,5 +1,5 @@
 
-import datetime, os.path, re, types, ConfigParser
+import datetime, os.path, re, types, ConfigParser, tempfile
 from base64 import b32decode, b32encode
 
 from twisted.python import log as twlog
@@ -10,7 +10,7 @@ import foolscap.logging.log
 from allmydata import get_package_versions, get_package_versions_string
 from allmydata.util import log
 from allmydata.util import fileutil, iputil, observer
-from allmydata.util.assertutil import precondition
+from allmydata.util.assertutil import precondition, _assert
 
 from foolscap.logging import app_versions
 
@@ -65,6 +65,7 @@ class Node(service.MultiService):
         nickname_utf8 = self.get_config("node", "nickname", "<unspecified>")
         self.nickname = nickname_utf8.decode("utf-8")
 
+        self.init_tempdir()
         self.create_tub()
         self.logSource="Node"
 
@@ -73,6 +74,20 @@ class Node(service.MultiService):
         self.log("Node constructed. " + get_package_versions_string())
         iputil.increase_rlimits()
 
+    def init_tempdir(self):
+        local_tempdir = "tmp" # default is NODEDIR/tmp/
+        tempdir = self.get_config("node", "tempdir", local_tempdir)
+        tempdir = os.path.join(self.basedir, tempdir)
+        if not os.path.exists(tempdir):
+            fileutil.make_dirs(tempdir)
+        tempfile.tempdir = os.path.abspath(tempdir)
+        # this should cause twisted.web.http (which uses
+        # tempfile.TemporaryFile) to put large request bodies in the given
+        # directory. Without this, the default temp dir is usually /tmp/,
+        # which is frequently too small.
+        test_name = tempfile.mktemp()
+        _assert(os.path.dirname(test_name) == tempdir, test_name, tempdir)
+
     def get_config(self, section, option, default=_None, boolean=False):
         try:
             if boolean:
-- 
2.45.2