happy bmo push day!

the following changes have been pushed to bugzilla.mozilla.org:

  • [1039198] Field name is still “Bug #” for the Bug Created field
  • [922482] Change all bugs with general@js.bugs assignee to nobody@mozilla.org
  • [713307] Please add FlagTypeComments for tracking/approval flags
  • [1037571] Change Several Bugs at Once Does Not Allow Modification of the QA Whiteboard
  • [1032883] update FlagDefaultRequestee extension to use object hooks
  • [1040580] Bugzilla detects Firefox OS device as Hardware:Other, OS:Other
  • [1026416] “blocks” field is present as empty string when empty, rather than null or []
  • [1040841] Provide good error message when people can’t use form.legal
  • [1041538] A few more “Bugmail filtering” fields need to be excluded from the prefs UI
  • [1041559] “Please wait while your bugs are retrieved” shown above menu header for search error pages
  • [936468] Move OS: Windows 8 Metro to Windows 8.1

discuss these changes on mozilla.tools.bmo.

happy bmo push day!

switching the default monospace font on bmo yesterday highlighted a few issues with the fira-mono typeface that we’d like to see addressed before we use it.  as a result comments are now displayed using their old font.

the following changes have been pushed to bugzilla.mozilla.org:

discuss these changes on mozilla.tools.bmo.

happy bmo push day!

the following changes have been pushed to bugzilla.mozilla.org:

  • [1029500] bug.attachments shouldn’t include attachment data by default
  • [1032323] canonicalise_query() should omit parameters with empty values so generated URLs are shorter
  • [1027114] When sending error to Sentry for webservice failures, we need to first scrub the username/login/password from the query string
  • [1026586] Using Fira as default font in Bugzilla
  • [1027182] merge-users.pl – SQL to remove bug_user_last_visit not correct
  • [1036268] REST webservice should return http/404 for invalid methods
  • [1027025] comment.creator has no real_name
  • [1036795] comment.raw_text is returned by the bzapi compatibility extension
  • [1036225] Return a link to the REST documentation in “method not found” errors
  • [1036301] change the description of the “bug id” field on bugmail filtering preferences tab to “new bug”
  • [1028269] Firefox OS Pre-load App Info Request Form
  • [1036303] add a list of tracking/project/etc tracking flags to the bugmail filtering prefs page

discuss these changes on mozilla.tools.bmo.

using “bugmail filtering” to exclude notifications you don’t want

a common problem with bugzilla emails (aka bugmail) is there’s too much of it.  if you are involved in a bug or watching a component you receive all changes made to bugs, even those you have no interest in receiving.

earlier this week we pushed a new feature to bugzilla.mozilla.org : bugmail filtering.


this feature is available on the “bugmail filtering” tab on the “user preference” page.


there are many reasons why bugzilla may send you notification of a change to a bug:

  • you reported the bug
  • the bug is assigned to you
  • you are the qa-contact for the bug
  • you are on the cc list
  • you are watching the bug’s product/component
  • you are watching another user who received notification of the bug
  • you are a “global watcher”

dealing with all that bugmail can be time consuming.  one way address this issue is to use the x-headers present in every bugmail to categorise and separate bugmail into different folders in your inbox.  unfortunately this option isn’t available to everyone (eg. gmail users still cannot filter on any email header).

bugmail filtering allows you to tell bugzilla to notify you only if it’s a change that you’re interested in.

for example, you can say:

don’t send me an email when the qa-whiteboard field is changed unless the bug is assigned to me


if multiple filters are applicable to the same bug change, include filters override exclude filters.  this interplay allows you to write filters to express “don’t send me an email unless …”

don’t send me an email for developer tools bugs that i’m CC’ed on unless the bug’s status is changed

  • first, exclude all developer tools emails:


  • then override the exclusion with an inclusion for just the status changes:


happy bmo push day!

the following changes have been pushed to bugzilla.mozilla.org:

  • [1033258] bzexport fails to leave a comment when attaching a file using the BzAPI compatibility layer
  • [1003244] Creation of csv file attachement on new Mozilla Reps Swag Request
  • [1033955] pre-load all related bugs during show_bug initialisation
  • [1034678] Use of uninitialized value $_[0] in pattern match (m//) at Bugzilla/Util.pm line 74. The new value for request reminding interval is invalid: must be numeric.
  • [1033445] Certain webservice methods such as Bug.get and Bug.attachments should not use shadow db if user is logged in
  • [990980] create an extension for server-side filtering of bugmail

server-side bugmail filtering

accessible via the “Bugmail Filtering” user preference tab, this feature provides fine-grained control over what changes to bugs will result in an email notification.

for example to never receive changes made to the “QA Whiteboard” field for bugs where you are not the assignee add the following filter:

Field: QA Whiteboard
Product: __Any__
Component: __Any__
Relationship: Not Assignee

discuss these changes on mozilla.tools.bmo.

bugzilla and performance, 2014

bugzilla is a large legacy perl application initially developed at the birth of the world wide web. it has been refactored significantly in the 15 years since its release; however, some design decisions made at the start of the project carry significant technical debt in today’s modern web.

while there have been a large number of micro-optimisations over the course of bugzilla’s life (generally as a result of performance profiling), there are limits to the benefits these sorts of optimisations can provide.

this year has seen a lot of focus on improving bugzilla’s performance within mozilla, centred around the time it takes to display a bug to authenticated users.


tl;dr bugzilla is faster


the design of a modern large web application is generally centred around caches, between the business logic layer and the data sources, as well as between the users and the user interface. while bugzilla has been refactored to use objects, database abstraction, templates, etc, it had zero caching capabilities. this coupled with completely stateless processing of each request meant that every byte of html returned to the user was regenerated from scratch, starting with a new connection to the database.

towards the end of 2013 i worked on implementing a memcached framework into bugzilla [bug 237498].

retrofitting a caching mechanism into a large extendible framework proved to be a significant challenge. bugzilla provides the ability for developers to extend bugzilla’s functionality via extensions, including but not limited to adding new fields, user interface, or process. the extensions system conflicts with caching as it’s possible for an extension to conditionally alter an object in ways that would render it impossible to cache (eg. add a new field to an object only if the current user is a member of a particular group).

some compromises had to be made. instead of caching fully constructed objects, the cache sits between the object’s constructor and the database. we avoid a trip to the database, but still have to construct objects from that data (which allows extensions to modify the object during construction).

code which updated the database directly instead of using bugzilla’s objects had to be found and rewritten to use the objects or updated to manually clear the cache entries. extra care had to be taken as returning stale data could silently result in data loss. to placate concerns that these errors would be impossible to detect, the caller of an object’s constructor must pass in a parameter to “opt-in” to caching.

in 2014 i built upon the memcached framework to support most of bugzilla’s objects [bug 956233], with the “bugs” object being the only notable exception. memcached also caches bugzilla’s configuration parameters (classifications, products, components, groups, flags, …) [bug 987032]. although caching the “bugs” object would be beneficial given its central role in all things bugzilla, it is highly likely that enabling this by default would break bugzilla extensions and customisations as a high proportion of them update the database directly instead of using bugzilla’s object layer. this would manifest as data which is silently stale, making undetectable dataloss a high probability.

memcached support will be released with bugzilla 5.0, but has been live on bugzilla.mozilla.org (bmo) since february 2014.


while profilling tools such as nytprof have often been pointed at bugzilla, bmo’s high number of concurrent requests and usage patterns time and time again resulted in performance optimisations performing worse than expected once deployed to production.

we took the decision to deploy instrumentation code into bugzilla itself, reporting on each http request, database query, and template execution. as bugzilla is written in perl, support was absent for off-the-shelf instrumentation tools such as new relic, so we had to roll our own data collection and reporting system [bug 956230].

the collector wraps specific Bugzilla::DB, Bugzilla::Memcached and Bugzilla::Template calls via subclassing, then reports data to an elasticsearch cluster. currently all reporting solutions are ad-hoc and involve running of scripts which identify the most costly database queries and templates.

this data identified areas of bugzilla which require optimisation or caching. examples include the optimisation of a single query which shaved 200ms (~15%) off page load times for most users [bug 993894], caching of all queries which read an entire table [part of bug 987032], and caching of user groups [bugs 993939] and settings [bug 993926].

we continue to revisit the instrumentation reports in order to guide further improvements.

stylesheet concatenation and minification

improving the performance of a web applications isn’t limited to focusing on server-side execution speed.

due to bugzilla’s extensions we ended up in a situation where bugzilla was serving multiple small css files – on bmo we loaded 17 stylesheets as part of show_bug in comparison with 5 for an installation of bugzilla without any extensions installed.

similar to the issue encountered with memcached, extensions have complete control with regards to optionally loading stylesheets, which means any css concatenation and minification solution needed to be implemented at run-time.

[bug 977969] does exactly that – the template passes an array of stylesheets to load to bugzilla’s global header, where a hash of the array is used to find a unified stylesheet. simple minification is performed which dropped the stylesheet size from 54kb to 43kb on show_bug on bmo.

stylesheet concatenation and minification support will be released with bugzilla 5.0, and has been live on bugzilla.mozilla.org since may 2014.


in order to address performance issues caused by bugzilla’s use of the myisam table type, in march our DBAs upgraded our database cluster to mysql version 5.6. this was the result of analysis by the DBAs into replication and stability issues around our myisam table.

as mysql 5.6 adds support for fulltext indexing to its innodb table type, bugzilla was able to switch away from myisam. this immediately fixed the database replication issues, and provided a noticeable performance boost to searches involving comments.

looking forward

the next large project is to update bugzilla so the bug object can use memcached on an unmodified installation without any non-default extensions enabled. for reasons previously covered it’s unlikely we’ll ship a version of bugzilla with this enabled by default, however this will allow sites to audit their own code (if any) and enable caching of the bug object if required.

we will build on the css concatenation and minification work to provide the same benefits to javascript files.

we periodically enable instrumentation and use it to identify the next set of targets for optimisation. this will continue for the foreseeable future.

happy bmo push day!

the following changes have been pushed to bugzilla.mozilla.org:

  • [1029991] “bug_comments” hook should run after comment tags are pre-loaded
  • [1023865] New product (Tree Management) & components for Treeherder
  • [669535] User pref for “Possible Duplicates”
  • [1030617] editing a product’s groups clears the suggested reviewer list
  • [1030747] Recent changes to secure bugmail subject lines break GMail threading
  • [1028027] cloning a bug pre-fills mentors with “—” instead of an empty value
  • [1031428] Move the “Mentors” field under “QA Contact” field

discuss these changes on mozilla.tools.bmo.