hgext3rd/evolve/obscache.py
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 22 Aug 2017 10:59:19 -0700
changeset 2851 a13acecbc850
parent 2796 0fd701dbfcc6
child 3036 60896df503ba
permissions -rw-r--r--
obscache: use _readmarkers() from core with correct signature The copied _readmarkers() went stale with Mercurial core commit 5d3ba4395288 (obsstore: let read marker API take a range of offsets, 2017-06-04). At the same time, the Mercurial core version of the function gained the desired offset argument, so we can now use that function.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to an cache around obsolescence property
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# This module content aims at being upstreamed.
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
#
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     9
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    10
import errno
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    11
import hashlib
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    12
import os
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    13
import struct
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    14
import time
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    15
import weakref
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    16
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    17
from mercurial import (
2328
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
    18
    error,
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    19
    localrepo,
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    20
    obsolete,
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    21
    phases,
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    22
    pycompat,
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    23
    node,
2315
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
    24
    util,
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    25
)
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    26
2328
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
    27
from mercurial.i18n import _
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
    28
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
from . import (
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
    exthelper,
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
)
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
eh = exthelper.exthelper()
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    34
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    35
# prior to hg-4.2 there are not util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    36
if util.safehasattr(util, 'timer'):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    37
    timer = util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    38
elif util.safehasattr(time, "perf_counter"):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    39
    timer = time.perf_counter
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    40
elif getattr(pycompat, 'osname', os.name) == 'nt':
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    41
    timer = time.clock
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    42
else:
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    43
    timer = time.time
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    44
2796
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    45
# hg < 4.2 compat
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    46
try:
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    47
    from mercurial import vfs as vfsmod
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    48
    vfsmod.vfs
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    49
except ImportError:
0fd701dbfcc6 compat: handle pre-4.2 compatibility for accessing vfs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2749
diff changeset
    50
    from mercurial import scmutil as vfsmod
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
    51
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    52
try:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    53
    obsstorefilecache = localrepo.localrepository.obsstore
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    54
except AttributeError:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    55
    # XXX hg-3.8 compat
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    56
    #
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    57
    # mercurial 3.8 has issue with accessing file cache property from their
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    58
    # cache. This is fix by 36fbd72c2f39fef8ad52d7c559906c2bc388760c in core
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
    # and shipped in 3.9
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    60
    obsstorefilecache = localrepo.localrepository.__dict__['obsstore']
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    61
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    62
# obsstore is a filecache so we have do to some spacial dancing
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    63
@eh.wrapfunction(obsstorefilecache, 'func')
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    64
def obsstorewithcache(orig, repo):
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    65
    obsstore = orig(repo)
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
    66
    obsstore.obscache = obscache(repo.unfiltered())
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    67
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    68
    class cachekeyobsstore(obsstore.__class__):
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    69
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    70
        _obskeysize = 200
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    71
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    72
        def cachekey(self, index=None):
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    73
            """return (current-length, cachekey)
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    74
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    75
            'current-length': is the current length of the obsstore storage file,
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    76
            'cachekey' is the hash of the last 200 bytes ending at 'index'.
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    77
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    78
            if 'index' is unspecified, current obsstore length is used.
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    79
            Cacheckey will be set to null id if the obstore is empty.
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    80
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    81
            If the index specified is higher than the current obsstore file
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    82
            length, cachekey will be set to None."""
2306
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    83
            # default value
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    84
            obsstoresize = 0
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    85
            keydata = ''
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    86
            # try to get actual data from the obsstore
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    87
            try:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    88
                with self.svfs('obsstore') as obsfile:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    89
                    obsfile.seek(0, 2)
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    90
                    obsstoresize = obsfile.tell()
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    91
                    if index is None:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    92
                        index = obsstoresize
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    93
                    elif obsstoresize < index:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    94
                        return obsstoresize, None
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    95
                    actualsize = min(index, self._obskeysize)
2306
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    96
                    if actualsize:
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    97
                        obsfile.seek(index - actualsize, 0)
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
    98
                        keydata = obsfile.read(actualsize)
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    99
            except (OSError, IOError) as e:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   100
                if e.errno != errno.ENOENT:
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   101
                    raise
2354
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   102
            if keydata:
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   103
                key = hashlib.sha1(keydata).digest()
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   104
            else:
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   105
                # reusing an existing "empty" value make it easier to define a
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   106
                # default cachekey for 'no data'.
fed22455e510 obscache: use 'nullid' as the hash of an empty obsstore
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2353
diff changeset
   107
                key = node.nullid
2306
b33bc2f37e89 obscache: have the obsstore fix empty file cachekey
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2305
diff changeset
   108
            return obsstoresize, key
2294
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   109
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   110
    obsstore.__class__ = cachekeyobsstore
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   111
75996eafab43 perf: adds some cache key helper on the obsstore class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   112
    return obsstore
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   113
2851
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   114
if obsolete._readmarkers.__code__.co_argcount > 1:
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   115
    # hg-4.3+ has the "offset" parameter, and _fm?readmarkers also have an
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   116
    # extra "stop" parameter
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   117
    _readmarkers = obsolete._readmarkers
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   118
else:
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   119
    # XXX copied as is from Mercurial 4.2 and added the "offset" parameters
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   120
    @util.nogc
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   121
    def _readmarkers(data, offset=None):
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   122
        """Read and enumerate markers from raw data"""
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   123
        off = 0
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   124
        diskversion = struct.unpack('>B', data[off:off + 1])[0]
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   125
        if offset is None:
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   126
            off += 1
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   127
        else:
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   128
            assert 1 <= offset
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   129
            off = offset
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   130
        if diskversion not in obsolete.formats:
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   131
            raise error.Abort(_('parsing obsolete marker: unknown version %r')
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   132
                              % diskversion)
a13acecbc850 obscache: use _readmarkers() from core with correct signature
Martin von Zweigbergk <martinvonz@google.com>
parents: 2796
diff changeset
   133
        return diskversion, obsolete.formats[diskversion][0](data, off)
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   134
2328
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   135
def markersfrom(obsstore, byteoffset, firstmarker):
2345
406c1a57b4ee obscache: return the new data along-side the upgrade needs (and cache key)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2344
diff changeset
   136
    if not firstmarker:
406c1a57b4ee obscache: return the new data along-side the upgrade needs (and cache key)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2344
diff changeset
   137
        return list(obsstore)
406c1a57b4ee obscache: return the new data along-side the upgrade needs (and cache key)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2344
diff changeset
   138
    elif '_all' in vars(obsstore):
2328
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   139
        # if the data are in memory, just use that
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   140
        return obsstore._all[firstmarker:]
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   141
    else:
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   142
        obsdata = obsstore.svfs.tryread('obsstore')
7ccacaa38782 obscache: Only access the new obsmarkers for marker update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2327
diff changeset
   143
        return _readmarkers(obsdata, byteoffset)[1]
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   144
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   145
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   146
class dualsourcecache(object):
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   147
    """An abstract class for cache that needs both changelog and obsstore
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   148
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   149
    This class handle the tracking of changelog and obsstore update. It provide
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   150
    data to performs incremental update (see the 'updatefrom' function for
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   151
    details).  This class can also detect stripping of the changelog or the
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   152
    obsstore and can reset the cache in this cache (see the 'clear' function
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   153
    for details).
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   154
    """
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   155
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   156
    # default key used for an empty cache
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   157
    #
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   158
    # The cache key covering the changesets and obsmarkers content
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   159
    #
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   160
    # The cache key parts are:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   161
    # - tip-rev,
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   162
    # - tip-node,
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   163
    # - obsstore-length (nb markers),
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   164
    # - obsstore-file-size (in bytes),
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   165
    # - obsstore "cache key"
2353
393cbaf0d294 obcache: move empty on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2352
diff changeset
   166
    emptykey = (node.nullrev, node.nullid, 0, 0, node.nullid)
2376
12386f7f5056 dualsourcecache: add a cache name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2375
diff changeset
   167
    _cachename = None # used for error message
2353
393cbaf0d294 obcache: move empty on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2352
diff changeset
   168
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   169
    def __init__(self):
2359
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   170
        super(dualsourcecache, self).__init__()
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   171
        self._cachekey = None
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   172
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   173
    def _updatefrom(self, repo, revs, obsmarkers):
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   174
        """override this method to update your cache data incrementally
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   175
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   176
        revs:      list of new revision in the changelog
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   177
        obsmarker: list of new obsmarkers in the obsstore
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   178
        """
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   179
        raise NotImplementedError
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   180
2333
adf114c767ab obscache: distinct 'clear' and 'reset'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2330
diff changeset
   181
    def clear(self, reset=False):
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   182
        """invalidate the cache content
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   183
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   184
        if 'reset' is passed, we detected a strip and the cache will have to be
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   185
        recomputed.
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   186
        """
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   187
        # /!\ IMPORTANT /!\
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   188
        # You must overide this method to actually
2387
a41d900d015c dualsourcecache: simplify cachekey.clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2385
diff changeset
   189
        if reset:
a41d900d015c dualsourcecache: simplify cachekey.clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2385
diff changeset
   190
            self._cachekey = self.emptykey if reset else None
a41d900d015c dualsourcecache: simplify cachekey.clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2385
diff changeset
   191
        else:
a41d900d015c dualsourcecache: simplify cachekey.clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2385
diff changeset
   192
            self._cachekey = None
2359
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   193
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   194
    def load(self, repo):
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   195
        """Load data from disk
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   196
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   197
        Do not forget to restore the "cachekey" attribute while doing so.
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   198
        """
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   199
        raise NotImplementedError
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   200
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   201
    # Useful public function (no need to override them)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   202
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   203
    def uptodate(self, repo):
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   204
        """return True if the cache content is up to date False otherwise
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   205
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   206
        This method can be used to detect of the cache is lagging behind new
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   207
        data in either changelog or obsstore.
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   208
        """
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   209
        if self._cachekey is None:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   210
            self.load(repo)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   211
        status = self._checkkey(repo.changelog, repo.obsstore)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   212
        return (status is not None
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   213
                and status[0] == self._cachekey[0] # tiprev
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   214
                and status[1] == self._cachekey[3]) # obssize
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   215
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   216
    def update(self, repo):
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   217
        """update the cache with new repository data
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   218
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   219
        The update will be incremental when possible"""
2359
ff635fa59a25 obscache: makes dualsourcecache compatible with obshashrange cache needs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2357
diff changeset
   220
        repo = repo.unfiltered()
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   221
        # If we do not have any data, try loading from disk
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   222
        if self._cachekey is None:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   223
            self.load(repo)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   224
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   225
        assert repo.filtername is None
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   226
        cl = repo.changelog
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   227
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   228
        upgrade = self._upgradeneeded(repo)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   229
        if upgrade is None:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   230
            return
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   231
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   232
        reset, revs, obsmarkers, obskeypair = upgrade
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   233
        if reset or self._cachekey is None:
2382
42092b9d6d25 dualsourcecache: log cache reset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2380
diff changeset
   234
            repo.ui.log('evoext-cache', 'strip detected, %s cache reset\n' % self._cachename)
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   235
            self.clear(reset=True)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   236
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
   237
        starttime = timer()
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   238
        self._updatefrom(repo, revs, obsmarkers)
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2387
diff changeset
   239
        duration = timer() - starttime
2380
694494619795 cache: track time spend updating various cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2379
diff changeset
   240
        repo.ui.log('evoext-cache', 'updated %s in %.4f seconds (%sr, %so)\n',
694494619795 cache: track time spend updating various cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2379
diff changeset
   241
                    self._cachename, duration, len(revs), len(obsmarkers))
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   242
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   243
        # update the key from the new data
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   244
        key = list(self._cachekey)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   245
        if revs:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   246
            key[0] = len(cl) - 1
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   247
            key[1] = cl.node(key[0])
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   248
        if obsmarkers:
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   249
            key[2] += len(obsmarkers)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   250
            key[3], key[4] = obskeypair
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   251
        self._cachekey = tuple(key)
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   252
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   253
    # from here, there are internal function only
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   254
2352
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   255
    def _checkkey(self, changelog, obsstore):
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   256
        """internal function"""
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   257
        key = self._cachekey
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   258
        if key is None:
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   259
            return None
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   260
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   261
        ### Is the cache valid ?
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   262
        keytiprev, keytipnode, keyobslength, keyobssize, keyobskey = key
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   263
        # check for changelog strip
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   264
        tiprev = len(changelog) - 1
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   265
        if (tiprev < keytiprev
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   266
                or changelog.node(keytiprev) != keytipnode):
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   267
            return None
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   268
        # check for obsstore strip
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   269
        obssize, obskey = obsstore.cachekey(index=keyobssize)
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   270
        if obskey != keyobskey:
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   271
            return None
2385
fab59e2cb05f dualsourcecache: fix obskey return by _checkkey
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2382
diff changeset
   272
        if obssize != keyobssize:
fab59e2cb05f dualsourcecache: fix obskey return by _checkkey
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2382
diff changeset
   273
            # we want to return the obskey for the new size
fab59e2cb05f dualsourcecache: fix obskey return by _checkkey
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2382
diff changeset
   274
            __, obskey = obsstore.cachekey(index=obssize)
2352
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   275
        return tiprev, obssize, obskey
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   276
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   277
    def _upgradeneeded(self, repo):
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   278
        """return (valid, start-rev, start-obs-idx)
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   279
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   280
        'valid': is "False" if older cache value needs invalidation,
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   281
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   282
        'start-rev': first revision not in the cache. None if cache is up to date,
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   283
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   284
        'start-obs-idx': index of the first obs-markers not in the cache. None is
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   285
                         up to date.
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   286
        """
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   287
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   288
        # We need to ensure we use the same changelog and obsstore through the
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   289
        # processing. Otherwise some invalidation could update the object and their
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   290
        # content after we computed the cache key.
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   291
        cl = repo.changelog
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   292
        obsstore = repo.obsstore
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   293
        key = self._cachekey
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   294
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   295
        reset = False
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   296
2352
dd8471e54708 obcache: move _checkkey on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2351
diff changeset
   297
        status = self._checkkey(cl, obsstore)
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   298
        if status is None:
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   299
            reset = True
2353
393cbaf0d294 obcache: move empty on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2352
diff changeset
   300
            key = self.emptykey
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   301
            obssize, obskey = obsstore.cachekey()
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   302
            tiprev = len(cl) - 1
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   303
        else:
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   304
            tiprev, obssize, obskey = status
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   305
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   306
        keytiprev, keytipnode, keyobslength, keyobssize, keyobskey = key
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   307
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   308
        if not reset and keytiprev == tiprev and keyobssize == obssize:
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   309
            return None # nothing to upgrade
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   310
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   311
        ### cache is valid, is there anything to update
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   312
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   313
        # any new changesets ?
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   314
        revs = ()
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   315
        if keytiprev < tiprev:
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   316
            revs = list(cl.revs(start=keytiprev + 1, stop=tiprev))
2295
017b971ba28f perf: adds cachekey utility to validate changelog+obsstore content
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2294
diff changeset
   317
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   318
        # any new markers
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   319
        markers = ()
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   320
        if keyobssize < obssize:
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   321
            # XXX Three are a small race change here. Since the obsstore might have
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   322
            # move forward between the time we computed the cache key and we access
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   323
            # the data. To fix this we need so "up to" argument when fetching the
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   324
            # markers here. Otherwise we might return more markers than covered by
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   325
            # the cache key.
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   326
            #
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   327
            # In pratice the cache is only updated after each transaction within a
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   328
            # lock. So we should be fine. We could enforce this with a new repository
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   329
            # requirement (or fix the race, that is not too hard).
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   330
            markers = markersfrom(obsstore, keyobssize, keyobslength)
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   331
2351
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   332
        return reset, revs, markers, (obssize, obskey)
1bec5ee99674 obcache: move updateneeded on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2347
diff changeset
   333
2749
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   334
def getcachevfs(repo):
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   335
    cachevfs = getattr(repo, 'cachevfs', None)
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   336
    if cachevfs is None:
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   337
        cachevfs = vfsmod.vfs(repo.vfs.join('cache'))
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   338
        cachevfs.createmode = repo.store.createmode
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   339
    return cachevfs
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   340
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   341
class obscache(dualsourcecache):
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   342
    """cache the "does a rev" is the precursors of some obsmarkers data
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   343
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   344
    This is not directly holding the "is this revision obsolete" information,
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   345
    because phases data gets into play here. However, it allow to compute the
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   346
    "obsolescence" set without reading the obsstore content.
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   347
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   348
    Implementation note #1:
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   349
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   350
      The obsstore is implementing only half of the transaction logic it
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   351
      should. It properly record the starting point of the obsstore to allow
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   352
      clean rollback. However it still write to the obsstore file directly
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   353
      during the transaction. Instead it should be keeping data in memory and
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   354
      write to a '.pending' file to make the data vailable for hooks.
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   355
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   356
      This cache is not going futher than what the obstore is doing, so it does
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   357
      not has any '.pending' logic. When the obsstore gains proper '.pending'
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   358
      support, adding it to this cache should not be too hard. As the flag
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   359
      always move from 0 to 1, we could have a second '.pending' cache file to
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   360
      be read. If flag is set in any of them, the value is 1. For the same
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   361
      reason, updating the file in place should be possible.
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   362
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   363
    Implementation note #2:
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   364
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   365
      Instead of having a large final update run, we could update this cache at
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   366
      the level adding a new changeset or a new obsmarkers. More on this in the
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   367
      'update code'.
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   368
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   369
    Implementation note #3:
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   370
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   371
        Storage-wise, we could have a "start rev" to avoid storing useless
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   372
        zero. That would be especially useful for the '.pending' overlay.
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   373
    """
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   374
2749
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   375
    _filepath = 'evoext-obscache-00'
2302
acd2431dff29 obscache: update the format to allow negative tiprev
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2301
diff changeset
   376
    _headerformat = '>q20sQQ20s'
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   377
2376
12386f7f5056 dualsourcecache: add a cache name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2375
diff changeset
   378
    _cachename = 'evo-ext-obscache' # used for error message
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   379
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   380
    def __init__(self, repo):
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   381
        super(obscache, self).__init__()
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   382
        self._ondiskkey = None
2749
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   383
        self._vfs = getcachevfs(repo)
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   384
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   385
    @util.propertycache
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   386
    def get(self):
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   387
        """final signature: obscache.get(rev)
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   388
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   389
        return True if "rev" is used as "precursors for any obsmarkers
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   390
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   391
        IMPORTANT: make sure the cache has been updated to match the repository
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   392
        content before using it
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   393
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   394
        We use a property cache to skip the attribute resolution overhead in
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   395
        hot loops."""
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   396
        return self._data.__getitem__
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   397
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   398
    def _setdata(self, data):
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   399
        """set a new bytearray data, invalidating the 'get' shortcut if needed"""
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   400
        self._data = data
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   401
        if 'get' in vars(self):
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   402
            del self.get
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   403
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   404
    def clear(self, reset=False):
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   405
        """invalidate the cache content"""
2357
f787f5406a98 obscache: extract a data agnostic class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2356
diff changeset
   406
        super(obscache, self).clear(reset=reset)
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   407
        self._setdata(bytearray())
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   408
2356
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   409
    def _updatefrom(self, repo, revs, obsmarkers):
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   410
        if revs:
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   411
            self._updaterevs(repo, revs)
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   412
        if obsmarkers:
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   413
            self._updatemarkers(repo, obsmarkers)
d5de0529a48f obscache: extract the actual data update in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2355
diff changeset
   414
2326
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   415
    def _updaterevs(self, repo, revs):
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   416
        """update the cache with new revisions
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   417
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   418
        Newly added changeset might be affected by obsolescence markers
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   419
        we already have locally. So we needs to have some global
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   420
        knowledge about the markers to handle that question.
2326
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   421
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   422
        Right now this requires parsing all markers in the obsstore. We could
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   423
        imagine using various optimisation (eg: another cache, network
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   424
        exchange, etc).
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   425
2330
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   426
        A possible approach to this is to build a set of all node used as
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   427
        precursors in `obsstore._obscandidate`. If markers are not loaded yet,
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   428
        we could initialize it by doing a quick scan through the obsstore data
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   429
        and filling a (pre-sized) set. Doing so would be much faster than
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   430
        parsing all the obsmarkers since we would access less data, not create
d72c8c1f09e2 obscache: document a possible way forward to skipping obsstore parsing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2329
diff changeset
   431
        any object beside the nodes and not have to decode any complex data.
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   432
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   433
        For now we stick to the simpler approach of paying the
2326
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   434
        performance cost on new changesets.
72853bade853 obscache: extract code to update from new revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2325
diff changeset
   435
        """
2570
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   436
        new_entries = bytearray(len(revs))
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   437
        if not self._data:
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   438
            self._setdata(new_entries)
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   439
        else:
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   440
            self._data.extend(new_entries)
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   441
        data = self._data
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   442
        if repo.obsstore:
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   443
            node = repo.changelog.node
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   444
            succs = repo.obsstore.successors
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   445
            for r in revs:
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   446
                if node(r) in succs:
86959f2c625d obscache: directly allocate zeroed bytearray
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2569
diff changeset
   447
                    data[r] = 1
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   448
2327
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   449
    def _updatemarkers(self, repo, obsmarkers):
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   450
        """update the cache with new markers"""
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   451
        rev = repo.changelog.nodemap.get
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   452
        for m in obsmarkers:
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   453
            r = rev(m[0])
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   454
            if r is not None:
6b751daad348 obscache: extract _updatemarkers code into its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2326
diff changeset
   455
                self._data[r] = 1
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   456
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   457
    def save(self, repo):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   458
        """save the data to disk"""
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   459
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   460
        # XXX it happens that the obsstore is (buggilly) always up to date on disk
2309
9f09cabe679e obscache: skip writing to disk if the data did not changed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2308
diff changeset
   461
        if self._cachekey is None or self._cachekey == self._ondiskkey:
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   462
            return
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   463
2749
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   464
        cachefile = self._vfs(self._filepath, 'w', atomictemp=True)
2316
35a548465647 compat: drop the context manager used to write the cache file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2315
diff changeset
   465
        headerdata = struct.pack(self._headerformat, *self._cachekey)
35a548465647 compat: drop the context manager used to write the cache file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2315
diff changeset
   466
        cachefile.write(headerdata)
35a548465647 compat: drop the context manager used to write the cache file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2315
diff changeset
   467
        cachefile.write(self._data)
35a548465647 compat: drop the context manager used to write the cache file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2315
diff changeset
   468
        cachefile.close()
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   469
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   470
    def load(self, repo):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   471
        """load data from disk"""
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   472
        assert repo.filtername is None
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   473
2749
e1b7ea48e243 compat: use 'repo.cachevfs' when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2594
diff changeset
   474
        data = self._vfs.tryread(self._filepath)
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   475
        if not data:
2353
393cbaf0d294 obcache: move empty on the class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2352
diff changeset
   476
            self._cachekey = self.emptykey
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   477
            self._setdata(bytearray())
2309
9f09cabe679e obscache: skip writing to disk if the data did not changed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2308
diff changeset
   478
        else:
9f09cabe679e obscache: skip writing to disk if the data did not changed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2308
diff changeset
   479
            headersize = struct.calcsize(self._headerformat)
9f09cabe679e obscache: skip writing to disk if the data did not changed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2308
diff changeset
   480
            self._cachekey = struct.unpack(self._headerformat, data[:headersize])
2552
006400e25e22 obscache: shortcut the attribute access for testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   481
            self._setdata(bytearray(data[headersize:]))
2309
9f09cabe679e obscache: skip writing to disk if the data did not changed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2308
diff changeset
   482
        self._ondiskkey = self._cachekey
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   483
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   484
def _computeobsoleteset(orig, repo):
2298
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   485
    """the set of obsolete revisions"""
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   486
    obs = set()
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   487
    repo = repo.unfiltered()
2315
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
   488
    if util.safehasattr(repo._phasecache, 'getrevset'):
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
   489
        notpublic = repo._phasecache.getrevset(repo, (phases.draft, phases.secret))
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
   490
    else:
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
   491
        # < hg-4.2 compat
e16f6bef5848 compat: make obscache code compatible with Mercurial version prior to 4.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2309
diff changeset
   492
        notpublic = repo.revs("not public()")
2298
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   493
    if notpublic:
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   494
        obscache = repo.obsstore.obscache
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   495
        # Since we warm the cache at the end of every transaction, the cache
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   496
        # should be up to date. However a non-enabled client might have touched
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   497
        # the repository.
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   498
        #
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   499
        # Updating the cache without a lock is sloppy, so we fallback to the
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   500
        # old method and rely on the fact the next transaction will write the
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   501
        # cache down anyway.
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   502
        #
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   503
        # With the current implementation updating the cache will requires to
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   504
        # load the obsstore anyway. Once loaded, hitting the obsstore directly
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   505
        # will be about as fast...
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   506
        if not obscache.uptodate(repo):
2304
2f15090712fe obscache: still update and use the cache during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2303
diff changeset
   507
            if repo.currenttransaction() is None:
2379
3593442d4a0e obshashrange: adds blackbox usage in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2376
diff changeset
   508
                repo.ui.log('evoext-cache',
2305
a786240c95bd obscache: log case where the cache is not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2304
diff changeset
   509
                            'obscache is out of date, '
a786240c95bd obscache: log case where the cache is not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2304
diff changeset
   510
                            'falling back to slower obsstore version\n')
2554
08bd8ab55cc9 obscache: add a missing "new line" at the end of a debug message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   511
                repo.ui.debug('obscache is out of date\n')
2304
2f15090712fe obscache: still update and use the cache during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2303
diff changeset
   512
                return orig(repo)
2f15090712fe obscache: still update and use the cache during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2303
diff changeset
   513
            else:
2329
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   514
                # If a transaction is open, it is worthwhile to update and use
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   515
                # the cache, the lock prevent race and it will be written on
3bb8382fc4cb obscache: update some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2328
diff changeset
   516
                # disk when the transaction close.
2304
2f15090712fe obscache: still update and use the cache during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2303
diff changeset
   517
                obscache.update(repo)
2298
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   518
        isobs = obscache.get
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   519
    for r in notpublic:
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   520
        if isobs(r):
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   521
            obs.add(r)
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   522
    return obs
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   523
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   524
@eh.uisetup
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   525
def cachefuncs(ui):
2300
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   526
    orig = obsolete.cachefuncs['obsolete']
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   527
    wrapped = lambda repo: _computeobsoleteset(orig, repo)
01efebff13ec obscache: skip the cache entirely if not up to date
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2298
diff changeset
   528
    obsolete.cachefuncs['obsolete'] = wrapped
2298
8199204274f0 perf: use the cache to compute the obsolete set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2297
diff changeset
   529
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   530
@eh.reposetup
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   531
def setupcache(ui, repo):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   532
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   533
    class obscacherepo(repo.__class__):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   534
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   535
        @localrepo.unfilteredmethod
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   536
        def destroyed(self):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   537
            if 'obsstore' in vars(self):
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   538
                self.obsstore.obscache.clear()
2367
3be45918c7b5 evolve: fixing obscache invalidation
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 2316
diff changeset
   539
            super(obscacherepo, self).destroyed()
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   540
2569
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   541
        if util.safehasattr(repo, 'updatecaches'):
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   542
            @localrepo.unfilteredmethod
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   543
            def updatecaches(self, tr=None):
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   544
                super(obscacherepo, self).updatecaches(tr)
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   545
                self.obsstore.obscache.update(repo)
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   546
                self.obsstore.obscache.save(repo)
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   547
427f6091250e obscache: plug on core 'update cache' method if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2568
diff changeset
   548
        else:
2568
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   549
            def transaction(self, *args, **kwargs):
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   550
                tr = super(obscacherepo, self).transaction(*args, **kwargs)
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   551
                reporef = weakref.ref(self)
2297
32cdcf493567 perf: warm the cache after all transactions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2296
diff changeset
   552
2568
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   553
                def _warmcache(tr):
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   554
                    repo = reporef()
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   555
                    if repo is None:
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   556
                        return
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   557
                    repo = repo.unfiltered()
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   558
                    # As pointed in 'obscache.update', we could have the changelog
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   559
                    # and the obsstore in charge of updating the cache when new
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   560
                    # items goes it. The tranaction logic would then only be
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   561
                    # involved for the 'pending' and final writing on disk.
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   562
                    self.obsstore.obscache.update(repo)
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   563
                    self.obsstore.obscache.save(repo)
2297
32cdcf493567 perf: warm the cache after all transactions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2296
diff changeset
   564
2568
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   565
                tr.addpostclose('warmcache-obscache', _warmcache)
ea0889178dbb obscache: pre-indent code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2552
diff changeset
   566
                return tr
2297
32cdcf493567 perf: warm the cache after all transactions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2296
diff changeset
   567
2296
d6584ce58030 perf: adds a cache to know if obsmarkers might affect a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2295
diff changeset
   568
    repo.__class__ = obscacherepo