Patchwork D7026: treemanifest: move out of experimental

login
register
mail settings
Submitter phabricator
Date Oct. 8, 2019, 9:04 p.m.
Message ID <differential-rev-PHID-DREV-xqouaotvehnl6v5iegsu-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/42124/
State New
Headers show

Comments

phabricator - Oct. 8, 2019, 9:04 p.m.
pulkit created this revision.
Herald added a reviewer: durin42.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  In recent sprint, we discussed that treemanifest should be moved out of
  experimental. The feature has been used inside Google, Facebook in some forms
  and was used inside Yandex too for narrow clones.
  
  There is an issue with diffing of large treemanifests and to fix that some
  Python code needs to be rewritted in C/Rust. This I think is not a blocker for
  taking treemanifest out of experimental.
  
  This patch renames config `experimental.treemanifest` to `storage.treemanifest`.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D7026

AFFECTED FILES
  mercurial/changegroup.py
  mercurial/configitems.py
  mercurial/localrepo.py
  tests/test-narrow-clone-stream.t
  tests/test-narrow-commit.t
  tests/test-narrow-merge.t
  tests/test-narrow-share.t
  tests/test-narrow-sparse.t
  tests/test-narrow-strip.t
  tests/test-narrow-trackedcmd.t
  tests/test-narrow-widen-no-ellipsis.t
  tests/test-narrow-widen.t
  tests/test-narrow.t
  tests/test-strip-cross.t
  tests/test-treemanifest.t
  tests/test-upgrade-repo.t

CHANGE DETAILS




To: pulkit, durin42, #hg-reviewers
Cc: mercurial-devel
Pierre-Yves David - Oct. 9, 2019, 4:16 a.m.
the storage session is more about small configuration of the storage 
system without impact on the repository. The `format` section is more 
appropriate for things that deeply impact the repository format.

So this should probably at least lives in the `format` as 
`format.use-tree-manifest`.

However, this is also the first "scheme" change we get. repository using 
tree-manifest will never be able to push to a repository not using it. 
That make `tree-manifest` different from anything that live in the 
`format` section right now.

So maybe: `format.manifest-scheme=tree-manifest` ?

On 10/8/19 11:04 PM, pulkit (Pulkit Goyal) wrote:
> pulkit created this revision.
> Herald added a reviewer: durin42.
> Herald added a subscriber: mercurial-devel.
> Herald added a reviewer: hg-reviewers.
> 
> REVISION SUMMARY
>    In recent sprint, we discussed that treemanifest should be moved out of
>    experimental. The feature has been used inside Google, Facebook in some forms
>    and was used inside Yandex too for narrow clones.
>    
>    There is an issue with diffing of large treemanifests and to fix that some
>    Python code needs to be rewritted in C/Rust. This I think is not a blocker for
>    taking treemanifest out of experimental.
>    
>    This patch renames config `experimental.treemanifest` to `storage.treemanifest`.
> 
> REPOSITORY
>    rHG Mercurial
> 
> REVISION DETAIL
>    https://phab.mercurial-scm.org/D7026
> 
> AFFECTED FILES
>    mercurial/changegroup.py
>    mercurial/configitems.py
>    mercurial/localrepo.py
>    tests/test-narrow-clone-stream.t
>    tests/test-narrow-commit.t
>    tests/test-narrow-merge.t
>    tests/test-narrow-share.t
>    tests/test-narrow-sparse.t
>    tests/test-narrow-strip.t
>    tests/test-narrow-trackedcmd.t
>    tests/test-narrow-widen-no-ellipsis.t
>    tests/test-narrow-widen.t
>    tests/test-narrow.t
>    tests/test-strip-cross.t
>    tests/test-treemanifest.t
>    tests/test-upgrade-repo.t
> 
> CHANGE DETAILS
> 
> diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t
> --- a/tests/test-upgrade-repo.t
> +++ b/tests/test-upgrade-repo.t
> @@ -35,7 +35,7 @@
>   
>   Do not yet support upgrading treemanifest repos
>   
> -  $ hg --config experimental.treemanifest=true init treemanifest
> +  $ hg --config storage.treemanifest=true init treemanifest
>     $ hg -R treemanifest debugupgraderepo
>     abort: cannot upgrade repository; unsupported source requirement: treemanifest
>     [255]
> @@ -43,7 +43,7 @@
>   Cannot add treemanifest requirement during upgrade
>   
>     $ hg init disallowaddedreq
> -  $ hg -R disallowaddedreq --config experimental.treemanifest=true debugupgraderepo
> +  $ hg -R disallowaddedreq --config storage.treemanifest=true debugupgraderepo
>     abort: cannot upgrade repository; do not support adding requirement: treemanifest
>     [255]
>   
> diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t
> --- a/tests/test-treemanifest.t
> +++ b/tests/test-treemanifest.t
> @@ -5,7 +5,7 @@
>   
>   Set up repo
>   
> -  $ hg --config experimental.treemanifest=True init repo
> +  $ hg --config storage.treemanifest=True init repo
>     $ cd repo
>   
>   Requirements get set on init
> @@ -222,7 +222,7 @@
>   Create clone with tree manifests enabled
>   
>     $ cd ..
> -  $ hg clone --config experimental.treemanifest=1 \
> +  $ hg clone --config storage.treemanifest=1 \
>     >   http://localhost:$HGPORT repo-mixed -r 1
>     adding changesets
>     adding manifests
> @@ -305,7 +305,7 @@
>          0       4 064927a0648a 000000000000 000000000000
>          1       5 25ecb8cb8618 000000000000 000000000000
>     $ echo 2 > dir1/a
> -  $ hg --config experimental.treemanifest=False ci -qm 'modify dir1/a'
> +  $ hg --config storage.treemanifest=False ci -qm 'modify dir1/a'
>     $ hg debugindex --dir dir1
>        rev linkrev nodeid       p1           p2
>          0       4 064927a0648a 000000000000 000000000000
> @@ -392,7 +392,7 @@
>   
>   Pushing to an empty repo works
>   
> -  $ hg --config experimental.treemanifest=1 init clone
> +  $ hg --config storage.treemanifest=1 init clone
>     $ grep treemanifest clone/.hg/requires
>     treemanifest
>     $ hg push -R repo clone
> @@ -414,7 +414,7 @@
>   
>   Create deeper repo with tree manifests.
>   
> -  $ hg --config experimental.treemanifest=True init deeprepo
> +  $ hg --config storage.treemanifest=True init deeprepo
>     $ cd deeprepo
>   
>     $ mkdir .A
> @@ -673,7 +673,7 @@
>     $ cat hg.pid >> $DAEMON_PIDS
>     $ cd ..
>   We can clone even with the knob turned off and we'll get a treemanifest repo.
> -  $ hg clone --config experimental.treemanifest=False \
> +  $ hg clone --config storage.treemanifest=False \
>     >   --config experimental.changegroup3=True \
>     >   http://localhost:$HGPORT deepclone
>     requesting all changes
> @@ -850,7 +850,7 @@
>   
>     $ mkdir grafted-dir-repo
>     $ cd grafted-dir-repo
> -  $ hg --config experimental.treemanifest=1 init
> +  $ hg --config storage.treemanifest=1 init
>     $ mkdir dir
>     $ echo a > dir/file
>     $ echo a > file
> @@ -868,7 +868,7 @@
>     created new head
>     $ cd ..
>   
> -  $ hg --config experimental.treemanifest=1 clone --pull -r 1 \
> +  $ hg --config storage.treemanifest=1 clone --pull -r 1 \
>     >   grafted-dir-repo grafted-dir-repo-clone
>     adding changesets
>     adding manifests
> diff --git a/tests/test-strip-cross.t b/tests/test-strip-cross.t
> --- a/tests/test-strip-cross.t
> +++ b/tests/test-strip-cross.t
> @@ -164,13 +164,13 @@
>   
>   Now a similar test for a non-root manifest revlog
>     $ cat >> $HGRCPATH <<EOF
> -  > [experimental]
> +  > [storage]
>     > treemanifests = yes
>     > EOF
>     $ mkdir treemanifests
>     $ cd treemanifests
>     $
> -  $ hg --config experimental.treemanifest=True init orig
> +  $ hg --config storage.treemanifest=True init orig
>     $ cd orig
>     $ commit 'dir/file'
>     $ commit 'dir/other'
> @@ -179,7 +179,7 @@
>     $ commit 'otherdir dir/file'
>     $ commit 'otherdir dir/other' 'otherdir dir/file'
>     $ cd ..
> -  $ hg --config experimental.treemanifest=True clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
> +  $ hg --config storage.treemanifest=True clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
>     $ cd crossed
>     $ hg debugindex --dir dir
>        rev linkrev nodeid       p1           p2
> @@ -190,7 +190,7 @@
>   
>     $ cd ..
>     $ for i in 2 3; do
> -  >     hg --config experimental.treemanifest=True clone -q -U --pull crossed $i
> +  >     hg --config storage.treemanifest=True clone -q -U --pull crossed $i
>     >     echo "% Trying to strip revision $i"
>     >     hg --cwd $i strip $i
>     >     echo "% Verifying"
> diff --git a/tests/test-narrow.t b/tests/test-narrow.t
> --- a/tests/test-narrow.t
> +++ b/tests/test-narrow.t
> @@ -17,7 +17,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-widen.t b/tests/test-narrow-widen.t
> --- a/tests/test-narrow-widen.t
> +++ b/tests/test-narrow-widen.t
> @@ -3,7 +3,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-widen-no-ellipsis.t b/tests/test-narrow-widen-no-ellipsis.t
> --- a/tests/test-narrow-widen-no-ellipsis.t
> +++ b/tests/test-narrow-widen-no-ellipsis.t
> @@ -3,7 +3,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-trackedcmd.t b/tests/test-narrow-trackedcmd.t
> --- a/tests/test-narrow-trackedcmd.t
> +++ b/tests/test-narrow-trackedcmd.t
> @@ -3,7 +3,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-strip.t b/tests/test-narrow-strip.t
> --- a/tests/test-narrow-strip.t
> +++ b/tests/test-narrow-strip.t
> @@ -12,7 +12,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-sparse.t b/tests/test-narrow-sparse.t
> --- a/tests/test-narrow-sparse.t
> +++ b/tests/test-narrow-sparse.t
> @@ -10,7 +10,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-share.t b/tests/test-narrow-share.t
> --- a/tests/test-narrow-share.t
> +++ b/tests/test-narrow-share.t
> @@ -4,7 +4,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-merge.t b/tests/test-narrow-merge.t
> --- a/tests/test-narrow-merge.t
> +++ b/tests/test-narrow-merge.t
> @@ -4,7 +4,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-commit.t b/tests/test-narrow-commit.t
> --- a/tests/test-narrow-commit.t
> +++ b/tests/test-narrow-commit.t
> @@ -4,7 +4,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/tests/test-narrow-clone-stream.t b/tests/test-narrow-clone-stream.t
> --- a/tests/test-narrow-clone-stream.t
> +++ b/tests/test-narrow-clone-stream.t
> @@ -6,7 +6,7 @@
>   
>   #if tree
>     $ cat << EOF >> $HGRCPATH
> -  > [experimental]
> +  > [storage]
>     > treemanifest = 1
>     > EOF
>   #endif
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -3515,7 +3515,7 @@
>       # experimental config: format.use-side-data
>       if ui.configbool(b'format', b'use-side-data'):
>           requirements.add(SIDEDATA_REQUIREMENT)
> -    if ui.configbool(b'experimental', b'treemanifest'):
> +    if ui.configbool(b'storage', b'treemanifest'):
>           requirements.add(b'treemanifest')
>   
>       revlogv2 = ui.config(b'experimental', b'revlogv2')
> diff --git a/mercurial/configitems.py b/mercurial/configitems.py
> --- a/mercurial/configitems.py
> +++ b/mercurial/configitems.py
> @@ -679,9 +679,6 @@
>       b'experimental', b'sparse-read.min-gap-size', default=b'65K',
>   )
>   coreconfigitem(
> -    b'experimental', b'treemanifest', default=False,
> -)
> -coreconfigitem(
>       b'experimental', b'update.atomic-file', default=False,
>   )
>   coreconfigitem(
> @@ -1056,6 +1053,10 @@
>       b'storage', b'revlog.zstd.level', default=None,
>   )
>   coreconfigitem(
> +    b'storage', b'treemanifest', default=False,
> +    alias=[(b'experimental', b'treemanifest')],
> +)
> +coreconfigitem(
>       b'server', b'bookmarks-pushkey-compat', default=True,
>   )
>   coreconfigitem(
> diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
> --- a/mercurial/changegroup.py
> +++ b/mercurial/changegroup.py
> @@ -1468,7 +1468,7 @@
>       needv03 = False
>       if (
>           repo.ui.configbool(b'experimental', b'changegroup3')
> -        or repo.ui.configbool(b'experimental', b'treemanifest')
> +        or repo.ui.configbool(b'storage', b'treemanifest')
>           or b'treemanifest' in repo.requirements
>       ):
>           # we keep version 03 because we need to to exchange treemanifest data
> 
> 
> 
> To: pulkit, durin42, #hg-reviewers
> Cc: mercurial-devel
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
phabricator - Oct. 15, 2019, 10:46 p.m.
durin42 added a comment.


  That sounds fine

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7026/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7026

To: pulkit, durin42, #hg-reviewers
Cc: marmoute, mercurial-devel

Patch

diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t
--- a/tests/test-upgrade-repo.t
+++ b/tests/test-upgrade-repo.t
@@ -35,7 +35,7 @@ 
 
 Do not yet support upgrading treemanifest repos
 
-  $ hg --config experimental.treemanifest=true init treemanifest
+  $ hg --config storage.treemanifest=true init treemanifest
   $ hg -R treemanifest debugupgraderepo
   abort: cannot upgrade repository; unsupported source requirement: treemanifest
   [255]
@@ -43,7 +43,7 @@ 
 Cannot add treemanifest requirement during upgrade
 
   $ hg init disallowaddedreq
-  $ hg -R disallowaddedreq --config experimental.treemanifest=true debugupgraderepo
+  $ hg -R disallowaddedreq --config storage.treemanifest=true debugupgraderepo
   abort: cannot upgrade repository; do not support adding requirement: treemanifest
   [255]
 
diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t
--- a/tests/test-treemanifest.t
+++ b/tests/test-treemanifest.t
@@ -5,7 +5,7 @@ 
 
 Set up repo
 
-  $ hg --config experimental.treemanifest=True init repo
+  $ hg --config storage.treemanifest=True init repo
   $ cd repo
 
 Requirements get set on init
@@ -222,7 +222,7 @@ 
 Create clone with tree manifests enabled
 
   $ cd ..
-  $ hg clone --config experimental.treemanifest=1 \
+  $ hg clone --config storage.treemanifest=1 \
   >   http://localhost:$HGPORT repo-mixed -r 1
   adding changesets
   adding manifests
@@ -305,7 +305,7 @@ 
        0       4 064927a0648a 000000000000 000000000000
        1       5 25ecb8cb8618 000000000000 000000000000
   $ echo 2 > dir1/a
-  $ hg --config experimental.treemanifest=False ci -qm 'modify dir1/a'
+  $ hg --config storage.treemanifest=False ci -qm 'modify dir1/a'
   $ hg debugindex --dir dir1
      rev linkrev nodeid       p1           p2
        0       4 064927a0648a 000000000000 000000000000
@@ -392,7 +392,7 @@ 
 
 Pushing to an empty repo works
 
-  $ hg --config experimental.treemanifest=1 init clone
+  $ hg --config storage.treemanifest=1 init clone
   $ grep treemanifest clone/.hg/requires
   treemanifest
   $ hg push -R repo clone
@@ -414,7 +414,7 @@ 
 
 Create deeper repo with tree manifests.
 
-  $ hg --config experimental.treemanifest=True init deeprepo
+  $ hg --config storage.treemanifest=True init deeprepo
   $ cd deeprepo
 
   $ mkdir .A
@@ -673,7 +673,7 @@ 
   $ cat hg.pid >> $DAEMON_PIDS
   $ cd ..
 We can clone even with the knob turned off and we'll get a treemanifest repo.
-  $ hg clone --config experimental.treemanifest=False \
+  $ hg clone --config storage.treemanifest=False \
   >   --config experimental.changegroup3=True \
   >   http://localhost:$HGPORT deepclone
   requesting all changes
@@ -850,7 +850,7 @@ 
 
   $ mkdir grafted-dir-repo
   $ cd grafted-dir-repo
-  $ hg --config experimental.treemanifest=1 init
+  $ hg --config storage.treemanifest=1 init
   $ mkdir dir
   $ echo a > dir/file
   $ echo a > file
@@ -868,7 +868,7 @@ 
   created new head
   $ cd ..
 
-  $ hg --config experimental.treemanifest=1 clone --pull -r 1 \
+  $ hg --config storage.treemanifest=1 clone --pull -r 1 \
   >   grafted-dir-repo grafted-dir-repo-clone
   adding changesets
   adding manifests
diff --git a/tests/test-strip-cross.t b/tests/test-strip-cross.t
--- a/tests/test-strip-cross.t
+++ b/tests/test-strip-cross.t
@@ -164,13 +164,13 @@ 
 
 Now a similar test for a non-root manifest revlog
   $ cat >> $HGRCPATH <<EOF
-  > [experimental]
+  > [storage]
   > treemanifests = yes
   > EOF
   $ mkdir treemanifests
   $ cd treemanifests
   $ 
-  $ hg --config experimental.treemanifest=True init orig
+  $ hg --config storage.treemanifest=True init orig
   $ cd orig
   $ commit 'dir/file'
   $ commit 'dir/other'
@@ -179,7 +179,7 @@ 
   $ commit 'otherdir dir/file'
   $ commit 'otherdir dir/other' 'otherdir dir/file'
   $ cd ..
-  $ hg --config experimental.treemanifest=True clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
+  $ hg --config storage.treemanifest=True clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
   $ cd crossed
   $ hg debugindex --dir dir
      rev linkrev nodeid       p1           p2
@@ -190,7 +190,7 @@ 
 
   $ cd ..
   $ for i in 2 3; do
-  >     hg --config experimental.treemanifest=True clone -q -U --pull crossed $i
+  >     hg --config storage.treemanifest=True clone -q -U --pull crossed $i
   >     echo "% Trying to strip revision $i"
   >     hg --cwd $i strip $i
   >     echo "% Verifying"
diff --git a/tests/test-narrow.t b/tests/test-narrow.t
--- a/tests/test-narrow.t
+++ b/tests/test-narrow.t
@@ -17,7 +17,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-widen.t b/tests/test-narrow-widen.t
--- a/tests/test-narrow-widen.t
+++ b/tests/test-narrow-widen.t
@@ -3,7 +3,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-widen-no-ellipsis.t b/tests/test-narrow-widen-no-ellipsis.t
--- a/tests/test-narrow-widen-no-ellipsis.t
+++ b/tests/test-narrow-widen-no-ellipsis.t
@@ -3,7 +3,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-trackedcmd.t b/tests/test-narrow-trackedcmd.t
--- a/tests/test-narrow-trackedcmd.t
+++ b/tests/test-narrow-trackedcmd.t
@@ -3,7 +3,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-strip.t b/tests/test-narrow-strip.t
--- a/tests/test-narrow-strip.t
+++ b/tests/test-narrow-strip.t
@@ -12,7 +12,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-sparse.t b/tests/test-narrow-sparse.t
--- a/tests/test-narrow-sparse.t
+++ b/tests/test-narrow-sparse.t
@@ -10,7 +10,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-share.t b/tests/test-narrow-share.t
--- a/tests/test-narrow-share.t
+++ b/tests/test-narrow-share.t
@@ -4,7 +4,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-merge.t b/tests/test-narrow-merge.t
--- a/tests/test-narrow-merge.t
+++ b/tests/test-narrow-merge.t
@@ -4,7 +4,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-commit.t b/tests/test-narrow-commit.t
--- a/tests/test-narrow-commit.t
+++ b/tests/test-narrow-commit.t
@@ -4,7 +4,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/tests/test-narrow-clone-stream.t b/tests/test-narrow-clone-stream.t
--- a/tests/test-narrow-clone-stream.t
+++ b/tests/test-narrow-clone-stream.t
@@ -6,7 +6,7 @@ 
 
 #if tree
   $ cat << EOF >> $HGRCPATH
-  > [experimental]
+  > [storage]
   > treemanifest = 1
   > EOF
 #endif
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -3515,7 +3515,7 @@ 
     # experimental config: format.use-side-data
     if ui.configbool(b'format', b'use-side-data'):
         requirements.add(SIDEDATA_REQUIREMENT)
-    if ui.configbool(b'experimental', b'treemanifest'):
+    if ui.configbool(b'storage', b'treemanifest'):
         requirements.add(b'treemanifest')
 
     revlogv2 = ui.config(b'experimental', b'revlogv2')
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -679,9 +679,6 @@ 
     b'experimental', b'sparse-read.min-gap-size', default=b'65K',
 )
 coreconfigitem(
-    b'experimental', b'treemanifest', default=False,
-)
-coreconfigitem(
     b'experimental', b'update.atomic-file', default=False,
 )
 coreconfigitem(
@@ -1056,6 +1053,10 @@ 
     b'storage', b'revlog.zstd.level', default=None,
 )
 coreconfigitem(
+    b'storage', b'treemanifest', default=False,
+    alias=[(b'experimental', b'treemanifest')],
+)
+coreconfigitem(
     b'server', b'bookmarks-pushkey-compat', default=True,
 )
 coreconfigitem(
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -1468,7 +1468,7 @@ 
     needv03 = False
     if (
         repo.ui.configbool(b'experimental', b'changegroup3')
-        or repo.ui.configbool(b'experimental', b'treemanifest')
+        or repo.ui.configbool(b'storage', b'treemanifest')
         or b'treemanifest' in repo.requirements
     ):
         # we keep version 03 because we need to to exchange treemanifest data