datapack: allow 'long' for metadata types

Summary:
Previously the code required that sizes be of type int. Since python plays loose
with integer types, we also need to support long.

Test Plan:
The existing test-remotefilelog-repack-fast.t test was completely
broken. It only enabled fast datapacks for the server repo, not the clients.
Enabling it for the clients as well catches this issue and verifies the fix.

Reviewers: #fbhgext, quark

Reviewed By: #fbhgext, quark

Differential Revision: https://phab.mercurial-scm.org/D54
This commit is contained in:
Durham Goode 2017-07-11 17:02:15 -07:00
parent ce47fb8c56
commit 79639557a1
4 changed files with 34 additions and 29 deletions

View File

@ -144,8 +144,8 @@ def _buildpackmeta(metadict):
return metabuf
_metaitemtypes = {
constants.METAKEYFLAG: int,
constants.METAKEYSIZE: int,
constants.METAKEYFLAG: (int, long),
constants.METAKEYSIZE: (int, long),
}
def buildpackmeta(metadict):
@ -156,11 +156,11 @@ def buildpackmeta(metadict):
"""
newmeta = {}
for k, v in (metadict or {}).iteritems():
expectedtype = _metaitemtypes.get(k, bytes)
expectedtype = _metaitemtypes.get(k, (bytes,))
if not isinstance(v, expectedtype):
raise error.ProgrammingError('packmeta: wrong type of key %s' % k)
# normalize int to binary buffer
if expectedtype is int:
if int in expectedtype:
# optimization: remove flag if it's 0 to save space
if k == constants.METAKEYFLAG and v == 0:
continue
@ -176,7 +176,7 @@ def parsepackmeta(metabuf):
"""
metadict = _parsepackmeta(metabuf)
for k, v in metadict.iteritems():
if k in _metaitemtypes and _metaitemtypes[k] is int:
if k in _metaitemtypes and int in _metaitemtypes[k]:
metadict[k] = bin2int(v)
return metadict

View File

@ -6,6 +6,7 @@ cat >> $HGRCPATH <<EOF
cachepath=$CACHEDIR
debug=True
historypackv1=True
datapackversion=1
[extensions]
remotefilelog=
rebase=

View File

@ -3,13 +3,17 @@
$ . "$TESTDIR/library.sh"
$ cat >> $HGRCPATH <<EOF
> [remotefilelog]
> fastdatapack=True
> EOF
$ hginit master
$ cd master
$ cat >> .hg/hgrc <<EOF
> [remotefilelog]
> server=True
> serverexpiration=-1
> fastdatapack=True
> EOF
$ echo x > x
$ hg commit -qAm x

View File

@ -82,7 +82,7 @@
$ ls_l $CACHEDIR/master/packs/manifests | grep pack
-r--r--r-- 262 7535b6084226436bbdff33043969e7fa963e8428.histpack
-r--r--r-- 315 d24c358c968883e3b6c4bd6a85845dfb28fd8de6.datapack
-r--r--r-- 327 be1a1ae9828d9bd09ab8ba765db358f99fd09ea7.datapack
$ hg debugdatapack $CACHEDIR/master/packs/manifests/*.datapack
@ -114,40 +114,40 @@
-r--r--r-- 248 5d1716bbef6e7200192de6509055d1ee31a4172c.datapack
-r--r--r-- 146 cffef142da32f3e52c1779490e5d0ddac5f9b82b.datapack
$ hg repack
$ ls -l .hg/store/packs/manifests | grep datapack
* 362 * 9e5a04938d53f5b418e4f1b6a413d250f231f60a.datapack (glob)
$ ls_l .hg/store/packs/manifests | grep datapack
-r--r--r-- 374 201094db51b761cd78352c055b3135178aadfec5.datapack
# Test incremental repacking of trees
$ echo b >> dir/b && hg commit -Aqm 'modify dir/b'
$ echo b >> dir/b && hg commit -Aqm 'modify dir/b'
$ ls -l .hg/store/packs/manifests | grep datapack
* 248 * 21501384df03b8489b366c5218be639fa08830e4.datapack (glob)
* 362 * 9e5a04938d53f5b418e4f1b6a413d250f231f60a.datapack (glob)
* 248 * d7e689a91ac63385be120a118af9ce8663748f28.datapack (glob)
$ ls_l .hg/store/packs/manifests | grep datapack
-r--r--r-- 374 201094db51b761cd78352c055b3135178aadfec5.datapack
-r--r--r-- 248 21501384df03b8489b366c5218be639fa08830e4.datapack
-r--r--r-- 248 d7e689a91ac63385be120a118af9ce8663748f28.datapack
- repack incremental does nothing here because there are so few packs
$ hg repack --incremental --config remotefilelog.data.generations=300,200 --config remotefilelog.data.repacksizelimit=300
$ ls -l .hg/store/packs/manifests | grep datapack
* 248 * 21501384df03b8489b366c5218be639fa08830e4.datapack (glob)
* 362 * 9e5a04938d53f5b418e4f1b6a413d250f231f60a.datapack (glob)
* 248 * d7e689a91ac63385be120a118af9ce8663748f28.datapack (glob)
$ ls_l .hg/store/packs/manifests | grep datapack
-r--r--r-- 374 201094db51b761cd78352c055b3135178aadfec5.datapack
-r--r--r-- 248 21501384df03b8489b366c5218be639fa08830e4.datapack
-r--r--r-- 248 d7e689a91ac63385be120a118af9ce8663748f28.datapack
$ echo b >> dir/b && hg commit -Aqm 'modify dir/b'
$ echo b >> dir/b && hg commit -Aqm 'modify dir/b'
$ echo b >> dir/b && hg commit -Aqm 'modify dir/b'
$ ls -l .hg/store/packs/manifests | grep datapack
* 248 * 21501384df03b8489b366c5218be639fa08830e4.datapack (glob)
* 248 * 347263bf1efbdb5bf7e1d1565b6b504073fb9093.datapack (glob)
* 248 * 544a3b46a61732209116ae50847ec333b75e3765.datapack (glob)
* 248 * 863908ef8149261ab0d891c2344d8e8766c39441.datapack (glob)
* 362 * 9e5a04938d53f5b418e4f1b6a413d250f231f60a.datapack (glob)
* 248 * d7e689a91ac63385be120a118af9ce8663748f28.datapack (glob)
$ ls_l .hg/store/packs/manifests | grep datapack
-r--r--r-- 374 201094db51b761cd78352c055b3135178aadfec5.datapack
-r--r--r-- 248 21501384df03b8489b366c5218be639fa08830e4.datapack
-r--r--r-- 248 347263bf1efbdb5bf7e1d1565b6b504073fb9093.datapack
-r--r--r-- 248 544a3b46a61732209116ae50847ec333b75e3765.datapack
-r--r--r-- 248 863908ef8149261ab0d891c2344d8e8766c39441.datapack
-r--r--r-- 248 d7e689a91ac63385be120a118af9ce8663748f28.datapack
- repack incremental kicks in once there are a number of packs
$ hg repack --incremental --config remotefilelog.data.generations=300,200
$ ls -l .hg/store/packs/manifests | grep datapack
* 1148 * 57360ff79b595e6474abacd912600d61b5e5c840.datapack (glob)
* 362 * 9e5a04938d53f5b418e4f1b6a413d250f231f60a.datapack (glob)
$ ls_l .hg/store/packs/manifests | grep datapack
-r--r--r-- 374 201094db51b761cd78352c055b3135178aadfec5.datapack
-r--r--r-- 1188 785af77b59c45dd43e3e0e63929d77665c505387.datapack
Test repacking from revlogs to pack files on the server
$ cd ../master
@ -169,10 +169,10 @@ Test repacking from revlogs to pack files on the server
$ hg repack
$ ls .hg/cache/packs/manifests
56e8c6f0ca2a324b8b5ca1a2730323a1b4d0793a.dataidx
56e8c6f0ca2a324b8b5ca1a2730323a1b4d0793a.datapack
7535b6084226436bbdff33043969e7fa963e8428.histidx
7535b6084226436bbdff33043969e7fa963e8428.histpack
d24c358c968883e3b6c4bd6a85845dfb28fd8de6.dataidx
d24c358c968883e3b6c4bd6a85845dfb28fd8de6.datapack
$ hg debugdatapack .hg/cache/packs/manifests/*.datapack