Bug 5042 - corrupted hiddencache crash Mercurial
Summary: corrupted hiddencache crash Mercurial
Status: RESOLVED FIXED
Alias: None
Product: Mercurial
Classification: Unclassified
Component: Mercurial (show other bugs)
Version: default branch
Hardware: PC Linux
: normal bug
Assignee: Bugzilla
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-01-15 20:25 UTC by Pierre-Yves David
Modified: 2016-01-28 00:00 UTC (History)
1 user (show)

See Also:
Python Version: ---


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Pierre-Yves David 2016-01-15 20:25 UTC
cf traceback below


> hg st --debug --traceback
Traceback (most recent call last):
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 189, in _runcatch
    return _dispatch(req)
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 914, in _dispatch
    cmdpats, cmdoptions)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib/python2.6/site-packages/remotefilelog/__init__.py", line 310, in runcommand
    return orig(lui, repo, *args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 673, in runcommand
    ret = _runcommand(ui, options, cmd, d)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib64/python2.6/site-packages/hgext/pager.py", line 143, in pagecmd
    return orig(ui, options, cmd, cmdfunc)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib64/python2.6/site-packages/hgext/color.py", line 518, in colorcmd
    return orig(ui_, opts, cmd, cmdfunc)
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 1045, in _runcommand
    return checkargs()
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 1005, in checkargs
    return cmdfunc()
  File "/usr/lib64/python2.6/site-packages/mercurial/dispatch.py", line 911, in <lambda>
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 994, in check
    return func(*args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 994, in check
    return func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/morestatus.py", line 133, in statuscmd
    ret = orig(ui, repo, *pats, **opts)
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 994, in check
    return func(*args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 994, in check
    return func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/tweakdefaults.py", line 464, in statuscmd
    return orig(ui, repo, *pats, **opts)
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 994, in check
    return func(*args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/mercurial/commands.py", line 6328, in status
    opts.get('subrepos'))
  File "/usr/lib64/python2.6/site-packages/hgwatchman/__init__.py", line 468, in status
    return overridestatus(orig, self, *args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/hgwatchman/__init__.py", line 350, in overridestatus
    listsubrepos)
  File "/usr/lib64/python2.6/site-packages/mercurial/localrepo.py", line 1823, in status
    listsubrepos)
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 349, in status
    listunknown)
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 1632, in _buildstatus
    s = self._dirstatestatus(match, listignored, listclean, listunknown)
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 1605, in _dirstatestatus
    modified2, fixup = self._checklookup(cmp)
  File "/usr/lib64/python2.6/site-packages/mercurial/extensions.py", line 195, in closure
    return func(*(args + a), **kw)
  File "/usr/lib/python2.6/site-packages/remotefilelog/__init__.py", line 235, in checklookup
    if f in parent:
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 87, in __contains__
    return key in self._manifest
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 727, in __get__
    result = self.func(obj)
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 529, in _manifest
    return self._repo.manifest.read(self._changeset[0])
  File "/usr/lib64/python2.6/site-packages/mercurial/util.py", line 727, in __get__
    result = self.func(obj)
  File "/usr/lib64/python2.6/site-packages/mercurial/context.py", line 525, in _changeset
    return self._repo.changelog.read(self.rev())
  File "/usr/lib64/python2.6/site-packages/mercurial/repoview.py", line 308, in changelog
    revs = filterrevs(unfi, self.filtername)
  File "/usr/lib64/python2.6/site-packages/mercurial/repoview.py", line 250, in filterrevs
    repo.filteredrevcache[filtername] = func(repo.unfiltered())
  File "/usr/lib/python2.6/site-packages/directaccess.py", line 65, in _computehidden
    hidden = repoview.filterrevs(repo, 'visible')
  File "/usr/lib64/python2.6/site-packages/mercurial/repoview.py", line 250, in filterrevs
    repo.filteredrevcache[filtername] = func(repo.unfiltered())
  File "/usr/lib64/python2.6/site-packages/mercurial/repoview.py", line 167, in computehidden
    hidden = tryreadcache(repo, hideable)
  File "/usr/lib64/python2.6/site-packages/mercurial/repoview.py", line 144, in tryreadcache
    version, = struct.unpack(">H", fh.read(2))
error: unpack requires a string argument of length 2
Comment 1 HG Bot 2016-01-20 20:30 UTC
Fixed by https://selenic.com/repo/hg/rev/97e0dc6d248c
Laurent Charignon <lcharignon@fb.com>
repoview: fix corrupted hiddencache crash Mercurial (issue5042)

Before this patch if the hiddencache existed but was empty, it would crash
mercurial. This patch adds exception handling when reading the hiddencache to
avoid the issue.
When encountering a corrupted cache file we print a devel warning. There would
be no point in issuing a normal warning as the user wouldn't be able to do
anything about the situation.

The warning looks like:

devel-warn: corrupted hidden cache, removing it at: /path/to/repoview.py

(please test the fix)
Comment 2 Bugzilla 2016-01-28 00:00 UTC
Bug was set to TESTING for 7 days, resolving