Show More
@@ -263,3 +263,4 b' 803e61387e86f103483120df35619bdb175e3482' | |||||
263 | 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 |
@@ -279,3 +279,4 b' 803e61387e86f103483120df35619bdb175e3482' | |||||
279 | 028dc3f92dbd0f93bb78f9848c94ba5eecd72e71 6.7.3 |
|
279 | 028dc3f92dbd0f93bb78f9848c94ba5eecd72e71 6.7.3 | |
280 | a1a011d4b148955975cb40d619d285fdd4ee8713 6.7.4 |
|
280 | a1a011d4b148955975cb40d619d285fdd4ee8713 6.7.4 | |
281 | 6454c117c6a4003f07d8f4281dd90038955123e4 6.8rc0 |
|
281 | 6454c117c6a4003f07d8f4281dd90038955123e4 6.8rc0 | |
|
282 | 11f41248595b6dd7e0fbb434ecbf75c418785a4c 6.8 |
@@ -7,6 +7,11 b'' | |||||
7 | * GNU General Public License version 2 or any later version. |
|
7 | * GNU General Public License version 2 or any later version. | |
8 | */ |
|
8 | */ | |
9 |
|
9 | |||
|
10 | #if defined(__sun) && !defined(_XOPEN_SOURCE) | |||
|
11 | /* msg_control is used */ | |||
|
12 | #define _XOPEN_SOURCE 600 | |||
|
13 | #endif | |||
|
14 | ||||
10 | #include <arpa/inet.h> /* for ntohl(), htonl() */ |
|
15 | #include <arpa/inet.h> /* for ntohl(), htonl() */ | |
11 | #include <assert.h> |
|
16 | #include <assert.h> | |
12 | #include <ctype.h> |
|
17 | #include <ctype.h> | |
@@ -26,6 +31,10 b'' | |||||
26 | #include "procutil.h" |
|
31 | #include "procutil.h" | |
27 | #include "util.h" |
|
32 | #include "util.h" | |
28 |
|
33 | |||
|
34 | #ifndef O_DIRECTORY | |||
|
35 | #define O_DIRECTORY O_RDONLY | |||
|
36 | #endif | |||
|
37 | ||||
29 | enum { |
|
38 | enum { | |
30 | CAP_GETENCODING = 0x0001, |
|
39 | CAP_GETENCODING = 0x0001, | |
31 | CAP_RUNCOMMAND = 0x0002, |
|
40 | CAP_RUNCOMMAND = 0x0002, |
@@ -237,6 +237,8 b' def list_stdlib_modules():' | |||||
237 | yield m |
|
237 | yield m | |
238 | for m in ['cffi']: |
|
238 | for m in ['cffi']: | |
239 | yield m |
|
239 | yield m | |
|
240 | yield 'distutils' # in Python < 3.12 | |||
|
241 | yield 'distutils.version' # in Python < 3.12 | |||
240 | stdlib_prefixes = {sys.prefix, sys.exec_prefix} |
|
242 | stdlib_prefixes = {sys.prefix, sys.exec_prefix} | |
241 | # We need to supplement the list of prefixes for the search to work |
|
243 | # We need to supplement the list of prefixes for the search to work | |
242 | # when run from within a virtualenv. |
|
244 | # when run from within a virtualenv. |
@@ -1213,11 +1213,12 b' class revbranchcache:' | |||||
1213 |
|
1213 | |||
1214 | if self._names: |
|
1214 | if self._names: | |
1215 | try: |
|
1215 | try: | |
1216 |
|
|
1216 | usemmap = repo.ui.configbool(b'storage', b'revbranchcache.mmap') | |
1217 |
|
|
1217 | with repo.cachevfs(_rbcrevs) as fp: | |
|
1218 | if usemmap and repo.cachevfs.is_mmap_safe(_rbcrevs): | |||
1218 | data = util.buffer(util.mmapread(fp)) |
|
1219 | data = util.buffer(util.mmapread(fp)) | |
1219 | else: |
|
1220 | else: | |
1220 |
data = |
|
1221 | data = fp.read() | |
1221 | self._rbcrevs = rbcrevs(data) |
|
1222 | self._rbcrevs = rbcrevs(data) | |
1222 | except (IOError, OSError) as inst: |
|
1223 | except (IOError, OSError) as inst: | |
1223 | repo.ui.debug( |
|
1224 | repo.ui.debug( |
@@ -1788,7 +1788,7 b' def _addpartsfromopts(ui, repo, bundler,' | |||||
1788 | addpartrevbranchcache(repo, bundler, outgoing) |
|
1788 | addpartrevbranchcache(repo, bundler, outgoing) | |
1789 |
|
1789 | |||
1790 | if opts.get(b'obsolescence', False): |
|
1790 | if opts.get(b'obsolescence', False): | |
1791 |
obsmarkers = repo.obsstore.relevantmarkers( |
|
1791 | obsmarkers = repo.obsstore.relevantmarkers(outgoing.missing) | |
1792 | buildobsmarkerspart( |
|
1792 | buildobsmarkerspart( | |
1793 | bundler, |
|
1793 | bundler, | |
1794 | obsmarkers, |
|
1794 | obsmarkers, |
@@ -2147,7 +2147,7 b' experimental = true # experimental as l' | |||||
2147 | [[items]] |
|
2147 | [[items]] | |
2148 | section = "storage" |
|
2148 | section = "storage" | |
2149 | name = "revbranchcache.mmap" |
|
2149 | name = "revbranchcache.mmap" | |
2150 |
default = |
|
2150 | default = false | |
2151 |
|
2151 | |||
2152 | [[items]] |
|
2152 | [[items]] | |
2153 | section = "storage" |
|
2153 | section = "storage" |
@@ -703,8 +703,8 b' def _pushdiscoveryobsmarkers(pushop):' | |||||
703 | repo = pushop.repo |
|
703 | repo = pushop.repo | |
704 | # very naive computation, that can be quite expensive on big repo. |
|
704 | # very naive computation, that can be quite expensive on big repo. | |
705 | # However: evolution is currently slow on them anyway. |
|
705 | # However: evolution is currently slow on them anyway. | |
706 |
|
|
706 | nodes = (c.node() for c in repo.set(b'::%ln', pushop.futureheads)) | |
707 |
pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers( |
|
707 | pushop.outobsmarkers = pushop.repo.obsstore.relevantmarkers(nodes) | |
708 |
|
708 | |||
709 |
|
709 | |||
710 | @pushdiscovery(b'bookmarks') |
|
710 | @pushdiscovery(b'bookmarks') | |
@@ -2605,8 +2605,8 b' def _getbundleobsmarkerpart(' | |||||
2605 | if kwargs.get('obsmarkers', False): |
|
2605 | if kwargs.get('obsmarkers', False): | |
2606 | if heads is None: |
|
2606 | if heads is None: | |
2607 | heads = repo.heads() |
|
2607 | heads = repo.heads() | |
2608 |
|
|
2608 | subset = [c.node() for c in repo.set(b'::%ln', heads)] | |
2609 |
markers = repo.obsstore.relevantmarkers( |
|
2609 | markers = repo.obsstore.relevantmarkers(subset) | |
2610 | markers = obsutil.sortedmarkers(markers) |
|
2610 | markers = obsutil.sortedmarkers(markers) | |
2611 | bundle2.buildobsmarkerspart(bundler, markers) |
|
2611 | bundle2.buildobsmarkerspart(bundler, markers) | |
2612 |
|
2612 |
@@ -771,11 +771,10 b' class obsstore:' | |||||
771 | _addchildren(self.children, markers) |
|
771 | _addchildren(self.children, markers) | |
772 | _checkinvalidmarkers(self.repo, markers) |
|
772 | _checkinvalidmarkers(self.repo, markers) | |
773 |
|
773 | |||
774 |
def relevantmarkers(self, nodes |
|
774 | def relevantmarkers(self, nodes): | |
775 | """return a set of all obsolescence markers relevant to a set of |
|
775 | """return a set of all obsolescence markers relevant to a set of nodes. | |
776 | nodes or revisions. |
|
|||
777 |
|
776 | |||
778 |
"relevant" to a set of nodes |
|
777 | "relevant" to a set of nodes mean: | |
779 |
|
778 | |||
780 | - marker that use this changeset as successor |
|
779 | - marker that use this changeset as successor | |
781 | - prune marker of direct children on this changeset |
|
780 | - prune marker of direct children on this changeset | |
@@ -783,21 +782,8 b' class obsstore:' | |||||
783 | markers |
|
782 | markers | |
784 |
|
783 | |||
785 | It is a set so you cannot rely on order.""" |
|
784 | It is a set so you cannot rely on order.""" | |
786 | if nodes is None: |
|
|||
787 | nodes = set() |
|
|||
788 | if revs is None: |
|
|||
789 | revs = set() |
|
|||
790 |
|
785 | |||
791 | get_rev = self.repo.unfiltered().changelog.index.get_rev |
|
786 | pendingnodes = set(nodes) | |
792 | pendingnodes = set() |
|
|||
793 | for marker in self._all: |
|
|||
794 | for node in (marker[0],) + marker[1] + (marker[5] or ()): |
|
|||
795 | if node in nodes: |
|
|||
796 | pendingnodes.add(node) |
|
|||
797 | elif revs: |
|
|||
798 | rev = get_rev(node) |
|
|||
799 | if rev is not None and rev in revs: |
|
|||
800 | pendingnodes.add(node) |
|
|||
801 | seenmarkers = set() |
|
787 | seenmarkers = set() | |
802 | seennodes = set(pendingnodes) |
|
788 | seennodes = set(pendingnodes) | |
803 | precursorsmarkers = self.predecessors |
|
789 | precursorsmarkers = self.predecessors |
@@ -108,7 +108,7 b' def getmarkers(repo, nodes=None, exclusi' | |||||
108 | elif exclusive: |
|
108 | elif exclusive: | |
109 | rawmarkers = exclusivemarkers(repo, nodes) |
|
109 | rawmarkers = exclusivemarkers(repo, nodes) | |
110 | else: |
|
110 | else: | |
111 |
rawmarkers = repo.obsstore.relevantmarkers(nodes |
|
111 | rawmarkers = repo.obsstore.relevantmarkers(nodes) | |
112 |
|
112 | |||
113 | for markerdata in rawmarkers: |
|
113 | for markerdata in rawmarkers: | |
114 | yield marker(repo, markerdata) |
|
114 | yield marker(repo, markerdata) |
@@ -1460,7 +1460,10 b' class revlog:' | |||||
1460 | with self.opener(filepath) as fp: |
|
1460 | with self.opener(filepath) as fp: | |
1461 | if mmap_threshold is not None: |
|
1461 | if mmap_threshold is not None: | |
1462 | file_size = self.opener.fstat(fp).st_size |
|
1462 | file_size = self.opener.fstat(fp).st_size | |
1463 |
if |
|
1463 | if ( | |
|
1464 | file_size >= mmap_threshold | |||
|
1465 | and self.opener.is_mmap_safe(filepath) | |||
|
1466 | ): | |||
1464 | if size is not None: |
|
1467 | if size is not None: | |
1465 | # avoid potentiel mmap crash |
|
1468 | # avoid potentiel mmap crash | |
1466 | size = min(file_size, size) |
|
1469 | size = min(file_size, size) |
@@ -74,7 +74,7 b' def persisted_data(revlog):' | |||||
74 | test_race_hook_1() |
|
74 | test_race_hook_1() | |
75 | try: |
|
75 | try: | |
76 | with revlog.opener(filename) as fd: |
|
76 | with revlog.opener(filename) as fd: | |
77 | if use_mmap: |
|
77 | if use_mmap and revlog.opener.is_mmap_safe(filename): | |
78 | try: |
|
78 | try: | |
79 | data = util.buffer(util.mmapread(fd, data_length)) |
|
79 | data = util.buffer(util.mmapread(fd, data_length)) | |
80 | except ValueError: |
|
80 | except ValueError: | |
@@ -205,7 +205,7 b' def persist_nodemap(tr, revlog, pending=' | |||||
205 | fd.seek(target_docket.data_length) |
|
205 | fd.seek(target_docket.data_length) | |
206 | fd.write(data) |
|
206 | fd.write(data) | |
207 | if feed_data: |
|
207 | if feed_data: | |
208 | if use_mmap: |
|
208 | if use_mmap and revlog.opener.is_mmap_safe(datafile): | |
209 | fd.flush() |
|
209 | fd.flush() | |
210 | new_data = util.buffer(util.mmapread(fd, new_length)) |
|
210 | new_data = util.buffer(util.mmapread(fd, new_length)) | |
211 | else: |
|
211 | else: | |
@@ -238,11 +238,11 b' def persist_nodemap(tr, revlog, pending=' | |||||
238 | with revlog.opener(datafile, b'w+') as fd: |
|
238 | with revlog.opener(datafile, b'w+') as fd: | |
239 | fd.write(data) |
|
239 | fd.write(data) | |
240 | if feed_data: |
|
240 | if feed_data: | |
241 | if use_mmap: |
|
241 | if use_mmap and revlog.opener.is_mmap_safe(datafile): | |
242 | new_data = data |
|
|||
243 | else: |
|
|||
244 | fd.flush() |
|
242 | fd.flush() | |
245 | new_data = util.buffer(util.mmapread(fd, len(data))) |
|
243 | new_data = util.buffer(util.mmapread(fd, len(data))) | |
|
244 | else: | |||
|
245 | new_data = data | |||
246 | target_docket.data_length = len(data) |
|
246 | target_docket.data_length = len(data) | |
247 | target_docket.tip_rev = revlog.tiprev() |
|
247 | target_docket.tip_rev = revlog.tiprev() | |
248 | target_docket.tip_node = revlog.node(target_docket.tip_rev) |
|
248 | target_docket.tip_node = revlog.node(target_docket.tip_rev) |
@@ -441,6 +441,13 b' class bufferedinputpipe:' | |||||
441 |
|
441 | |||
442 |
|
442 | |||
443 | def mmapread(fp, size=None): |
|
443 | def mmapread(fp, size=None): | |
|
444 | """Read a file content using mmap | |||
|
445 | ||||
|
446 | The responsability of checking the file system is mmap safe is the | |||
|
447 | responsability of the caller. | |||
|
448 | ||||
|
449 | In some case, a normal string might be returned. | |||
|
450 | """ | |||
444 | if size == 0: |
|
451 | if size == 0: | |
445 | # size of 0 to mmap.mmap() means "all data" |
|
452 | # size of 0 to mmap.mmap() means "all data" | |
446 | # rather than "zero bytes", so special case that. |
|
453 | # rather than "zero bytes", so special case that. |
@@ -189,6 +189,35 b' class abstractvfs:' | |||||
189 | def lstat(self, path: Optional[bytes] = None): |
|
189 | def lstat(self, path: Optional[bytes] = None): | |
190 | return os.lstat(self.join(path)) |
|
190 | return os.lstat(self.join(path)) | |
191 |
|
191 | |||
|
192 | def is_mmap_safe(self, path: Optional[bytes] = None) -> bool: | |||
|
193 | """return True if it is safe to read a file content as mmap | |||
|
194 | ||||
|
195 | This focus on the file system aspect of such safety, the application | |||
|
196 | logic around that file is not taken into account, so caller need to | |||
|
197 | make sure the file won't be truncated in a way that will create SIGBUS | |||
|
198 | on access. | |||
|
199 | ||||
|
200 | ||||
|
201 | The initial motivation for this logic is that if mmap is used on NFS | |||
|
202 | and somebody deletes the mapped file (e.g. by renaming on top of it), | |||
|
203 | then you get SIGBUS, which can be pretty disruptive: we get core dump | |||
|
204 | reports, and the process terminates without writing to the blackbox. | |||
|
205 | ||||
|
206 | Instead in this situation we prefer to read the file normally. | |||
|
207 | The risk of ESTALE in the middle of the read remains, but it's | |||
|
208 | smaller because we read sooner and the error should be reported | |||
|
209 | just as any other error. | |||
|
210 | ||||
|
211 | Note that python standard library does not offer the necessary function | |||
|
212 | to detect the file stem bits. So this detection rely on compiled bits | |||
|
213 | and is not available in pure python. | |||
|
214 | """ | |||
|
215 | # XXX Since we already assume a vfs to address a consistent file system | |||
|
216 | # in other location, we could determine the fstype once for the root | |||
|
217 | # and cache that value. | |||
|
218 | fstype = util.getfstype(self.join(path)) | |||
|
219 | return fstype is not None and fstype != b'nfs' | |||
|
220 | ||||
192 | def listdir(self, path: Optional[bytes] = None): |
|
221 | def listdir(self, path: Optional[bytes] = None): | |
193 | return os.listdir(self.join(path)) |
|
222 | return os.listdir(self.join(path)) | |
194 |
|
223 |
@@ -1,6 +1,4 b'' | |||||
1 |
= Mercurial 6.8 |
|
1 | = Mercurial 6.8 = | |
2 |
|
||||
3 | /!\ This is a tentative release, any and all notes below are subject to change or removal. |
|
|||
4 |
|
2 | |||
5 | As usual, a *lot* of patches don't make it to this list. |
|
3 | As usual, a *lot* of patches don't make it to this list. | |
6 |
|
4 | |||
@@ -32,8 +30,6 b" As usual, a *lot* of patches don't make " | |||||
32 | * tags-cache: skip the filternode step if we are not going to use it |
|
30 | * tags-cache: skip the filternode step if we are not going to use it | |
33 | * tags-cache: directly operate on rev-num warming hgtagsfnodescache |
|
31 | * tags-cache: directly operate on rev-num warming hgtagsfnodescache | |
34 | * tags-cache: directly perform a monimal walk for hgtagsfnodescache warming |
|
32 | * tags-cache: directly perform a monimal walk for hgtagsfnodescache warming | |
35 | * exchange: improve computation of relevant markers for large repos |
|
|||
36 |
|
||||
37 |
|
33 | |||
38 | == New Experimental Features == |
|
34 | == New Experimental Features == | |
39 |
|
35 | |||
@@ -43,9 +39,9 b" As usual, a *lot* of patches don't make " | |||||
43 | * branchcache: add a "pure topological head" fast path |
|
39 | * branchcache: add a "pure topological head" fast path | |
44 | * branchcache: allow to detect "pure topological case" for branchmap |
|
40 | * branchcache: allow to detect "pure topological case" for branchmap | |
45 |
|
41 | |||
46 |
|
||||
47 | == Bug Fixes == |
|
42 | == Bug Fixes == | |
48 |
|
43 | |||
|
44 | * rust: use `cpython` 0.7.2 crate to add support for Python 3.12 | |||
49 | * perf-stream-locked-section: actually use v1 generation when requested |
|
45 | * perf-stream-locked-section: actually use v1 generation when requested | |
50 | * perf-stream-locked-section: fix the call to the v3 generator |
|
46 | * perf-stream-locked-section: fix the call to the v3 generator | |
51 | * perf-stream-locked-section: advertise the right version key in the help |
|
47 | * perf-stream-locked-section: advertise the right version key in the help | |
@@ -62,6 +58,8 b" As usual, a *lot* of patches don't make " | |||||
62 | * hgrc: search XDG_CONFIG_HOME on mac |
|
58 | * hgrc: search XDG_CONFIG_HOME on mac | |
63 | * clonebundles: add missing newline to legacy response |
|
59 | * clonebundles: add missing newline to legacy response | |
64 | * narrow: add a test for linkrev computation done during widen |
|
60 | * narrow: add a test for linkrev computation done during widen | |
|
61 | * Multiple fixes to guard against mmap issues | |||
|
62 | * portability: fix build on Solaris-derived systemd | |||
65 |
|
63 | |||
66 | == Backwards Compatibility Changes == |
|
64 | == Backwards Compatibility Changes == | |
67 |
|
65 |
@@ -236,9 +236,9 b' dependencies = [' | |||||
236 |
|
236 | |||
237 | [[package]] |
|
237 | [[package]] | |
238 | name = "cpython" |
|
238 | name = "cpython" | |
239 |
version = "0.7. |
|
239 | version = "0.7.2" | |
240 | source = "registry+https://github.com/rust-lang/crates.io-index" |
|
240 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
241 | checksum = "3052106c29da7390237bc2310c1928335733b286287754ea85e6093d2495280e" |
|
241 | checksum = "43b398a2c65baaf5892f10bb69b52508bf7a993380cc4ecd3785aaebb5c79389" | |
242 | dependencies = [ |
|
242 | dependencies = [ | |
243 | "libc", |
|
243 | "libc", | |
244 | "num-traits", |
|
244 | "num-traits", | |
@@ -912,9 +912,9 b' dependencies = [' | |||||
912 |
|
912 | |||
913 | [[package]] |
|
913 | [[package]] | |
914 | name = "python3-sys" |
|
914 | name = "python3-sys" | |
915 |
version = "0.7. |
|
915 | version = "0.7.2" | |
916 | source = "registry+https://github.com/rust-lang/crates.io-index" |
|
916 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
917 | checksum = "49f8b50d72fb3015735aa403eebf19bbd72c093bfeeae24ee798be5f2f1aab52" |
|
917 | checksum = "0f53ef6740367a09718d2cd21ba15b0d7972342a38e554736bcee7773e45c9f5" | |
918 | dependencies = [ |
|
918 | dependencies = [ | |
919 | "libc", |
|
919 | "libc", | |
920 | "regex", |
|
920 | "regex", |
@@ -37,7 +37,7 b' set up verbosemmap extension' | |||||
37 |
|
37 | |||
38 | mmap index which is now more than 4k long |
|
38 | mmap index which is now more than 4k long | |
39 | $ hg log -l 5 -T '{rev}\n' --config experimental.mmapindexthreshold=4k |
|
39 | $ hg log -l 5 -T '{rev}\n' --config experimental.mmapindexthreshold=4k | |
40 | mmapping $TESTTMP/a/.hg/store/00changelog.i |
|
40 | mmapping $TESTTMP/a/.hg/store/00changelog.i (no-pure !) | |
41 | mmapping $TESTTMP/a/.hg/store/00changelog-????????.nd (glob) (rust !) |
|
41 | mmapping $TESTTMP/a/.hg/store/00changelog-????????.nd (glob) (rust !) | |
42 | 100 |
|
42 | 100 | |
43 | 99 |
|
43 | 99 |
General Comments 0
You need to be logged in to leave comments.
Login now