From 8d65ab6158101d36cc4993a88c1c4c4ccb45d945 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 6 Mar 2012 00:20:06 +0100 Subject: [PATCH] Don't use a prepared statement for the active build steps query Prepared statements are sometimes much slower than unprepared statements, because the planner doesn't have access to the query parameters. This is the case for the active build steps query (in /status), where a prepared statement is three orders of magnitude slower. So disable the use of prepared statements in this case. (Since the query parameters are constant here, it would be nicer if we could tell DBIx::Class to prepare a statement with those parameters fixed. But I don't know an easy way to do so.) --- src/lib/Hydra/Controller/Root.pm | 14 +++++++++----- src/lib/Hydra/Helper/CatalystUtils.pm | 4 ++++ src/script/hydra-build | 2 -- src/sql/hydra.sql | 2 ++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/lib/Hydra/Controller/Root.pm b/src/lib/Hydra/Controller/Root.pm index 13135a0c..79a02d18 100644 --- a/src/lib/Hydra/Controller/Root.pm +++ b/src/lib/Hydra/Controller/Root.pm @@ -95,11 +95,15 @@ sub timeline :Local { sub status :Local { my ($self, $c) = @_; - $c->stash->{steps} = [ $c->model('DB::BuildSteps')->search( - { 'me.busy' => 1, 'build.busy' => 1 }, - { join => [ 'build' ] - , order_by => [ 'machine' ] - } ) ]; + $c->model('DB')->storage->dbh_do(sub { + my (undef, $dbh) = @_; + local $dbh->{pg_server_prepare} = 0; + $c->stash->{steps} = [ $c->model('DB::BuildSteps')->search( + { 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 }, + { join => [ 'build' ] + , order_by => [ 'machine' ] + } ) ]; + }); } diff --git a/src/lib/Hydra/Helper/CatalystUtils.pm b/src/lib/Hydra/Helper/CatalystUtils.pm index e8196c3a..d4673f3f 100644 --- a/src/lib/Hydra/Helper/CatalystUtils.pm +++ b/src/lib/Hydra/Helper/CatalystUtils.pm @@ -22,6 +22,7 @@ sub getBuild { return $build; } + sub getPreviousBuild { my ($c, $build) = @_; return undef if !defined $build; @@ -38,6 +39,7 @@ sub getPreviousBuild { return $prevBuild; } + sub getNextBuild { my ($c, $build) = @_; return undef if !defined $build; @@ -54,6 +56,7 @@ sub getNextBuild { return $nextBuild; } + sub getPreviousSuccessfulBuild { my ($c, $build) = @_; return undef if !defined $build; @@ -71,6 +74,7 @@ sub getPreviousSuccessfulBuild { return $prevBuild; } + sub getBuildStats { my ($c, $builds) = @_; diff --git a/src/script/hydra-build b/src/script/hydra-build index f2df9efe..9db4691b 100755 --- a/src/script/hydra-build +++ b/src/script/hydra-build @@ -89,7 +89,6 @@ sub sendEmailNotification { , finished => 1 , id => { '!=', $build->id } }, { order_by => ["timestamp DESC"] } - ); # if there is a previous build with same buildstatus, do not send email @@ -192,7 +191,6 @@ sub sendEmailNotification { To => $to, From => "Hydra Build Daemon <$sender>", Subject => "Hydra job $jobName on " . $build->system . ", build " . $build->id . ": $status", - 'X-Hydra-Instance' => $baseurl, 'X-Hydra-Project' => $build->project->name, 'X-Hydra-Jobset' => $build->jobset->name, diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index c052918b..489cf3f4 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -498,10 +498,12 @@ create index IndexBuildInputsOnDependency on BuildInputs(dependency); create index IndexBuildProducstOnBuildAndType on BuildProducts(build, type); create index IndexBuildProductsOnBuild on BuildProducts(build); create index IndexBuildStepsOnBuild on BuildSteps(build); +create index IndexBuildStepsOnBusy on BuildSteps(busy); create index IndexBuildStepsOnDrvpathTypeBusyStatus on BuildSteps(drvpath, type, busy, status); create index IndexBuildStepsOnOutpath on BuildSteps(outpath); create index IndexBuildStepsOnOutpathBuild on BuildSteps (outpath, build); create index IndexBuildsOnFinished on Builds(finished); +create index IndexBuildsOnFinishedBusy on Builds(finished, busy); create index IndexBuildsOnIsCurrent on Builds(isCurrent); create index IndexBuildsOnJobsetIsCurrent on Builds(project, jobset, isCurrent); create index IndexBuildsOnJobIsCurrent on Builds(project, jobset, job, isCurrent);