From 192477e4a2813027f264e4be33bbcc0fe48cfc1c Mon Sep 17 00:00:00 2001 From: Zooko O'Whielacronx Date: Fri, 7 Dec 2007 08:03:43 -0700 Subject: [PATCH] move increase_rlimits() into iputil and make it a no-op on Windows --- src/allmydata/node.py | 54 ++------------------------------- src/allmydata/util/iputil.py | 58 ++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/allmydata/node.py b/src/allmydata/node.py index 6bf1e028..8989eef5 100644 --- a/src/allmydata/node.py +++ b/src/allmydata/node.py @@ -1,5 +1,5 @@ -import datetime, os.path, re, types, resource +import datetime, os.path, re, types from base64 import b32decode, b32encode import twisted @@ -76,57 +76,7 @@ class Node(service.MultiService): " twisted: %s, zfec: %s" % (allmydata.__version__, foolscap.__version__, twisted.__version__, zfec.__version__,)) - self.increase_rlimits() - - def increase_rlimits(self): - # We'd like to raise our soft resource.RLIMIT_NOFILE, since certain - # systems (OS-X, probably solaris) start with a relatively low limit - # (256), and some unit tests want to open up more sockets than this. - # Most linux systems start with both hard and soft limits at 1024, - # which is plenty. - - # unfortunately the values to pass to setrlimit() vary widely from - # one system to another. OS-X reports (256, HUGE), but the real hard - # limit is 10240, and accepts (-1,-1) to mean raise it to the - # maximum. Cygwin reports (256, -1), then ignores a request of - # (-1,-1): instead you have to guess at the hard limit (it appears to - # be 3200), so using (3200,-1) seems to work. Linux reports a - # sensible (1024,1024), then rejects (-1,-1) as trying to raise the - # maximum limit, so you could set it to (1024,1024) but you might as - # well leave it alone. - - try: - current = resource.getrlimit(resource.RLIMIT_NOFILE) - except AttributeError: - # we're probably missing RLIMIT_NOFILE, maybe this is windows - return - - if current[0] >= 1024: - # good enough, leave it alone - return - - try: - if current[1] > 0 and current[1] < 1000000: - # solaris reports (256, 65536) - resource.setrlimit(resource.RLIMIT_NOFILE, - (current[1], current[1])) - else: - # this one works on OS-X (bsd), and gives us 10240, but - # it doesn't work on linux (on which both the hard and - # soft limits are set to 1024 by default). - resource.setrlimit(resource.RLIMIT_NOFILE, (-1,-1)) - new = resource.getrlimit(resource.RLIMIT_NOFILE) - if new[0] == current[0]: - # probably cygwin, which ignores -1. Use a real value. - resource.setrlimit(resource.RLIMIT_NOFILE, (3200,-1)) - - except ValueError: - self.log("unable to set RLIMIT_NOFILE: current value %s" - % (resource.getrlimit(resource.RLIMIT_NOFILE),)) - except: - # who knows what. It isn't very important, so log it and continue - log.err() - + iputil.increase_rlimits() def get_config(self, name, mode="r", required=False): """Get the (string) contents of a config file, or None if the file diff --git a/src/allmydata/util/iputil.py b/src/allmydata/util/iputil.py index daecfeab..4024eddf 100644 --- a/src/allmydata/util/iputil.py +++ b/src/allmydata/util/iputil.py @@ -12,10 +12,68 @@ from twisted.internet import reactor from twisted.internet.protocol import DatagramProtocol from twisted.internet.utils import getProcessOutput from twisted.python.procutils import which +from twisted.python import log # from allmydata.util import observer +try: + import resource + def increase_rlimits(): + # We'd like to raise our soft resource.RLIMIT_NOFILE, since certain + # systems (OS-X, probably solaris) start with a relatively low limit + # (256), and some unit tests want to open up more sockets than this. + # Most linux systems start with both hard and soft limits at 1024, + # which is plenty. + + # unfortunately the values to pass to setrlimit() vary widely from + # one system to another. OS-X reports (256, HUGE), but the real hard + # limit is 10240, and accepts (-1,-1) to mean raise it to the + # maximum. Cygwin reports (256, -1), then ignores a request of + # (-1,-1): instead you have to guess at the hard limit (it appears to + # be 3200), so using (3200,-1) seems to work. Linux reports a + # sensible (1024,1024), then rejects (-1,-1) as trying to raise the + # maximum limit, so you could set it to (1024,1024) but you might as + # well leave it alone. + + try: + current = resource.getrlimit(resource.RLIMIT_NOFILE) + except AttributeError: + # we're probably missing RLIMIT_NOFILE, maybe this is windows + return + + if current[0] >= 1024: + # good enough, leave it alone + return + + try: + if current[1] > 0 and current[1] < 1000000: + # solaris reports (256, 65536) + resource.setrlimit(resource.RLIMIT_NOFILE, + (current[1], current[1])) + else: + # this one works on OS-X (bsd), and gives us 10240, but + # it doesn't work on linux (on which both the hard and + # soft limits are set to 1024 by default). + resource.setrlimit(resource.RLIMIT_NOFILE, (-1,-1)) + new = resource.getrlimit(resource.RLIMIT_NOFILE) + if new[0] == current[0]: + # probably cygwin, which ignores -1. Use a real value. + resource.setrlimit(resource.RLIMIT_NOFILE, (3200,-1)) + + except ValueError: + log.msg("unable to set RLIMIT_NOFILE: current value %s" + % (resource.getrlimit(resource.RLIMIT_NOFILE),)) + except: + # who knows what. It isn't very important, so log it and continue + log.err() +except ImportError: + def increase_rlimits(): + # TODO: implement this for Windows. Although I suspect the + # solution might be "be running under the iocp reactor and + # make this function be a no-op". + pass + def get_local_addresses_async(target='A.ROOT-SERVERS.NET'): """ Return a Deferred that fires with a list of IPv4 addresses (as dotted-quad -- 2.45.2