This message applies to anyone who clones a Firefox repository from hg.mozilla.org. *Failure to read this message may result in degraded Mercurial performance.* If you use git-cinnabar or use the mozilla-unified repository exclusively, you are likely shielded from degraded performance and can stop reading.
Some changes were made to the hosting of high-volume Firefox repositories on hg.mozilla.org in the past week. The full list of repositories impacted so far is available at https://hg.cdn.mozilla.net/. Client-side operations against repositories cloned from hg.mozilla.org may be slower until a one-time operation is performed. Once complete, operations against hg.mozilla.org should be *faster* than they were before. tldr ---- To ensure your Firefox repository clone runs at peak performance: 1) Upgrade to the latest Mercurial release (currently 4.1.2) - instructions at [1]. 2a) Run `hg debugupgraderepo --optimize redeltaparent --optimize redeltamultibase --run`. Learn more at [2]. This command will likely take a few hours to run. But your existing repo will function just as it did before, just faster. The command keeps a backup of your existing data and doesn't modify your repo until the last few milliseconds of execution. 2b) Create a fresh clone from hg.mozilla.org using Mercurial 4.1 then push/pull data from your existing clone to it. See [3] for specific instructions. Technical Changes ----------------- The main Firefox repositories on hg.mozilla.org were using a legacy storage format with known deficiencies. The repositories have been upgraded to use a modern storage format (generaldelta). This storage format results in smaller repositories (300-500 MB on-disk reduction is common) and faster operations against optimally encoded repositories. The main Firefox repositories on hg.mozilla.org have not only had their storage formats upgraded, they have also been optimized so data is stored within as efficiently as possible. This is effectively the Mercurial equivalent of `git repack -a -f`. While your local clone may be using generaldelta (run `hg debugupgraderepo` to see if it is already present), the deltas may not be optimal and this can result in repo bloat and slow operations. A re-clone or one-time data upgrade with certain optimizations (using the `hg debugupgraderepo` described in the tldr section) will align your local clone with hg.mozilla.org and result in optimal performance. Performance Implications ------------------------ If 2 Mercurial peers (say your local clone and hg.mozilla.org) are using different repository storage formats, one side has to do work to normalize exchanged data so it can be applied. For 95% of repositories, this data normalization is fast and nobody likely notices. But because the Firefox repository is so large, it can add noticeable to extreme overhead to operations. With the Firefox repositories on hg.mozilla.org upgraded to generaldelta, the following can occur: * A Mercurial 3.7+ client with a generaldelta repo will essentially stream data from the server to local disk with minimal processing. (Read: this is ideal and fastest.) * A Mercurial 3.5+ client with a non-generaldelta repo will have to heavily process incoming data so it is compatible with local storage. This will slow down operations like `hg pull` in proportion to the amount of incoming data. The slowdown will be less pronounced on Mercurial 4.1 due to performance improvements in Mercurial. * A Mercurial 3.4 or older client isn't capable of receiving the server's native storage format over the wire protocol so the *server* has to normalize things to a format the client can understand. This slows down `hg clone` and `hg pull` operations drastically (45+ minute clone times regardless of network speed) and can create load problems on the server. (This is why we waited a while before performing this server-side change and is why we'll have to lock out legacy clients if this load becomes a problem.) In addition, a Mercurial 4.1+ client will use zstandard instead of zlib for compression, resulting in faster compression/decompression and fewer bytes transferred. This translates to faster operations against hg.mozilla.org. Why We Made This Change ----------------------- Many of you may be asking: "since this change slows clients down, why make it?" Good question. The viable choices were between doing nothing and not allowing peak performance or making a 1-time change that enabled faster operations while temporarily inconveniencing (to various extents) existing clones and their users (namely Firefox developers). In other words, it was about letting the past and legacy software continue to hinder us or to break free and move to the future. With Firefox and Mozilla, we have to play the long game. And, we need to enable developers to move fast. This includes things like Firefox's automation. This change will enable VCS interactions in automation to complete faster which will reduce end-to-end times - something many complain about. We could have made this change over a year ago. But we waited for better client-side adoption so the impact of this transition would be mitigated. We rolled out repositories like mozilla-unified (that have been encoded in the optimal format since day 0) and encouraged their use. There would never be an optimal time to make this transition: someone would always lose. In my mind at least, we had postponed allowing clients to achieve optimal performance for long enough (over a year) and it was time to make the transition. So we did. Additional Work and Related Bugs -------------------------------- Bug 1351859 is the bug tracking upgrading all repos to the latest storage format. If you notice any fallout from this work, please track against it. There may be issues with the pre-generated zstd bundles and 32-bit Python/Mercurial processes [on Windows] running out of memory. That's bug 1344790. If you run into a memory error, run `hg --config ui.clonebundleprefers=COMPRESSION=gzip clone ...` as a workaround. [1] https://mozilla-version-control-tools.readthedocs.io/ en/latest/hgmozilla/installing.html <https://mozilla-version-control-tools.readthedocs.io/en/latest/hgmozilla/common.html#upgrading-repository-storage> [2] https://mozilla-version-control-tools.readthedocs.io/en/ latest/hgmozilla/common.html#upgrading-storage-via-debugupgraderepo [3] https://mozilla-version-control-tools.readthedocs.io/en/ latest/hgmozilla/common.html#upgrading-repository-storage <https://mozilla-version-control-tools.readthedocs.io/en/latest/hgmozilla/common.html#upgrading-repository-storage> _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform