Builder:+history timeouts

Bug #631206 reported by Robert Collins
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Launchpad itself
Fix Released
Critical
Julian Edwards

Bug Description

edge:
https://lp-oops.canonical.com/oops.py/?oopsid=1709EB1925

https://edge.launchpad.net/builders/adare/+history

Revno: 11508
SQL time: 9174 ms
Non-sql time: 4305 ms
Total time: 13479 ms
Statement Count: 25

1 12519.0 1 SQL-launchpad-main-slave SELECT DISTINCT BuildFarmJob.builder, BuildFarmJob.date_created, BuildFarmJob.date_finished, BuildFarmJob.date_first_dispatched, BuildFarmJob.date_started, BuildFarmJob.id, BuildFarmJob.job_type, BuildFarmJob.log, BuildFarmJob.processor, BuildFarmJob.status, BuildFarmJob.virtualized FROM BuildFarmJob LEFT JOIN PackageBuild ON PackageBuild.build_farm_job = BuildFarmJob.id LEFT JOIN Archive ON PackageBuild.archive = Archive.id LEFT JOIN TeamParticipation ON TeamParticipation.team = Archive.owner WHERE BuildFarmJob.builder = %s AND (COALESCE(Archive.private, %s) = %s OR TeamParticipation.person = %s) ORDER BY BuildFarmJob.date_finished DESC, BuildFarmJob.id LIMIT 51 OFFSET 0

prod:
https://lp-oops.canonical.com/oops.py/?oopsid=1709F1169

Revno: 9658

SQL time: 16172 ms
Non-sql time: 162 ms
Total time: 16334 ms
Statement Count: 26

1 16076.0 1 launchpad-main-slave SELECT COUNT(*) FROM (SELECT DISTINCT BuildFarmJob.builder, BuildFarmJob.date_created, BuildFarmJob.date_finished, BuildFarmJob.date_first_dispatched, BuildFarmJob.date_started, BuildFarmJob.id, BuildFarmJob.job_type, BuildFarmJob.log, BuildFarmJob.processor, BuildFarmJob.status, BuildFarmJob.virtualized FROM BuildFarmJob LEFT JOIN PackageBuild ON PackageBuild.build_farm_job = BuildFarmJob.id LEFT JOIN Archive ON PackageBuild.archive = Archive.id LEFT JOIN TeamParticipation ON TeamParticipation.team = Archive.owner WHERE BuildFarmJob.builder = %s AND (COALESCE(Archive.private, %s) = %s OR TeamParticipation.person = %s)) AS "_tmp"

Related branches

description: updated
description: updated
Changed in soyuz:
status: New → Confirmed
status: Confirmed → Triaged
Revision history for this message
Robert Collins (lifeless) wrote :

Running that with builder 3 on staging - 51 rows in 22482ms

Revision history for this message
Robert Collins (lifeless) wrote :

From staging:

 Limit (cost=148649.73..148651.84 rows=51 width=57) (actual time=23673.661..23675.791 rows=51 loops=1)
   -> Unique (cost=148649.73..153285.81 rows=112426 width=57) (actual time=23673.659..23675.778 rows=51 loops=1)
         -> Sort (cost=148649.73..149036.07 rows=154536 width=57) (actual time=23673.656..23674.758 rows=1606 loops=1)
               Sort Key: buildfarmjob.date_finished, buildfarmjob.id, buildfarmjob.date_created, buildfarmjob.date_first_dispatched, buildfarmjob.date_started, buildfarmjob.job_type, buildfarmjob.log, buildfarmjob.processor, buildfarmjob.status, buildfarmjob.virtualized
               Sort Method: external merge Disk: 171056kB
               -> Hash Left Join (cost=74869.48..143494.09 rows=154536 width=57) (actual time=609.450..3272.502 rows=2275497 loops=1)
                     Hash Cond: (packagebuild.archive = archive.id)
                     Filter: ((NOT COALESCE(archive.private, false)) OR (teamparticipation.person = 2))
                     -> Merge Right Join (cost=28166.54..89063.64 rows=56213 width=61) (actual time=339.722..2067.928 rows=53331 loops=1)
                           Merge Cond: (packagebuild.build_farm_job = buildfarmjob.id)
                           -> Index Scan using packagebuild__build_farm_job__idx on packagebuild (cost=0.00..55396.04 rows=1863177 width=8) (actual time=0.034..1292.351 rows=1863124 loops=1)
                           -> Sort (cost=28166.54..28307.08 rows=56213 width=57) (actual time=237.429..282.928 rows=53331 loops=1)
                                 Sort Key: buildfarmjob.id
                                 Sort Method: quicksort Memory: 9036kB
                                 -> Bitmap Heap Scan on buildfarmjob (cost=931.06..23731.73 rows=56213 width=57) (actual time=30.516..125.626 rows=53331 loops=1)
                                       Recheck Cond: (builder = 3)
                                       -> Bitmap Index Scan on buildfarmjob__builder_and_status__idx (cost=0.00..917.01 rows=56213 width=0) (actual time=22.007..22.007 rows=53331 loops=1)
                                             Index Cond: (builder = 3)
                     -> Hash (cost=45335.51..45335.51 rows=109394 width=9) (actual time=269.627..269.627 rows=49138 loops=1)
                           -> Nested Loop Left Join (cost=0.00..45335.51 rows=109394 width=9) (actual time=0.044..238.518 rows=49138 loops=1)
                                 -> Seq Scan on archive (cost=0.00..1490.99 rows=19899 width=9) (actual time=0.010..9.088 rows=19899 loops=1)
                                 -> Index Scan using teamparticipation_team_key on teamparticipation (cost=0.00..2.13 rows=6 width=8) (actual time=0.007..0.009 rows=2 loops=19899)
                                       Index Cond: (teamparticipation.team = archive.owner)
 Total runtime: 23744.002 ms
(24 rows)

Revision history for this message
Robert Collins (lifeless) wrote :

This is a candidate rearrangement:

SELECT DISTINCT BuildFarmJob.builder, BuildFarmJob.date_created, BuildFarmJob.date_finished, BuildFarmJob.date_first_dispatched, BuildFarmJob.date_started, BuildFarmJob.id, BuildFarmJob.job_type, BuildFarmJob.log, BuildFarmJob.processor, BuildFarmJob.status, BuildFarmJob.virtualized FROM BuildFarmJob LEFT JOIN PackageBuild ON PackageBuild.build_farm_job = BuildFarmJob.id LEFT JOIN (Archive LEFT JOIN TeamParticipation ON (TeamParticipation.person = 2 AND TeamParticipation.team = Archive.owner)) ON (PackageBuild.archive = Archive.id AND (Archive.private = FALSE OR TeamParticipation.person = 2)) WHERE BuildFarmJob.builder = 3 ORDER BY BuildFarmJob.date_finished DESC, BuildFarmJob.id LIMIT 51 OFFSET 0;

Revision history for this message
Robert Collins (lifeless) wrote :

SELECT DISTINCT BuildFarmJob.builder, BuildFarmJob.date_created, BuildFarmJob.date_finished, BuildFarmJob.date_first_dispatched, BuildFarmJob.date_started, BuildFarmJob.id, BuildFarmJob.job_type, BuildFarmJob.log, BuildFarmJob.processor, BuildFarmJob.status, BuildFarmJob.virtualized FROM BuildFarmJob LEFT JOIN PackageBuild ON PackageBuild.build_farm_job = BuildFarmJob.id
LEFT JOIN (Archive LEFT JOIN TeamParticipation ON (TeamParticipation.person = 2 AND TeamParticipation.team = Archive.owner and (archive.private=FALSE or TeamParticipation.person is not NULL))) ON PackageBuild.archive = Archive.id WHERE BuildFarmJob.builder = 3 ORDER BY BuildFarmJob.date_finished DESC, BuildFarmJob.id LIMIT 51 OFFSET 0;

is slightly faster still, but still not brilliant. (1400ms vs 1800ms on staging)

Revision history for this message
Robert Collins (lifeless) wrote :

SELECT DISTINCT BuildFarmJob.builder, BuildFarmJob.date_created, BuildFarmJob.date_finished, BuildFarmJob.date_first_dispatched, BuildFarmJob.date_started, BuildFarmJob.id, BuildFarmJob.job_type, BuildFarmJob.log, BuildFarmJob.processor, BuildFarmJob.status, BuildFarmJob.virtualized FROM BuildFarmJob LEFT JOIN (PackageBuild
INNER JOIN (Archive INNER JOIN TeamParticipation ON (TeamParticipation.person = 2 AND TeamParticipation.team = Archive.owner and (archive.private=FALSE or TeamParticipation.person is not NULL))) ON PackageBuild.archive = Archive.id) ON PackageBuild.build_farm_job = BuildFarmJob.id WHERE BuildFarmJob.builder = 3 ORDER BY BuildFarmJob.date_finished DESC, BuildFarmJob.id LIMIT 51 OFFSET 0;

930ms - uses two inner joins rather than left joins.

Revision history for this message
Julian Edwards (julian-edwards) wrote : Re: [Bug 631206] Re: Builder:+history timeouts

On Monday 06 September 2010 01:56:28 Robert Collins wrote:
> -> Seq Scan on
> archive (cost=0.00..1490.99 rows=19899 width=9) (actual time=0.010..9.088
> rows=19899 loops=1)

Argh!

tags: added: pg83
Changed in launchpad:
importance: High → Critical
tags: added: dba
Revision history for this message
Julian Edwards (julian-edwards) wrote :

JTV came up with this which is massively quicker.

SELECT DISTINCT BuildFarmJob.*
FROM BuildFarmJob
LEFT JOIN PackageBuild ON PackageBuild.build_farm_job = BuildFarmJob.id
WHERE
    BuildFarmJob.builder = %s AND (
        PackageBuild.id IS NULL OR
        PackageBuild.archive IN (
            SELECT id
            FROM Archive
            WHERE Archive.private = FALSE

            UNION

            SELECT id
            FROM Archive
            WHERE
                Archive.private = TRUE AND
                Archive.owner IN (
                    SELECT DISTINCT team
                    FROM TeamParticipation
                    WHERE person = %s
                )
        )
    )
ORDER BY date_finished DESC, id

Changed in launchpad:
assignee: nobody → Julian Edwards (julian-edwards)
status: Triaged → In Progress
Revision history for this message
Julian Edwards (julian-edwards) wrote :

On dogfood, the old query took ~45 seconds, this new one is 5-6 seconds. On staging it's about 2 seconds.

Revision history for this message
Robert Collins (lifeless) wrote :

I'm just curious, did you try the one I came up with that was < 1 second?

Revision history for this message
Robert Collins (lifeless) wrote :

(its in comment 5)

Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Thursday 10 February 2011 19:43:07 you wrote:
> I'm just curious, did you try the one I came up with that was < 1
> second?

Yeah it's fast but it also has a bug. :)

Revision history for this message
Julian Edwards (julian-edwards) wrote :

Also, the query is somewhat dynamic depending on who the user is.

Revision history for this message
Robert Collins (lifeless) wrote :

On Fri, Feb 11, 2011 at 11:14 AM, Julian Edwards
<email address hidden> wrote:
> Also, the query is somewhat dynamic depending on who the user is.

Oh, whats the bug?

Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Thursday 10 February 2011 23:14:32 you wrote:
> On Fri, Feb 11, 2011 at 11:14 AM, Julian Edwards
>
> <email address hidden> wrote:
> > Also, the query is somewhat dynamic depending on who the user is.
>
> Oh, whats the bug?

I'd have to dig again, it was something to do with exposing private builds to
the wrong people IIRC.

Revision history for this message
Robert Collins (lifeless) wrote :

I'd love to know, I thought i had done correctness preserving transforms, I'd hate to introduce such a bug at a later time.

Revision history for this message
Launchpad QA Bot (lpqabot) wrote :
Changed in launchpad:
milestone: none → 11.03
tags: added: qa-needstesting
Changed in launchpad:
status: In Progress → Fix Committed
tags: added: qa-ok
removed: qa-needstesting
William Grant (wgrant)
Changed in launchpad:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.