[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Request for TC to rule on a course of action for supporting build-arch



On Tue, Jun 07, 2011 at 11:14:14AM +0200, Tollef Fog Heen wrote:
> ]] Steve Langasek 
> 
> Hi,
> 
> |  4) Turn on direct use of 'debian/rules build-arch' on the autobuilders for
> |     all packages in unstable and experimental immediately, with no fallback
> |     if the target does not exist; requires a corresponding update to Policy
> |     and mass updates to fix packages that fail to build as a result.
> 
> I'd be happy to provide hardware to do a full scale rebuild test of the
> archive if somebody does the actual work of doing the rebuilds.  rleigh
> did it for his sbuild resolver test so I've Cc-ed him to see if he's
> interested in doing a test for this too.

This has been completed now, and the summarised results follow.
All of the build logs, scripts and datafiles are available from
http://people.debian.org/~rleigh/dpkg-rebuild/

Summarised:
- autodetection with "make -qn" breaks few, if any packages.
- unconditional use of build-arch breaks approximately 45% of
  arch-any packages (the fraction not providing a build-arch
  target).

Note that the builds were done in the order
  unpatched (8/6/11) - stock git commit dc927a01
  autodetect (9/6/11) - dc927a01 + make -qn patch
  unconditional (10/6/11) - dc927a01 with build-features fallback
                            removed
Because unstable was changing between the rebuilds, some of the
failures are likely due to churn, including multiarch work, so a
failure does not necessarily implicate the patch being tested.

Build logs were parsed to extract
- build status (success/failure)
- fail stage (if failed)
- if autodetection found build-arch to be missing in debian/rules
  ("found", sorry that's counterintutive)
- if build-arch was used and the build failed due to its absence
  ("used" when missing)
The data were put into a PostgreSQL database and queried to give
the results below.


\d builds
                      Table "public.builds"
┌───────────────┬────────────┬──────────────────────────────────┐
│    Column     │    Type    │            Modifiers             │
├───────────────┼────────────┼──────────────────────────────────┤
│ strategy      │ text       │ not null                         │
│ package       │ text       │ not null                         │
│ version       │ debversion │ not null                         │
│ status        │ text       │ not null default 'invalid'::text │
│ failstage     │ text       │                                  │
│ found_missing │ boolean    │                                  │
│ used_missing  │ boolean    │                                  │
└───────────────┴────────────┴──────────────────────────────────┘
Indexes:
    "builds_strategy_package_version_key" UNIQUE, btree (strategy, package, version)

SELECT b.strategy, b.status, b.failstage, b.found_missing AS found,
       b.used_missing AS used, COUNT(*)
FROM builds AS b
GROUP by b.strategy,b.status,b.failstage,b.found_missing,b.used_missing
ORDER BY strategy,status,failstage,b.found_missing,b.used_missing;

    found=build-arch target autodetected t=missing, false=present
    used=build-arch target used when missing (f is OK, t is failure)
┌───────────────┬────────────┬────────────────┬───────┬──────┬───────┐
│   strategy    │   status   │   failstage    │ found │ used │ count │
├───────────────┼────────────┼────────────────┼───────┼──────┼───────┤
│ autodetect    │ attempted  │ abort          │ f     │ f    │     1 │
│ autodetect    │ attempted  │ build          │ f     │ f    │   497 │
│ autodetect    │ attempted  │ build          │ t     │ f    │   357 │
│ autodetect    │ failed     │ apt-get-update │       │ f    │     3 │
│ autodetect    │ failed     │ fetch-src      │       │ f    │   160 │
│ autodetect    │ failed     │ init           │       │ f    │     2 │
│ autodetect    │ failed     │ install-deps   │       │ f    │   162 │
│ autodetect    │ failed     │ unpack         │       │ f    │     3 │
│ autodetect    │ skipped    │ arch-check     │       │ f    │  6962 │
│ autodetect    │ successful │                │ f     │ f    │  4675 │⁵
│ autodetect    │ successful │                │ t     │ f    │  3877 │⁴
├───────────────┼────────────┼────────────────┼───────┼──────┼───────┤
│ unconditional │ attempted  │ abort          │       │ f    │     2 │
│ unconditional │ attempted  │ build          │       │ f    │   500 │
│ unconditional │ attempted  │ build          │       │ t    │  4173 │³
│ unconditional │ failed     │ fetch-src      │       │ f    │   178 │
│ unconditional │ failed     │ install-deps   │       │ f    │   163 │
│ unconditional │ failed     │ unpack         │       │ f    │     3 │
│ unconditional │ skipped    │ arch-check     │       │ f    │  6963 │
│ unconditional │ successful │                │       │ f    │  4717 │²
├───────────────┼────────────┼────────────────┼───────┼──────┼───────┤
│ unpatched     │ attempted  │ build          │       │ f    │   743 │
│ unpatched     │ failed     │ fetch-src      │       │ f    │    89 │
│ unpatched     │ failed     │ init           │       │ f    │     2 │
│ unpatched     │ failed     │ install-deps   │       │ f    │   161 │
│ unpatched     │ failed     │ unpack         │       │ f    │     3 │
│ unpatched     │ skipped    │ arch-check     │       │ f    │  6993 │
│ unpatched     │ successful │                │       │ f    │  8708 │¹
└───────────────┴────────────┴────────────────┴───────┴──────┴───────┘
(26 rows)

¹Without the patch, all builds use the build target
²Always using the build-arch target, only packages with build-arch
 (or dh/cdbs users) build successfully
³Failed builds are mainly due to lack of a build-arch target
⁴Autodetected presence of build-arch and built using build-arch
⁵Failed autodetection of build-arch; build used instead

From this you can see some clear trends, as summarised at the top.
To remove the noise, I selected only builds which were successful
in the unpatched version, and which didn't suffer from arbitrary
failure in the patched version (failed to download source etc.), i.e.
not build failures (attempted) but (failed).


CREATE VIEW orig AS SELECT package,version,status,failstage,found_missing,used_missing FROM builds WHERE (strategy='unpatched');
CREATE VIEW auto AS SELECT package,version,status,failstage,found_missing,used_missing FROM builds WHERE (strategy='autodetect');
CREATE VIEW break AS SELECT package,version,status,failstage,found_missing,used_missing FROM builds WHERE (strategy='unconditional');

SELECT a.status AS ad_status, a.found_missing AS ad_missing,
       a.used_missing as ad_used,
       b.status AS uc_status, b.used_missing AS uc_used, COUNT(*)
FROM orig AS o
INNER JOIN auto AS a
ON o.package=a.package AND o.version=a.version
INNER JOIN break AS b
ON o.package=b.package AND o.version=b.version
WHERE
  o.status='successful'
  AND (a.status='successful'
    OR (a.status='attempted' AND a.failstage='build'))
  AND (b.status ='successful'
    OR (b.status='attempted' AND b.failstage='build'))
GROUP BY ad_status, ad_missing, ad_used, uc_status, uc_used
ORDER BY ad_status, uc_status, ad_missing, ad_used, uc_used;

   ad=autodetect, uc=unconditional
┌────────────┬────────────┬─────────┬────────────┬─────────┬───────┐
│ ad_status  │ ad_missing │ ad_used │ uc_status  │ uc_used │ count │
├────────────┼────────────┼─────────┼────────────┼─────────┼───────┤
│ attempted  │ f          │ f       │ attempted  │ f       │   109 │¹
│ attempted  │ t          │ f       │ attempted  │ t       │    19 │¹
├────────────┼────────────┼─────────┼────────────┼─────────┼───────┤
│ successful │ f          │ f       │ attempted  │ f       │     3 │¹
│ successful │ t          │ f       │ attempted  │ f       │     2 │¹
│ successful │ t          │ f       │ attempted  │ t       │  3818 │²
├────────────┼────────────┼─────────┼────────────┼─────────┼───────┤
│ successful │ f          │ f       │ successful │ f       │  4662 │³
│ successful │ t          │ f       │ successful │ f       │    40 │⁴
└────────────┴────────────┴─────────┴────────────┴─────────┴───────┘
(7 rows)

¹Outlying failures.  Probably due to changes in unstable.
²Successful only with autodetection; unconditional tries to build
 using nonexistent build-arch target while autodetection falls back
 to build target.
³Autodetection found a build-arch rule and built using build-arch;
 unconditional used build-arch.
⁴Possible failure of autodetection since autodetection failed to find
 build-arch and fell back to build.  However, unconditional still
 succeeded here.


Hope this is useful.  If you want any additional work doing, or any
further reanalysis or more detail about specific cases above, please
let me know.  If you want to look at the data yourself, the data is
in CSV and PostgreSQL dumps on p.d.o. at the URI above.


Regards,
Roger

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.

Attachment: signature.asc
Description: Digital signature


Reply to: