Source code for benchbuild.projects.gentoo.postgresql

"""
postgresql experiment within gentoo chroot.
"""
from os import path
from time import sleep
from psutil import Process
from benchbuild.utils.wrapping import wrap_in_uchroot as wrap
from benchbuild.projects.gentoo.gentoo import GentooGroup
from benchbuild.utils.run import uretry, uchroot
from plumbum import local
from benchbuild.utils.cmd import kill, mkdir  # pylint: disable=E0401


run = uretry


[docs]class Postgresql(GentooGroup): """ dev-db/postgresql """ NAME = "gentoo-postgresql" DOMAIN = "dev-db/postgresql"
[docs] def build(self): emerge_in_chroot = uchroot()["/usr/bin/emerge"] with local.env(USE="server"): run(emerge_in_chroot["dev-db/postgresql:9.4"]) pg_socketdir = "/run/postgresql" if not path.exists(self.outside(pg_socketdir)): run(mkdir["-p", self.outside(pg_socketdir)])
[docs] def outside(self, chroot_path): """ Return the path with the outside prefix. Args: chroot_path: the path inside the chroot. Returns: Absolute path outside this chroot. """ return path.join(self.builddir, chroot_path.lstrip("/"))
[docs] def run_tests(self, experiment, run): pg_data = "/test-data/" pg_path = "/usr/lib64/postgresql-9.4/bin/postgres" wrap(self.outside(pg_path), experiment, self.builddir) cuchroot = uchroot(uid=250, gid=250) dropdb = cuchroot["/usr/bin/dropdb"] createdb = cuchroot["/usr/bin/createdb"] pgbench = cuchroot["/usr/bin/pgbench"] initdb = cuchroot["/usr/bin/initdb"] pg_server = cuchroot[pg_path] with local.env(PGPORT="54329", PGDATA=pg_data): if not path.exists(self.outside(pg_data)): run(initdb) with pg_server.bgrun() as postgres: #We get the PID of the running 'pg_server, which is actually #the PID of the uchroot binary. This is not the PID we #want to send a SIGTERM to. #We need to enumerate all children of 'postgres' recursively #and select the one PID that is named 'postgres.bin' and has #not a process with the same name as parent. #This should be robust enough, as long as postgres doesn't #switch process names after forking. sleep(3) postgres_root = Process(pid=postgres.pid) real_postgres = [c.pid for c in postgres_root.children(True) if c.name() == 'postgres.bin' and c.parent( ).name() != 'postgres.bin'] try: run(createdb) run(pgbench["-i", "portage"]) run(pgbench["-c", 1, "-S", "-t", 1000000, "portage"]) run(dropdb["portage"]) finally: kill("-sSIGTERM", real_postgres[0])