Mercurial > hg
changeset 20957:469d949a7cb8 stable
revlog: deal with chunk ranges over 2G on Windows (issue4215)
Python uses a C long (32 bits on Windows 64) rather than an ssize_t in
read(), and thus has a 2G size limit. Work around this by falling back
to reading one chunk at a time on overflow. This approximately doubles
our headroom until we run back into the size limit on single reads.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 07 Apr 2014 14:18:10 -0500 |
parents | e9725e18bdf8 |
children | 774ff56cbe34 a0f437e2f5a9 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 7 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Thu Apr 03 20:35:56 2014 -0500 +++ b/mercurial/revlog.py Mon Apr 07 14:18:10 2014 -0500 @@ -909,8 +909,13 @@ ladd = l.append # preload the cache - self._chunkraw(revs[0], revs[-1]) - offset, data = self._chunkcache + try: + self._chunkraw(revs[0], revs[-1]) + offset, data = self._chunkcache + except OverflowError: + # issue4215 - we can't cache a run of chunks greater than + # 2G on Windows + return [self._chunk(rev) for rev in revs] for rev in revs: chunkstart = start(rev)