chiark / gitweb /
build: set open file limit based on how many apps are being processed
authorHans-Christoph Steiner <hans@eds.org>
Tue, 28 Nov 2017 09:39:35 +0000 (10:39 +0100)
committerHans-Christoph Steiner <hans@eds.org>
Wed, 29 Nov 2017 20:06:02 +0000 (21:06 +0100)
When running `fdroid build --all` on a buildserver with thousands of apps,
it was frequently hitting the open file limit.  This increases the open
file limit based on how many apps are being process.  It is doubled to
provide a margin of safety.

There are probably open file leaks which ideally would be fixed, but this
is also useful to make things more resilient to all the random stuff apps
include in their build systems.

fdroidserver/build.py
jenkins-build-all

index 740d7f2cb25bfc8e539618c7a8e756598486ef3a..16901e780561eaad4ee9db90f351cf795ab9a7b6 100644 (file)
@@ -23,6 +23,7 @@ import shutil
 import glob
 import subprocess
 import re
+import resource
 import tarfile
 import traceback
 import time
@@ -1120,6 +1121,19 @@ def main():
     if not apps:
         raise FDroidException("No apps to process.")
 
+    # make sure enough open files are allowed to process everything
+    soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
+    if len(apps) > soft:
+        try:
+            soft = len(apps) * 2
+            if soft > hard:
+                soft = hard
+            resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard))
+            logging.debug(_('Set open file limit to {integer}')
+                          .format(integer=soft))
+        except (OSError, ValueError) as e:
+            logging.warning(_('Setting open file limit failed: ') + str(e))
+
     if options.latest:
         for app in apps.values():
             for build in reversed(app.builds):
index 2abac58cc5c3b3d07fb76b3bc766a0336f9739bd..d41d920f79ef5e4b43a638fbbc2007d18babf5d1 100755 (executable)
@@ -31,7 +31,6 @@ else
         echo "No virtualization is used."
 fi
 sudo /bin/chmod -R a+rX /var/lib/libvirt/images
-ulimit -n 2048
 echo 'maximum allowed number of open file descriptors: ' `ulimit -n`
 ls -ld /var/lib/libvirt/images
 ls -l /var/lib/libvirt/images || echo no access