Skip to content
Snippets Groups Projects
  1. Apr 17, 2023
    • Pierre-Yves David's avatar
      revlog-split: also check a case where bundle contains multiple changegroup · 2bb2a1ff
      Pierre-Yves David authored
      This case is not affected, we remains in the same transaction. However it seems
      important to improve the test coverage around these "features". It also helped
      to assert the scop of the critical bug.
      2bb2a1ff
    • Pierre-Yves David's avatar
      revlog-split: show manifest data loss situation when using clonebundle · 54f68495
      Pierre-Yves David authored
      After the commit of the transaction from applying the clone bundle, changes to
      the manifest from the subsequent pull would write index data in the wrong file.
      This lead to data being "lost" after the pull and the repository to be
      corrupted. We add a test checking this specific scenario.
      
      In practice, the issue only affects the manifest but we also test the issue with a file for future proofing things up.
      
      See test documentation and failure for details.
      54f68495
  2. Apr 13, 2023
  3. Apr 12, 2023
  4. Apr 13, 2023
  5. Apr 11, 2023
  6. Apr 01, 2023
    • Pierre-Yves David's avatar
      match: match explicit file using a set · 81c7d04f
      Pierre-Yves David authored
      The matcher as all the logic to do quick comparison against explicit patterns,
      however the pattern matcher was shadowing the code using that set and used the
      compiled regex pattern in all cases, which is quite slow. We restore the usage
      of the set based matching to boost performance.
      
      Building the regexp is still consuming a large amount of time (actually, the
      majority of the time), which is still silly. Maybe using re2 would help that,
      but this is a quest for another adventure.
      
      Another path to improve this is to have a pattern type dedicated to match the
      exact path to a file only (not a directory). This pattern could use the set
      matching only and be skipped in the regex all together.
      
      
      Benchmarks
      ==========
      
      In the following benchmark we are comparing the `hg cat` and `hg files` run
      time when matching against all files in the repository. They are
      run:
       - without the rust extensions
       - with the standard python engine (so without re2)
      
      
      Performance improvement in this series
      --------------------------------------
      
      ###### hg files ###############################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:    0.230092 seconds
      prev-changeset:    0.230069 seconds
      this-changeset:    0.211425 seconds    (-8.36%)
      ### mercurial-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:    0.234235 seconds
      prev-changeset:    0.231165 seconds    (-1.38%)
      this-changeset:    0.212300 seconds    (-9.43%)
      
      ### pypy-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:    0.613567 seconds
      prev-changeset:    0.616799 seconds
      this-changeset:    0.510852 seconds   (-16.82%)
      ### pypy-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:    0.801880 seconds
      prev-changeset:    0.616393 seconds   (-23.22%)
      this-changeset:    0.511903 seconds   (-36.23%)
      
      ### netbeans-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:   21.541828 seconds
      prev-changeset:   21.586773 seconds
      this-changeset:   13.648347 seconds   (-36.76%)
      ### netbeans-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:  172.759857 seconds
      prev-changeset:   21.908197 seconds   (-87.32%)
      this-changeset:   13.945110 seconds   (-91.93%)
      
      ### mozilla-central-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:   62.474221 seconds
      prev-changeset:   61.279490 seconds    (-1.22%)
      this-changeset:   29.529469 seconds   (-52.40%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset: 1364.180218 seconds
      prev-changeset:   62.473549 seconds   (-95.40%)
      this-changeset:   30.625249 seconds   (-97.75%)
      
      ###### hg cat #################################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:    0.764407 seconds
      prev-changeset:    0.763883 seconds
      this-changeset:    0.737326 seconds    (-3.68%)
      ### mercurial-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:    0.768924 seconds
      prev-changeset:    0.765848 seconds
      this-changeset:    0.174d0b seconds    (-4.44%)
      
      ### pypy-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:    2.065220 seconds
      prev-changeset:    2.070498 seconds
      this-changeset:    1.939482 seconds    (-6.08%)
      ### pypy-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:    2.276388 seconds
      prev-changeset:    2.069197 seconds    (-9.15%)
      this-changeset:    1.931746 seconds   (-15.19%)
      
      ### netbeans-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:   40.967983 seconds
      prev-changeset:   41.392423 seconds
      this-changeset:   32.181681 seconds   (-22.20%)
      ### netbeans-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset:  216.388709 seconds
      prev-changeset:   41.648689 seconds   (-80.88%)
      this-changeset:   32.580817 seconds   (-85.04%)
      
      ### mozilla-central-2018-08-01-zstd-sparse-revlog ### sorted
      base-changeset:  105.228510 seconds
      prev-changeset:  103.315670 seconds    (-1.23%)
      this-changeset:   69.416118 seconds   (-33.64%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog ### shuffled
      base-changeset: 1448.722784 seconds
      prev-changeset:  104.369358 seconds   (-92.80%)
      this-changeset:   70.554789 seconds   (-95.13%)
      
      Different way to list the same data with this revision
      ------------------------------------------------------
      
      ###### hg files ###############################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      root:            0.119182 seconds
      glob:            0.120697 seconds    (+1.27%)
      sorted:          0.211425 seconds   (+77.40%)
      shuffled:        0.212300 seconds   (+78.13%)
      ### pypy-2018-08-01-zstd-sparse-revlog
      root:            0.121986 seconds
      glob:            0.124822 seconds    (+2.32%)
      sorted:          0.510852 seconds  (+318.78%)
      shuffled:        0.511903 seconds  (+319.64%)
      ### netbeans-2018-08-01-zstd-sparse-revlog
      root:            0.173984 seconds
      glob:            0.227203 seconds   (+30.59%)
      sorted:         13.648347 seconds (+7744.59%)
      shuffled:       13.945110 seconds (+7915.16%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      root:            0.366463 seconds
      glob:            0.491030 seconds   (+33.99%)
      sorted:         29.529469 seconds (+7957.96%)
      shuffled:       30.625249 seconds (+8256.97%)
      
      ###### hg cat #################################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      glob:            0.647471 seconds
      root:            0.643120 seconds
      shuffled:        0.174d0b seconds   (+13.92%)
      sorted:          0.737326 seconds   (+13.88%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      glob:           40.596983 seconds
      root:           40.129136 seconds
      shuffled:       70.554789 seconds   (+73.79%)
      sorted:         69.416118 seconds   (+70.99%)
      ### netbeans-2018-08-01-zstd-sparse-revlog
      glob:           18.777924 seconds
      root:           18.613905 seconds
      shuffled:       32.580817 seconds   (+73.51%)
      sorted:         32.181681 seconds   (+71.38%)
      ### pypy-2018-08-01-zstd-sparse-revlog
      glob:            1.555319 seconds
      root:            1.536534 seconds
      shuffled:        1.931746 seconds   (+24.20%)
      sorted:          1.939482 seconds   (+24.70%)
      81c7d04f
    • Pierre-Yves David's avatar
      match: sort patterns before compiling them into a regex · 47686726
      Pierre-Yves David authored
      While investigating cripping performance for `hg cat` in some context, I
      discovered that, for large inputs, building a regex from out of order patterns
      result may result in a *much* slower regex and a much slower associated
      matcher's performance.
      
      So we are now sorting the patterns to help the regex engine.
      
      There is more to the story as we rely on regexp more than we should. See the
      next changeset for details.
      
      Benchmarks
      ==========
      
      In the following benchmark we are comparing the `hg cat` and `hg files` run
      time when matching against the full list of files in the repository. They are
      run:
       - without the rust extensions
       - with the standard python enfine (so without re2)
      
      sort vs non-sorted - Before this changeset (3f5137543773)
      ---------------------------------------------------------
      
      ###### hg files ###############################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      sorted:      0.230092 seconds
      shuffled:    0.234235 seconds    (+1.80%)
      ### pypy-2018-08-01-zstd-sparse-revlog
      sorted:      0.613567 seconds
      shuffled:    0.801880 seconds   (+30.69%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      sorted:     62.474221 seconds
      shuffled: 1364.180218 seconds (+2083.59%)
      ### netbeans-2018-08-01-zstd-sparse-revlog
      sorted:    21.541828 seconds
      shuffled: 172.759857 seconds   (+701.97%)
      
      ###### hg cat #################################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      sorted:      0.764407 seconds
      shuffled:    0.768924 seconds
      ### pypy-2018-08-01-zstd-sparse-revlog
      sorted:      2.065220 seconds
      shuffled:    2.276388 seconds  (+10.22%)
      ### netbeans-2018-08-01-zstd-sparse-revlog
      sorted:     40.967983 seconds
      shuffled:  216.388709 seconds (+428.19%)
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      sorted:    105.228510 seconds
      shuffled: 1448.722784 seconds (+1276.74%)
      
      sort vs non-sorted - With this changeset
      ----------------------------------------
      
      ###### hg files ###############################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      all-list-pattern-sorted:    0.230069
      all-list-pattern-shuffled:  0.231165
      ### pypy-2018-08-01-zstd-sparse-revlog
      all-list-pattern-sorted:    0.616799
      all-list-pattern-shuffled:  0.616393
      ### netbeans-2018-08-01-zstd-sparse-revlog
      all-list-pattern-sorted:   21.586773
      all-list-pattern-shuffled: 21.908197
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      all-list-pattern-sorted:   61.279490
      all-list-pattern-shuffled: 62.473549
      
      ###### hg cat #################################################################
      ### mercurial-2018-08-01-zstd-sparse-revlog
      sorted:      0.763883 seconds
      shuffled:    0.765848 seconds
      ### pypy-2018-08-01-zstd-sparse-revlog
      sorted:      2.070498 seconds
      shuffled:    2.069197 seconds
      ### netbeans-2018-08-01-zstd-sparse-revlog
      sorted:     41.392423 seconds
      shuffled:   41.648689 seconds
      ### mozilla-central-2018-08-01-zstd-sparse-revlog
      sorted:    103.315670 seconds
      shuffled:  104.369358 seconds
      47686726
  7. Mar 27, 2023
    • Arun Kulshreshtha's avatar
      chg: populate CHGHG if not set · cf4d2f31
      Arun Kulshreshtha authored
      Normally, chg determines which `hg` executable to use by first consulting the
      `$CHGHG` and `$HG` environment variables, and if neither are present defaults
      to the `hg` found in the user's `$PATH`. If built with the `HGPATHREL` compiler
      flag, chg will instead assume that there exists an `hg` executable in the same
      directory as the `chg` binary and attempt to use that.
      
      This can cause problems in situations where there are multiple actively-used
      Mercurial installations on the same system. When a `chg` client connects to a
      running command server, the server process performs some basic validation to
      determine whether a new command server needs to be spawned. These checks include
      things like checking certain "sensitive" environment variables and config
      sections, as well as checking whether the mtime of the extensions, hg's
      `__version__.py` module, and the Python interpreter have changed.
      
      Crucially, the command server doesn't explicitly check whether the executable it
      is running from matches the executable that the `chg` client would have
      otherwise invoked had there been no existing command server process. Without
      `HGPATHREL`, this still gets implicitly checked during the validation step,
      because the only way to specify an alternate hg executable (apart from `$PATH`)
      is via the `$CHGHG` and `$HG` environment variables, both of which are checked.
      
      With `HGPATHREL`, however, the command server has no way of knowing which hg
      executable the client would have run. This means that a client located at
      `/version_B/bin/chg` will happily connect to a command server running
      `/version_A/bin/hg` instead of `/version_B/bin/hg` as expected. A simple
      solution is to have the client set `$CHGHG` itself, which then allows the
      command server's environment validation to work as intended.
      
      I have tested this manually using two locally built hg installations and it
      seems to work with no ill effects. That said, I'm not sure how to write an
      automated test for this since the `chg` available to the tests isn't even built
      with the `HGPATHREL` compiler flag to begin with.
      cf4d2f31
  8. Apr 07, 2023
  9. Apr 05, 2023
  10. Mar 27, 2023
    • Manuel Jacob's avatar
      commands: correct documentation of hg serve’s --ipv6 option · 80784ac0
      Manuel Jacob authored
      When the --ipv6 option is given, the server doesn’t listen to a IPv4 socket.
      This can be verified by running two servers, one with and one
      without the option, which works fine.
      
      I think that listening to both a IPv4 and a IPv6 socket would be better,
      but given that the Python standard library class underlying the
      HTTP server supports only one socket, this is not trivial.
      80784ac0
  11. Mar 24, 2023
  12. Mar 23, 2023
  13. Mar 22, 2023
  14. Mar 21, 2023
  15. Mar 20, 2023
    • Pierre-Yves David's avatar
      revlog: improve the robustness of the splitting process · 87f0155d
      Pierre-Yves David authored
      The previous "in-place" splitting, preserving the splitting on transaction
      failure had a couple of issue in case of transaction rollback:
      - a race windows that could still lead to a crash and data loss
      - it corrupted the `fncache`.
      
      So instead, we use a new approach that we summarized as "we do a backup of the
      inline revlog pre-split, and we restore this in case of failure".
      To make readers live easier, we don't overwrite the inline index file until
      transaction finalization. (once the transaction get into its finalization phase,
      it is not expected to rollback, unless some crash happens).
      
      To do so, we write the index of the split index in a temporary file that we use
      until transaction finalization. We also keep a backup of the initial inline file
      to be able to rollback the split if needed.
      
      As a result, transaction rollback cancel the split and no longer corrupt
      fncache. We also no longer have a small inconsistency windows where the
      transaction could be unrecoverable.
      87f0155d
    • Pierre-Yves David's avatar
      fncache: make it possible to ignore some file · cf6e1d53
      Pierre-Yves David authored
      In the next changeset, we need to able to ignore some temporary file. This
      changeset teach the fncache about that.
      cf6e1d53
    • Pierre-Yves David's avatar
      revlog: test that pending hooks properly see the repository on split · 6487737e
      Pierre-Yves David authored
      This seems important to explicitly cover this case before changing the code.
      6487737e
  16. Mar 17, 2023
  17. Mar 16, 2023
  18. Mar 15, 2023
    • Pierre-Yves David's avatar
      transaction: allow to backup file that already have an offset · 4c1061b3
      Pierre-Yves David authored
      This will be useful in the next changeset to deal with rolling back the split of
      inline revlog on transaction failure.
      
      This involve deeper change to the transaction logic as we need to make sure we
      restore the backup -before- the truncation step. Otherwise, the truncation
      would act on the wrong file and be overwritten by the backup restoration later.
      4c1061b3
    • Pierre-Yves David's avatar
      transaction: move the restoration of backup file in a small closure · 86dc9e09
      Pierre-Yves David authored
      We are about to use that logic in two different location, making is a small
      reusable closure prepares that.
      86dc9e09
    • Pierre-Yves David's avatar
      transaction: raise on backup restoration error · cab3defe
      Pierre-Yves David authored
      A few line above, similar errors in the truncation code result in raising the
      associated exception. We should do the same here.
      
      This means the transaction recover is more strict now, which might be a problem
      when running `hg recover` in a share different from the one where the
      transaction fails. However this has always been a problem and need to be be
      addressed independently.
      cab3defe
Loading