[buildbot] global: calculate suitable number of jobs

LEDE Commits lede-commits at lists.infradead.org
Thu Dec 15 08:27:59 PST 2016


jow pushed a commit to buildbot.git, branch master:
https://git.lede-project.org/5a1e485dd9e24c7025ff9cf00ef13c73b749614b

commit 5a1e485dd9e24c7025ff9cf00ef13c73b749614b
Author: Jo-Philipp Wich <jo at mein.io>
AuthorDate: Thu Dec 15 16:14:32 2016 +0000

    global: calculate suitable number of jobs
    
    Use the formula (n_cpus / n_builds) + 1 to calculate a suitable value for -j.
    
    Also introduce a new general configuration option "other_builds" which is
    added to n_builds. This is needed in cases where multiple build masters run
    on the same machine.
    
    Signed-off-by: Jo-Philipp Wich <jo at mein.io>
---
 phase1/master.cfg | 35 +++++++++++++++++++++++------------
 phase2/master.cfg | 19 +++++++++++++++----
 2 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/phase1/master.cfg b/phase1/master.cfg
index b9bbf12..554fe4c 100644
--- a/phase1/master.cfg
+++ b/phase1/master.cfg
@@ -31,16 +31,17 @@ if ini.has_option("general", "port"):
 	slave_port = ini.getint("general", "port")
 
 c['slaves'] = []
+max_builds = dict()
 
 for section in ini.sections():
 	if section.startswith("slave "):
 		if ini.has_option(section, "name") and ini.has_option(section, "password"):
 			name = ini.get(section, "name")
 			password = ini.get(section, "password")
-			max_builds = 1
+			max_builds[name] = 1
 			if ini.has_option(section, "builds"):
-				max_builds = ini.getint(section, "builds")
-			c['slaves'].append(BuildSlave(name, password, max_builds = max_builds))
+				max_builds[name] = ini.getint(section, "builds")
+			c['slaves'].append(BuildSlave(name, password, max_builds = max_builds[name]))
 
 # 'slavePortnum' defines the TCP port to listen on for connections from slaves.
 # This must match the value configured into the buildslaves (with their
@@ -54,10 +55,14 @@ c['mergeRequests'] = True
 
 home_dir = os.path.abspath(ini.get("general", "homedir"))
 tree_expire = 0
+other_builds = 0
 
 if ini.has_option("general", "expire"):
 	tree_expire = ini.getint("general", "expire")
 
+if ini.has_option("general", "other_builds"):
+	other_builds = ini.getint("general", "other_builds")
+
 repo_url = ini.get("repo", "url")
 repo_branch = "master"
 
@@ -202,6 +207,12 @@ def GetVersionPrefix(props):
 	else:
 		return ""
 
+def GetNumJobs(props):
+	if props.hasProperty("slavename") and props.hasProperty("nproc"):
+		return ((int(props["nproc"]) / (max_builds[props["slavename"]] + other_builds)) + 1)
+	else:
+		return 1
+
 
 c['builders'] = []
 
@@ -446,7 +457,7 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "dltar",
 		description = "Building GNU tar",
-		command = ["make", WithProperties("-j%(nproc:~4)s"), "tools/tar/install", "V=s"],
+		command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "tools/tar/install", "V=s"],
 		haltOnFailure = True
 	))
 
@@ -454,7 +465,7 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "dlrun",
 		description = "Populating dl/",
-		command = ["make", WithProperties("-j%(nproc:~4)s"), "download", "V=s"],
+		command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "download", "V=s"],
 		logEnviron = False,
 		locks = [dlLock.access('exclusive')]
 	))
@@ -469,21 +480,21 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "tools",
 		description = "Building tools",
-		command = ["make", WithProperties("-j%(nproc:~4)s"), "tools/install", "V=s"],
+		command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "tools/install", "V=s"],
 		haltOnFailure = True
 	))
 
 	factory.addStep(ShellCommand(
 		name = "toolchain",
 		description = "Building toolchain",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "toolchain/install", "V=s"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "toolchain/install", "V=s"],
 		haltOnFailure = True
 	))
 
 	factory.addStep(ShellCommand(
 		name = "kmods",
 		description = "Building kmods",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "target/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "target/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"],
 		#env={'BUILD_LOG_DIR': 'bin/%s' %(ts[0])},
 		haltOnFailure = True
 	))
@@ -491,7 +502,7 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "pkgbuild",
 		description = "Building packages",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "package/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/compile", "V=s", "IGNORE_ERRORS=n m", "BUILD_LOG=1"],
 		#env={'BUILD_LOG_DIR': 'bin/%s' %(ts[0])},
 		haltOnFailure = True
 	))
@@ -500,14 +511,14 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "pkginstall",
 		description = "Installing packages",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "package/install", "V=s"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/install", "V=s"],
 		haltOnFailure = True
 	))
 
 	factory.addStep(ShellCommand(
 		name = "pkgindex",
 		description = "Indexing packages",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "package/index", "V=s"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "package/index", "V=s"],
 		haltOnFailure = True
 	))
 
@@ -515,7 +526,7 @@ for target in targets:
 	factory.addStep(ShellCommand(
 		name = "images",
 		description = "Building images",
-		command=["make", WithProperties("-j%(nproc:~4)s"), "target/install", "V=s"],
+		command=["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "target/install", "V=s"],
 		haltOnFailure = True
 	))
 
diff --git a/phase2/master.cfg b/phase2/master.cfg
index 06e1b59..c711b09 100644
--- a/phase2/master.cfg
+++ b/phase2/master.cfg
@@ -29,6 +29,7 @@ from buildbot.buildslave import BuildSlave
 
 slave_port = 9990
 persistent = False
+other_builds = 0
 
 if ini.has_option("general", "port"):
 	slave_port = ini.getint("general", "port")
@@ -36,17 +37,21 @@ if ini.has_option("general", "port"):
 if ini.has_option("general", "persistent"):
 	persistent = ini.getboolean("general", "persistent")
 
+if ini.has_option("general", "other_builds"):
+	other_builds = ini.getint("general", "other_builds")
+
 c['slaves'] = []
+max_builds = dict()
 
 for section in ini.sections():
 	if section.startswith("slave "):
 		if ini.has_option(section, "name") and ini.has_option(section, "password"):
 			name = ini.get(section, "name")
 			password = ini.get(section, "password")
-			max_builds = 1
+			max_builds[name] = 1
 			if ini.has_option(section, "builds"):
-				max_builds = ini.getint(section, "builds")
-			c['slaves'].append(BuildSlave(name, password, max_builds = max_builds))
+				max_builds[name] = ini.getint(section, "builds")
+			c['slaves'].append(BuildSlave(name, password, max_builds = max_builds[name]))
 
 # 'slavePortnum' defines the TCP port to listen on for connections from slaves.
 # This must match the value configured into the buildslaves (with their
@@ -179,6 +184,12 @@ def GetDirectorySuffix(props):
 	else:
 		return ""
 
+def GetNumJobs(props):
+	if props.hasProperty("slavename") and props.hasProperty("nproc"):
+		return ((int(props["nproc"]) / (max_builds[props["slavename"]] + other_builds)) + 1)
+	else:
+		return 1
+
 
 c['builders'] = []
 
@@ -269,7 +280,7 @@ for arch in arches:
 		name = "compile",
 		description = "Building packages",
 		workdir = "build/sdk",
-		command = ["make", WithProperties("-j%(nproc:~4)s"), "V=s", "IGNORE_ERRORS=n m y", "BUILD_LOG=1", "CONFIG_SIGNED_PACKAGES=y"]))
+		command = ["make", WithProperties("-j%(jobs)d", jobs=GetNumJobs), "V=s", "IGNORE_ERRORS=n m y", "BUILD_LOG=1", "CONFIG_SIGNED_PACKAGES=y"]))
 
 	if gpg_keyid is not None:
 		factory.addStep(MasterShellCommand(



More information about the lede-commits mailing list