hgext3rd/evolve/obsdiscovery.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 27 May 2019 01:53:36 +0200
changeset 4643 77f3699e711e
parent 4487 d972041022cb
child 4644 b228672b0ff9
permissions -rw-r--r--
obsdiscovery: drop `obshash` discovery protocol (issue6136) The protocol has been superseeded by stablerange for a long time. It is untested and more and more buggy. Since this is deprecated experimental code in an experimental code, we drop it. We keep the underlying computation and debug command around for now. They might still be useful to looks at repositories
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to the discovery of obsolescence marker "over the wire"
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
2124
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
     8
# Status: Experiment in progress // open question
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
     9
#
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    10
#   The final discovery algorithm and protocol will go into core when we'll be
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    11
#   happy with it.
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    12
#
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    13
#   Some of the code in this module is for compatiblity with older version
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    14
#   of evolve and will be eventually dropped.
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    15
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
from __future__ import absolute_import
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    18
import hashlib
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    19
import heapq
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
    20
import sqlite3
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    21
import struct
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
    22
import weakref
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    23
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
from mercurial import (
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
    error,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
    exchange,
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    27
    extensions,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
    localrepo,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
    node,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
    obsolete,
2081
010a8af416a0 discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2076
diff changeset
    31
    scmutil,
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
    32
    util,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    34
from mercurial.i18n import _
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
from . import (
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3521
diff changeset
    37
    compat,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    38
    exthelper,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
    39
    obscache,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    40
    utility,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2124
diff changeset
    41
    stablerange,
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
    42
    stablerangecache,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    43
)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    44
3708
d7a89d5b3684 wirepeer: try modern module first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
    45
try:
d7a89d5b3684 wirepeer: try modern module first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
    46
    from mercurial import wireprototypes, wireprotov1server
d7a89d5b3684 wirepeer: try modern module first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
    47
    from mercurial.wireprotov1peer import wirepeer
d7a89d5b3684 wirepeer: try modern module first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
    48
    from mercurial.wireprototypes import encodelist, decodelist
d7a89d5b3684 wirepeer: try modern module first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
    49
except (ImportError, AttributeError): # <= hg-4.5
3681
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
    50
    from mercurial import wireproto as wireprototypes
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
    51
    wireprotov1server = wireprototypes
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
    52
    from mercurial.wireproto import wirepeer, encodelist, decodelist
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
    53
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    54
_pack = struct.pack
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    55
_unpack = struct.unpack
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
    56
_calcsize = struct.calcsize
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    57
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    58
eh = exthelper.exthelper()
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
obsexcmsg = utility.obsexcmsg
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    60
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2551
diff changeset
    61
# Config
4324
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
    62
eh.configitem('experimental', 'evolution.obsdiscovery', True)
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
    63
eh.configitem('experimental', 'obshashrange', True)
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
    64
eh.configitem('experimental', 'obshashrange.warm-cache', 'auto')
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
    65
eh.configitem('experimental', 'obshashrange.max-revs', None)
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
    66
eh.configitem('experimental', 'obshashrange.lru-size', 2000)
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2551
diff changeset
    67
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    68
##################################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    69
###  Code performing discovery ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    70
##################################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    71
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    72
def findmissingrange(ui, local, remote, probeset,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    73
                     initialsamplesize=100,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    74
                     fullsamplesize=200):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    75
    missing = set()
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3681
diff changeset
    76
    starttime = util.timer()
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    77
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    78
    heads = local.revs('heads(%ld)', probeset)
2239
f4f6ff874c40 stablerange: warm cache before using it in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2233
diff changeset
    79
    local.stablerange.warmup(local)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    80
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
    81
    rangelength = local.stablerange.rangelength
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
    82
    subranges = local.stablerange.subranges
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    83
    # size of slice ?
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    84
    heappop = heapq.heappop
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    85
    heappush = heapq.heappush
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    86
    heapify = heapq.heapify
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    87
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    88
    tested = set()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    89
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    90
    sample = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    91
    samplesize = initialsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    92
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    93
    def addentry(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    94
        if entry in tested:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    95
            return False
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    96
        sample.append(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    97
        tested.add(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    98
        return True
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    99
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   100
    for h in heads:
2196
2ecc88baabf9 stablerange: directly use tuple to refer to a stable range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2195
diff changeset
   101
        entry = (h, 0)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   102
        addentry(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   103
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   104
    local.obsstore.rangeobshashcache.update(local)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   105
    querycount = 0
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   106
    compat.progress(ui, _("comparing obsmarker with other"), querycount,
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   107
                    unit=_("queries"))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   108
    overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   109
    while sample or overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   110
        if overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   111
            sample.extend(overflow)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   112
            overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   113
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   114
        if samplesize < len(sample):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   115
            # too much sample already
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   116
            overflow = sample[samplesize:]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   117
            sample = sample[:samplesize]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   118
        elif len(sample) < samplesize:
2242
128923ff68c8 obshashrange: improve message issued during discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2241
diff changeset
   119
            ui.debug("query %i; add more sample (target %i, current %i)\n"
128923ff68c8 obshashrange: improve message issued during discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2241
diff changeset
   120
                     % (querycount, samplesize, len(sample)))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   121
            # we need more sample !
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   122
            needed = samplesize - len(sample)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   123
            sliceme = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   124
            heapify(sliceme)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   125
            for entry in sample:
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   126
                if 1 < rangelength(local, entry):
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   127
                    heappush(sliceme, (-rangelength(local, entry), entry))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   128
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   129
            while sliceme and 0 < needed:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   130
                _key, target = heappop(sliceme)
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
   131
                for new in subranges(local, target):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   132
                    # XXX we could record hierarchy to optimise drop
2203
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   133
                    if addentry(new):
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   134
                        if 1 < len(new):
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   135
                            heappush(sliceme, (-rangelength(local, new), new))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   136
                        needed -= 1
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   137
                        if needed <= 0:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   138
                            break
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   139
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   140
        # no longer the first interation
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   141
        samplesize = fullsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   142
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   143
        nbsample = len(sample)
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   144
        maxsize = max([rangelength(local, r) for r in sample])
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   145
        ui.debug("query %i; sample size is %i, largest range %i\n"
2202
5f8a2604bb2b findmissingrange: fix reversed value in debug output
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2196
diff changeset
   146
                 % (querycount, nbsample, maxsize))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   147
        nbreplies = 0
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   148
        replies = list(_queryrange(ui, local, remote, sample))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   149
        sample = []
2144
2200f67e1628 stablerange: stop using '.node' in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2143
diff changeset
   150
        n = local.changelog.node
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   151
        for entry, remotehash in replies:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   152
            nbreplies += 1
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   153
            if remotehash == _obshashrange(local, entry):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   154
                continue
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   155
            elif 1 == rangelength(local, entry):
2144
2200f67e1628 stablerange: stop using '.node' in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2143
diff changeset
   156
                missing.add(n(entry[0]))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   157
            else:
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
   158
                for new in subranges(local, entry):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   159
                    addentry(new)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   160
        assert nbsample == nbreplies
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   161
        querycount += 1
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   162
        compat.progress(ui, _("comparing obsmarker with other"), querycount,
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   163
                        unit=_("queries"))
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   164
    compat.progress(ui, _("comparing obsmarker with other"), None)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   165
    local.obsstore.rangeobshashcache.save(local)
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3681
diff changeset
   166
    duration = util.timer() - starttime
2408
0af6bb0bfdc3 discovery: log information about obshashrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2399
diff changeset
   167
    logmsg = ('obsdiscovery, %d/%d mismatch'
0af6bb0bfdc3 discovery: log information about obshashrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2399
diff changeset
   168
              ' - %d obshashrange queries in %.4f seconds\n')
0af6bb0bfdc3 discovery: log information about obshashrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2399
diff changeset
   169
    logmsg %= (len(missing), len(probeset), querycount, duration)
0af6bb0bfdc3 discovery: log information about obshashrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2399
diff changeset
   170
    ui.log('evoext-obsdiscovery', logmsg)
2409
2b563a725cdc obsdiscovery: add more debug output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2408
diff changeset
   171
    ui.debug(logmsg)
2085
6d61c5ed3bfa obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2084
diff changeset
   172
    return sorted(missing)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   173
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   174
def _queryrange(ui, repo, remote, allentries):
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   175
    #  question are asked with node
2146
4df68eb96adf stablerange: stop using '.node' in _queryrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2145
diff changeset
   176
    n = repo.changelog.node
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   177
    noderanges = [(n(entry[0]), entry[1]) for entry in allentries]
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   178
    replies = remote.evoext_obshashrange_v1(noderanges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   179
    result = []
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   180
    for idx, entry in enumerate(allentries):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   181
        result.append((entry, replies[idx]))
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   182
    return result
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   183
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   184
##############################
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   185
### Range Hash computation ###
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   186
##############################
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   187
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   188
@eh.command(
2229
575561934439 debug: rename 'debugstablerange' to 'debugobshashrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2228
diff changeset
   189
    'debugobshashrange',
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   190
    [
2230
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   191
        ('', 'rev', [], 'display obshash for all (rev, 0) range in REVS'),
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   192
        ('', 'subranges', False, 'display all subranges'),
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   193
    ],
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   194
    _(''))
2229
575561934439 debug: rename 'debugstablerange' to 'debugobshashrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2228
diff changeset
   195
def debugobshashrange(ui, repo, **opts):
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   196
    """display the ::REVS set topologically sorted in a stable way
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   197
    """
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   198
    s = node.short
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   199
    revs = scmutil.revrange(repo, opts['rev'])
2087
0c2371542687 depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2086
diff changeset
   200
    # prewarm depth cache
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   201
    if revs:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   202
        repo.stablerange.warmup(repo, max(revs))
2145
4c0c88e51018 stablerange: stop using '.node' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2144
diff changeset
   203
    cl = repo.changelog
2165
e97e9b0c9711 stablerange: use rangelength in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2164
diff changeset
   204
    rangelength = repo.stablerange.rangelength
2171
3be48332b802 stablerange: use depthrevs in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2166
diff changeset
   205
    depthrev = repo.stablerange.depthrev
2230
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   206
    if opts['subranges']:
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3247
diff changeset
   207
        ranges = stablerange.subrangesclosure(repo, repo.stablerange, revs)
2230
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   208
    else:
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   209
        ranges = [(r, 0) for r in revs]
2228
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   210
    headers = ('rev', 'node', 'index', 'size', 'depth', 'obshash')
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   211
    linetemplate = '%12d %12s %12d %12d %12d %12s\n'
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   212
    headertemplate = linetemplate.replace('d', 's')
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   213
    ui.status(headertemplate % headers)
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   214
    repo.obsstore.rangeobshashcache.update(repo)
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   215
    for r in ranges:
2150
0a95e8518941 stablerange: stop using '.head' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2146
diff changeset
   216
        d = (r[0],
2145
4c0c88e51018 stablerange: stop using '.node' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2144
diff changeset
   217
             s(cl.node(r[0])),
2157
e3b75a5d6b38 stablerange: stop using '.index' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2150
diff changeset
   218
             r[1],
2165
e97e9b0c9711 stablerange: use rangelength in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2164
diff changeset
   219
             rangelength(repo, r),
2171
3be48332b802 stablerange: use depthrevs in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2166
diff changeset
   220
             depthrev(repo, r[0]),
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   221
             node.short(_obshashrange(repo, r)))
2228
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   222
        ui.status(linetemplate % d)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   223
    repo.obsstore.rangeobshashcache.save(repo)
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   224
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   225
def _obshashrange(repo, rangeid):
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   226
    """return the obsolete hash associated to a range"""
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   227
    cache = repo.obsstore.rangeobshashcache
2143
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   228
    cl = repo.changelog
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   229
    obshash = cache.get(rangeid)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   230
    if obshash is not None:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   231
        return obshash
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   232
    pieces = []
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   233
    nullid = node.nullid
2166
d4ff8708eb66 stablerange: use rangelength in _obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2165
diff changeset
   234
    if repo.stablerange.rangelength(repo, rangeid) == 1:
2143
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   235
        rangenode = cl.node(rangeid[0])
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   236
        tmarkers = repo.obsstore.relevantmarkers([rangenode])
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   237
        pieces = []
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   238
        for m in tmarkers:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   239
            mbin = obsolete._fm1encodeonemarker(m)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   240
            pieces.append(mbin)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   241
        pieces.sort()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   242
    else:
2175
4162dbe7ff5c stablerange: use subranges from the main class in _obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2174
diff changeset
   243
        for subrange in repo.stablerange.subranges(repo, rangeid):
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   244
            obshash = _obshashrange(repo, subrange)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   245
            if obshash != nullid:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   246
                pieces.append(obshash)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   247
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   248
    sha = hashlib.sha1()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   249
    # note: if there is only one subrange with actual data, we'll just
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   250
    # reuse the same hash.
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   251
    if not pieces:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   252
        obshash = node.nullid
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   253
    elif len(pieces) != 1 or obshash is None:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   254
        sha = hashlib.sha1()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   255
        for p in pieces:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   256
            sha.update(p)
2195
bd3d35047181 obshash: properly cache obshash value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2175
diff changeset
   257
        obshash = sha.digest()
bd3d35047181 obshash: properly cache obshash value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2175
diff changeset
   258
    cache[rangeid] = obshash
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   259
    return obshash
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   260
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   261
### sqlite caching
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   262
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   263
_sqliteschema = [
4022
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   264
    """CREATE TABLE obshashrange(rev     INTEGER NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   265
                                 idx     INTEGER NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   266
                                 obshash BLOB    NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   267
                                 PRIMARY KEY(rev, idx));""",
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   268
    "CREATE INDEX range_index ON obshashrange(rev, idx);",
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   269
    """CREATE TABLE meta(schemaversion INTEGER NOT NULL,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   270
                         tiprev        INTEGER NOT NULL,
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   271
                         tipnode       BLOB    NOT NULL,
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   272
                         nbobsmarker   INTEGER NOT NULL,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   273
                         obssize       BLOB    NOT NULL,
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   274
                         obskey        BLOB    NOT NULL
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   275
                        );""",
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   276
]
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   277
_queryexist = "SELECT name FROM sqlite_master WHERE type='table' AND name='meta';"
2391
80d6a2ad7b11 obshashcache: purge the meta line before writing a new one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2390
diff changeset
   278
_clearmeta = """DELETE FROM meta;"""
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   279
_newmeta = """INSERT INTO meta (schemaversion, tiprev, tipnode, nbobsmarker, obssize, obskey)
2390
caddf846ca1e obshashrange: drop spurious whitespace
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2389
diff changeset
   280
            VALUES (?,?,?,?,?,?);"""
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   281
_updateobshash = "INSERT INTO obshashrange(rev, idx, obshash) VALUES (?,?,?);"
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   282
_querymeta = "SELECT schemaversion, tiprev, tipnode, nbobsmarker, obssize, obskey FROM meta;"
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   283
_queryobshash = "SELECT obshash FROM obshashrange WHERE (rev = ? AND idx = ?);"
3955
0174737af4fc obshashrange: do not search for affected ranges above the highest we have
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3954
diff changeset
   284
_query_max_stored = "SELECT MAX(rev) FROM obshashrange"
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   285
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   286
_reset = "DELETE FROM obshashrange;"
3355
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3354
diff changeset
   287
_delete = "DELETE FROM obshashrange WHERE (rev = ? AND idx = ?);"
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   288
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   289
def _affectedby(repo, markers):
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   290
    """return all nodes whose relevant set is affected by this changeset
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   291
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   292
    This is a reversed version of obsstore.relevantmarkers
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   293
    """
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   294
    affected_nodes = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   295
    known_markers = set(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   296
    node_to_proceed = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   297
    marker_to_proceed = set(known_markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   298
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   299
    obsstore = repo.obsstore
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   300
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   301
    while node_to_proceed or marker_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   302
        while marker_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   303
            m = marker_to_proceed.pop()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   304
            # check successors and parent
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   305
            if m[1]:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   306
                relevant = (m[1], )
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   307
            else: # prune case
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   308
                relevant = ((m[0], ), m[5])
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   309
            for l in relevant:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   310
                if l is None:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   311
                    continue
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   312
                for n in l:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   313
                    if n not in affected_nodes:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   314
                        node_to_proceed.add(n)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   315
                    affected_nodes.add(n)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   316
        # marker_to_proceed is now empty:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   317
        if node_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   318
            n = node_to_proceed.pop()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   319
            markers = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   320
            markers.update(obsstore.successors.get(n, ()))
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   321
            markers.update(obsstore.predecessors.get(n, ()))
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   322
            markers -= known_markers
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   323
            marker_to_proceed.update(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   324
            known_markers.update(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   325
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   326
    return affected_nodes
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   327
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   328
# if there is that many new obsmarkers, reset without analysing them
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   329
RESET_ABOVE = 10000
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   330
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   331
class _obshashcache(obscache.dualsourcecache):
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   332
4034
215235c734e7 obshashrange: force obshashrange invalidation by bumping schema
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4027
diff changeset
   333
    _schemaversion = 3
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   334
2376
12386f7f5056 dualsourcecache: add a cache name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2374
diff changeset
   335
    _cachename = 'evo-ext-obshashrange' # used for error message
4487
d972041022cb evolve: when using evolve, cache files belong into the master repo
Joerg Sonnenberger <joerg@bec.de>
parents: 4458
diff changeset
   336
    _filename = 'evoext_obshashrange_v2.sqlite'
2376
12386f7f5056 dualsourcecache: add a cache name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2374
diff changeset
   337
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   338
    def __init__(self, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   339
        super(_obshashcache, self).__init__()
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   340
        self._vfs = repo.vfs
4487
d972041022cb evolve: when using evolve, cache files belong into the master repo
Joerg Sonnenberger <joerg@bec.de>
parents: 4458
diff changeset
   341
        self._path = repo.cachevfs.join(self._filename)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   342
        self._new = set()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   343
        self._valid = True
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   344
        self._repo = weakref.ref(repo.unfiltered())
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   345
        # cache status
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   346
        self._ondiskcachekey = None
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   347
        self._data = {}
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   348
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   349
    def clear(self, reset=False):
2362
22c35d07ddb3 obshashrange: properly drop the current connection on clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2361
diff changeset
   350
        super(_obshashcache, self).clear(reset=reset)
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   351
        self._data.clear()
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   352
        self._new.clear()
2394
1b3a797c4586 obshashrange: cleanup 'valid' life cycle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2393
diff changeset
   353
        if reset:
1b3a797c4586 obshashrange: cleanup 'valid' life cycle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2393
diff changeset
   354
            self._valid = False
1b3a797c4586 obshashrange: cleanup 'valid' life cycle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2393
diff changeset
   355
        if '_con' in vars(self):
2362
22c35d07ddb3 obshashrange: properly drop the current connection on clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2361
diff changeset
   356
            del self._con
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   357
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   358
    def get(self, rangeid):
2393
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   359
        # revision should be covered by the tiprev
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   360
        #
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   361
        # XXX there are issue with cache warming, we hack around it for now
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   362
        if not getattr(self, '_updating', False):
2393
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   363
            if self._cachekey[0] < rangeid[0]:
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   364
                msg = ('using unwarmed obshashrangecache (%s %s)'
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   365
                       % (rangeid[0], self._cachekey[0]))
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   366
                raise error.ProgrammingError(msg)
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   367
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   368
        value = self._data.get(rangeid)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   369
        if value is None and self._con is not None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   370
            nrange = (rangeid[0], rangeid[1])
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   371
            try:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   372
                obshash = self._con.execute(_queryobshash, nrange).fetchone()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   373
                if obshash is not None:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   374
                    value = obshash[0]
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   375
                self._data[rangeid] = value
4027
130a60a51fff sqlcache: also catch malformed database error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4025
diff changeset
   376
            except (sqlite3.DatabaseError, sqlite3.OperationalError):
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   377
                # something is wrong with the sqlite db
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   378
                # Since this is a cache, we ignore it.
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   379
                if '_con' in vars(self):
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   380
                    del self._con
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   381
                self._new.clear()
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   382
        return value
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   383
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   384
    def __setitem__(self, rangeid, obshash):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   385
        self._new.add(rangeid)
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   386
        self._data[rangeid] = obshash
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   387
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   388
    def _updatefrom(self, repo, revs, obsmarkers):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   389
        """override this method to update your cache data incrementally
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   390
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   391
        revs:      list of new revision in the changelog
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   392
        obsmarker: list of new obsmarkers in the obsstore
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   393
        """
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   394
        # XXX for now, we'll not actually update the cache, but we'll be
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   395
        # smarter at invalidating it.
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   396
        #
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   397
        # 1) new revisions does not get their entry updated (not update)
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   398
        # 2) if we detect markers affecting non-new revision we reset the cache
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   399
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   400
        self._updating = True
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   401
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   402
        con = self._con
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   403
        if con is not None:
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   404
            reset = False
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   405
            affected = []
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   406
            if RESET_ABOVE < len(obsmarkers):
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   407
                # lots of new obsmarkers, probably smarter to reset the cache
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   408
                repo.ui.log('evoext-cache', 'obshashcache reset - '
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   409
                            'many new markers (%d)\n'
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   410
                            % len(obsmarkers))
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   411
                reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   412
            elif obsmarkers:
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   413
                max_stored = con.execute(_query_max_stored).fetchall()[0][0]
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   414
                affected_nodes = _affectedby(repo, obsmarkers)
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   415
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   416
                rev = repo.changelog.nodemap.get
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   417
                affected = [rev(n) for n in affected_nodes]
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   418
                affected = [r for r in affected
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   419
                            if r is not None and r <= max_stored]
2412
8df32538f662 obshashrangecache: precisely track affected revs when adding new markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2409
diff changeset
   420
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   421
            if RESET_ABOVE < len(affected):
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   422
                repo.ui.log('evoext-cache', 'obshashcache reset - '
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   423
                            'new markers affect many changeset (%d)\n'
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   424
                            % len(affected))
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   425
                reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   426
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   427
            if affected or reset:
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   428
                if not reset:
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   429
                    repo.ui.log('evoext-cache', 'obshashcache clean - '
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   430
                                'new markers affect %d changeset and cached ranges\n'
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   431
                                % len(affected))
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   432
                if con is not None:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   433
                    # always reset for now, the code detecting affect is buggy
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   434
                    # so we need to reset more broadly than we would like.
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   435
                    try:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   436
                        if repo.stablerange._con is None:
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   437
                            repo.ui.log('evoext-cache', 'obshashcache reset - '
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   438
                                        'underlying stablerange cache unavailable\n')
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   439
                            reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   440
                        if reset:
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   441
                            con.execute(_reset)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   442
                            self._data.clear()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   443
                        else:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   444
                            ranges = repo.stablerange.contains(repo, affected)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   445
                            con.executemany(_delete, ranges)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   446
                            for r in ranges:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   447
                                self._data.pop(r, None)
4027
130a60a51fff sqlcache: also catch malformed database error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4025
diff changeset
   448
                    except (sqlite3.DatabaseError, sqlite3.OperationalError) as exc:
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   449
                        repo.ui.log('evoext-cache', 'error while updating obshashrange cache: %s' % exc)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   450
                        del self._updating
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   451
                        return
3955
0174737af4fc obshashrange: do not search for affected ranges above the highest we have
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3954
diff changeset
   452
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   453
                # rewarm key revisions
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   454
                #
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   455
                # (The current invalidation is too wide, but rewarming every
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   456
                # single revision is quite costly)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   457
                newrevs = []
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   458
                stop = self._cachekey[0] # tiprev
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   459
                for h in repo.filtered('immutable').changelog.headrevs():
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   460
                    if h <= stop and h in affected:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   461
                        newrevs.append(h)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   462
                newrevs.extend(revs)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   463
                revs = newrevs
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   464
3247
d8e6c5338053 deptcache: make sure we warm the dept cache before warming the obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3171
diff changeset
   465
        repo.depthcache.update(repo)
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   466
        total = len(revs)
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   467
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   468
        def progress(pos, rev):
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   469
            compat.progress(repo.ui, 'updating obshashrange cache',
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   470
                            pos, 'rev %s' % rev, unit='revision', total=total)
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   471
        # warm the cache for the new revs
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   472
        progress(0, '')
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   473
        for idx, r in enumerate(revs):
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   474
            _obshashrange(repo, (r, 0))
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   475
            progress(idx, r)
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   476
        progress(None, '')
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   477
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   478
        del self._updating
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   479
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   480
    @property
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   481
    def _fullcachekey(self):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   482
        return (self._schemaversion, ) + self._cachekey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   483
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   484
    def load(self, repo):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   485
        if self._con is None:
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   486
            self._cachekey = self.emptykey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   487
            self._ondiskcachekey = self.emptykey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   488
        assert self._cachekey is not None
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   489
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   490
    def _db(self):
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   491
        try:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   492
            util.makedirs(self._vfs.dirname(self._path))
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   493
        except OSError:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   494
            return None
4017
c307ce1d9009 sqlcache: passe better connection option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   495
        con = sqlite3.connect(self._path, timeout=30, isolation_level="IMMEDIATE")
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   496
        con.text_factory = str
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   497
        return con
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   498
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   499
    @util.propertycache
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   500
    def _con(self):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   501
        if not self._valid:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   502
            return None
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   503
        repo = self._repo()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   504
        if repo is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   505
            return None
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   506
        con = self._db()
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   507
        if con is None:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   508
            return None
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   509
        cur = con.execute(_queryexist)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   510
        if cur.fetchone() is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   511
            self._valid = False
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   512
            return None
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   513
        meta = con.execute(_querymeta).fetchone()
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   514
        if meta is None or meta[0] != self._schemaversion:
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   515
            self._valid = False
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   516
            return None
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   517
        self._cachekey = self._ondiskcachekey = meta[1:]
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   518
        return con
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   519
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   520
    def save(self, repo):
2361
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   521
        if self._cachekey is None:
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   522
            return
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   523
        if self._cachekey == self._ondiskcachekey and not self._new:
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   524
            return
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   525
        repo = repo.unfiltered()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   526
        try:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   527
            with repo.lock():
3963
d2e9a03fb3f7 obshashrange: always save stable range cache alongside the obshashrange one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3962
diff changeset
   528
                if 'stablerange' in vars(repo):
d2e9a03fb3f7 obshashrange: always save stable range cache alongside the obshashrange one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3962
diff changeset
   529
                    repo.stablerange.save(repo)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   530
                self._save(repo)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   531
        except error.LockError:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   532
            # Exceptionnally we are noisy about it since performance impact
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   533
            # is large We should address that before using this more
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   534
            # widely.
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   535
            msg = _('obshashrange cache: skipping save unable to lock repo\n')
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   536
            repo.ui.warn(msg)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   537
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   538
    def _save(self, repo):
4023
f59b262400fb sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4022
diff changeset
   539
        if not self._new:
f59b262400fb sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4022
diff changeset
   540
            return
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   541
        try:
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   542
            return self._trysave(repo)
4106
dc50050dbf80 obshashrangecache: be more paranoid in the errors we catch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4096
diff changeset
   543
        except (IOError, OSError, sqlite3.DatabaseError, sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
4019
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   544
            # Catch error that may arise under stress
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   545
            #
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   546
            # operational error catch read-only and locked database
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   547
            # IntegrityError catch Unique constraint error that may arise
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   548
            if '_con' in vars(self):
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   549
                del self._con
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   550
            self._new.clear()
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   551
            repo.ui.log('evoext-cache', 'error while saving new data: %s' % exc)
4109
d562316c548f caches: issue both debug and blackbox log message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4106
diff changeset
   552
            repo.ui.debug('evoext-cache: error while saving new data: %s' % exc)
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   553
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   554
    def _trysave(self, repo):
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   555
        if self._con is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   556
            util.unlinkpath(self._path, ignoremissing=True)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   557
            if '_con' in vars(self):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   558
                del self._con
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   559
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   560
            con = self._db()
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   561
            if con is None:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   562
                repo.ui.log('evoext-cache', 'unable to write obshashrange cache'
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   563
                            ' - cannot create database')
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   564
                return
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   565
            with con:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   566
                for req in _sqliteschema:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   567
                    con.execute(req)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   568
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   569
                meta = [self._schemaversion] + list(self.emptykey)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   570
                con.execute(_newmeta, meta)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   571
                self._ondiskcachekey = self.emptykey
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   572
        else:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   573
            con = self._con
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   574
        with con:
4021
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   575
            meta = con.execute(_querymeta).fetchone()
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   576
            if meta[1:] != self._ondiskcachekey:
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   577
                # drifting is currently an issue because this means another
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   578
                # process might have already added the cache line we are about
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   579
                # to add. This will confuse sqlite
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   580
                msg = _('obshashrange cache: skipping write, '
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   581
                        'database drifted under my feet\n')
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   582
                repo.ui.warn(msg)
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   583
                self._new.clear()
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   584
                self._valid = False
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   585
                if '_con' in vars(self):
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   586
                    del self._con
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   587
                self._valid = False
4021
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   588
                return
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   589
            data = ((rangeid[0], rangeid[1], self.get(rangeid)) for rangeid in self._new)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   590
            con.executemany(_updateobshash, data)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   591
            cachekey = self._fullcachekey
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   592
            con.execute(_clearmeta) # remove the older entry
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   593
            con.execute(_newmeta, cachekey)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   594
            self._new.clear()
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   595
            self._valid = True
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   596
            self._ondiskcachekey = self._cachekey
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   597
@eh.wrapfunction(obsolete.obsstore, '_addmarkers')
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   598
def _addmarkers(orig, obsstore, *args, **kwargs):
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   599
    obsstore.rangeobshashcache.clear()
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   600
    return orig(obsstore, *args, **kwargs)
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   601
3144
6f10c94a2114 compat: stop working around 3.8 file cache limitation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   602
obsstorefilecache = localrepo.localrepository.obsstore
2244
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   603
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   604
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   605
# obsstore is a filecache so we have do to some spacial dancing
2244
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   606
@eh.wrapfunction(obsstorefilecache, 'func')
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   607
def obsstorewithcache(orig, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   608
    obsstore = orig(repo)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   609
    obsstore.rangeobshashcache = _obshashcache(repo.unfiltered())
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   610
    return obsstore
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   611
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   612
@eh.reposetup
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   613
def setupcache(ui, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   614
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   615
    class obshashrepo(repo.__class__):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   616
        @localrepo.unfilteredmethod
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   617
        def destroyed(self):
2363
2ceb122fcc33 obshashrange: properly invalidate the cache on destroyed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2362
diff changeset
   618
            if 'obsstore' in vars(self):
2ceb122fcc33 obshashrange: properly invalidate the cache on destroyed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2362
diff changeset
   619
                self.obsstore.rangeobshashcache.clear()
4156
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   620
            toplevel = not util.safehasattr(self, '_destroying')
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   621
            if toplevel:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   622
                self._destroying = True
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   623
            try:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   624
                super(obshashrepo, self).destroyed()
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   625
            finally:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   626
                if toplevel:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   627
                    del self._destroying
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   628
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   629
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   630
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   631
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   632
                self.obsstore.rangeobshashcache.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   633
                self.obsstore.rangeobshashcache.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   634
            super(obshashrepo, self).updatecaches(tr, **kwargs)
2364
9b68e65fad4f obshashrange: "update" the cache on each transaction close
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2363
diff changeset
   635
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   636
    repo.__class__ = obshashrepo
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   637
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   638
### wire protocol commands
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   639
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   640
def _obshashrange_v0(repo, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   641
    """return a list of hash from a list of range
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   642
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   643
    The range have the id encoded as a node
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   644
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   645
    return 'wdirid' for unknown range"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   646
    nm = repo.changelog.nodemap
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   647
    ranges = [(nm.get(n), idx) for n, idx in ranges]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   648
    if ranges:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   649
        maxrev = max(r for r, i in ranges)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   650
        if maxrev is not None:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   651
            repo.stablerange.warmup(repo, upto=maxrev)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   652
    result = []
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   653
    repo.obsstore.rangeobshashcache.update(repo)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   654
    for r in ranges:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   655
        if r[0] is None:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   656
            result.append(node.wdirid)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   657
        else:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   658
            result.append(_obshashrange(repo, r))
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   659
    repo.obsstore.rangeobshashcache.save(repo)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   660
    return result
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   661
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   662
@eh.addattr(localrepo.localpeer, 'evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   663
def local_obshashrange_v0(peer, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   664
    return _obshashrange_v0(peer._repo, ranges)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   665
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   666
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   667
_indexformat = '>I'
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   668
_indexsize = _calcsize(_indexformat)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   669
def _encrange(node_rangeid):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   670
    """encode a (node) range"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   671
    headnode, index = node_rangeid
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   672
    return headnode + _pack(_indexformat, index)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   673
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   674
def _decrange(data):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   675
    """encode a (node) range"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   676
    assert _indexsize < len(data), len(data)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   677
    headnode = data[:-_indexsize]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   678
    index = _unpack(_indexformat, data[-_indexsize:])[0]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   679
    return (headnode, index)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   680
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   681
@eh.addattr(wirepeer, 'evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   682
def peer_obshashrange_v0(self, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   683
    binranges = [_encrange(r) for r in ranges]
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   684
    encranges = encodelist(binranges)
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   685
    d = self._call("evoext_obshashrange_v1", ranges=encranges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   686
    try:
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   687
        return decodelist(d)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   688
    except ValueError:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   689
        self._abort(error.ResponseError(_("unexpected response:"), d))
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   690
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3521
diff changeset
   691
@compat.wireprotocommand(eh, 'evoext_obshashrange_v1', 'ranges')
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   692
def srv_obshashrange_v1(repo, proto, ranges):
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   693
    ranges = decodelist(ranges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   694
    ranges = [_decrange(r) for r in ranges]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   695
    hashes = _obshashrange_v0(repo, ranges)
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   696
    return encodelist(hashes)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   697
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   698
def _useobshashrange(repo):
4324
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
   699
    base = repo.ui.configbool('experimental', 'obshashrange')
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   700
    if base:
4324
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
   701
        maxrevs = repo.ui.configint('experimental', 'obshashrange.max-revs')
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   702
        if maxrevs is not None and maxrevs < len(repo.unfiltered()):
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   703
            base = False
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   704
    return base
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   705
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   706
def _canobshashrange(local, remote):
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   707
    return (_useobshashrange(local)
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   708
            and remote.capable('_evoext_obshashrange_v1'))
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   709
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   710
def _obshashrange_capabilities(orig, repo, proto):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   711
    """wrapper to advertise new capability"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   712
    caps = orig(repo, proto)
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   713
    enabled = _useobshashrange(repo)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   714
    if obsolete.isenabled(repo, obsolete.exchangeopt) and enabled:
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   715
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   716
        # Compat hg 4.6+ (2f7290555c96)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   717
        bytesresponse = False
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   718
        if util.safehasattr(caps, 'data'):
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   719
            bytesresponse = True
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   720
            caps = caps.data
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   721
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   722
        caps = caps.split()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   723
        caps.append(b'_evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   724
        caps.sort()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   725
        caps = b' '.join(caps)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   726
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   727
        # Compat hg 4.6+ (2f7290555c96)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   728
        if bytesresponse:
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   729
            caps = wireprototypes.bytesresponse(caps)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   730
    return caps
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   731
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   732
@eh.extsetup
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   733
def obshashrange_extsetup(ui):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   734
    ###
3681
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   735
    extensions.wrapfunction(wireprotov1server, 'capabilities',
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   736
                            _obshashrange_capabilities)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   737
    # wrap command content
3681
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   738
    oldcap, args = wireprotov1server.commands['capabilities']
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   739
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   740
    def newcap(repo, proto):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   741
        return _obshashrange_capabilities(oldcap, repo, proto)
3681
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   742
    wireprotov1server.commands['capabilities'] = (newcap, args)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   743
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   744
#############################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   745
### Tree Hash computation ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   746
#############################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   747
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   748
# Dash computed from a given changesets using all markers relevant to it and
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   749
# the obshash of its parents.  This is similar to what happend for changeset
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   750
# node where the parent is used in the computation
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   751
@eh.command(
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   752
    'debugobsrelsethashtree',
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   753
    [('', 'v0', None, 'hash on marker format "0"'),
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   754
     ('', 'v1', None, 'hash on marker format "1" (default)')], _(''))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   755
def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   756
    """display Obsolete markers, Relevant Set, Hash Tree
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   757
    changeset-node obsrelsethashtree-node
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   758
4643
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   759
    It computed form the "obs-hash-tree" value of its parent and markers
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   760
    relevant to the changeset itself.
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   761
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   762
    The obs-hash-tree is no longer used for any user facing logic. However the
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   763
    debug command stayed as an inspection tool. It does not seem supseful to
77f3699e711e obsdiscovery: drop `obshash` discovery protocol (issue6136)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4487
diff changeset
   764
    upstream the command with the rest of evolve. We can safely drop it."""
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   765
    if v0 and v1:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   766
        raise error.Abort('cannot only specify one format')
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   767
    elif v0:
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   768
        treefunc = _obsrelsethashtreefm0
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   769
    else:
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   770
        treefunc = _obsrelsethashtreefm1
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   771
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   772
    for chg, obs in treefunc(repo):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   773
        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   774
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   775
def _obsrelsethashtreefm0(repo):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   776
    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   777
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   778
def _obsrelsethashtreefm1(repo):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   779
    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   780
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   781
def _obsrelsethashtree(repo, encodeonemarker):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   782
    cache = []
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   783
    unfi = repo.unfiltered()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   784
    markercache = {}
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   785
    compat.progress(repo.ui, _("preparing locally"), 0, total=len(unfi),
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   786
                    unit=_("changesets"))
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   787
    for i in unfi:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   788
        ctx = unfi[i]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   789
        entry = 0
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   790
        sha = hashlib.sha1()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   791
        # add data from p1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   792
        for p in ctx.parents():
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   793
            p = p.rev()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   794
            if p < 0:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   795
                p = node.nullid
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   796
            else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   797
                p = cache[p][1]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   798
            if p != node.nullid:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   799
                entry += 1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   800
                sha.update(p)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   801
        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   802
        if tmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   803
            bmarkers = []
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   804
            for m in tmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   805
                if m not in markercache:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   806
                    markercache[m] = encodeonemarker(m)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   807
                bmarkers.append(markercache[m])
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   808
            bmarkers.sort()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   809
            for m in bmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   810
                entry += 1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   811
                sha.update(m)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   812
        if entry:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   813
            cache.append((ctx.node(), sha.digest()))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   814
        else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   815
            cache.append((ctx.node(), node.nullid))
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   816
        compat.progress(repo.ui, _("preparing locally"), i, total=len(unfi),
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   817
                        unit=_("changesets"))
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4324
diff changeset
   818
    compat.progress(repo.ui, _("preparing locally"), None)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   819
    return cache
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   820
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   821
##########################################
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   822
###  trigger discovery during exchange ###
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   823
##########################################
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   824
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   825
def _dopushmarkers(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   826
    return (# we have any markers to push
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   827
            pushop.repo.obsstore
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   828
            # exchange of obsmarkers is enabled locally
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   829
            and obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   830
            # remote server accept markers
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   831
            and 'obsolete' in pushop.remote.listkeys('namespaces'))
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   832
2512
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   833
def _pushobshashrange(pushop, commonrevs):
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   834
    repo = pushop.repo.unfiltered()
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   835
    remote = pushop.remote
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   836
    missing = findmissingrange(pushop.ui, repo, remote, commonrevs)
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   837
    missing += pushop.outgoing.missing
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   838
    return missing
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   839
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   840
# available discovery method, first valid is used
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   841
# tuple (canuse, perform discovery))
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   842
obsdiscoveries = [
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   843
    (_canobshashrange, _pushobshashrange),
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   844
]
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   845
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   846
obsdiscovery_skip_message = """\
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   847
(skipping discovery of obsolescence markers, will exchange everything)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   848
(controled by 'experimental.evolution.obsdiscovery' configuration)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   849
"""
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   850
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   851
def usediscovery(repo):
4324
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4156
diff changeset
   852
    return repo.ui.configbool('experimental', 'evolution.obsdiscovery')
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   853
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   854
@eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   855
def _pushdiscoveryobsmarkers(orig, pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   856
    if _dopushmarkers(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   857
        repo = pushop.repo
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   858
        remote = pushop.remote
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   859
        obsexcmsg(repo.ui, "computing relevant nodes\n")
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   860
        revs = list(repo.revs('::%ln', pushop.futureheads))
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   861
        unfi = repo.unfiltered()
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   862
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   863
        if not usediscovery(repo):
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   864
            # discovery disabled by user
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   865
            repo.ui.status(obsdiscovery_skip_message)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   866
            return orig(pushop)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   867
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   868
        # look for an obs-discovery protocol we can use
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   869
        discovery = None
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   870
        for candidate in obsdiscoveries:
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   871
            if candidate[0](repo, remote):
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   872
                discovery = candidate[1]
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   873
                break
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   874
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   875
        if discovery is None:
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   876
            # no discovery available, rely on core to push all relevants
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   877
            # obs markers.
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   878
            return orig(pushop)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   879
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   880
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   881
                           % len(revs))
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   882
        commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   883
        # find the nodes where the relevant obsmarkers mismatches
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   884
        nodes = discovery(pushop, commonrevs)
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   885
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   886
        if nodes:
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   887
            obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   888
                               % len(nodes))
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   889
            pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   890
        else:
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   891
            obsexcmsg(repo.ui, "markers already in sync\n")
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   892
            pushop.outobsmarkers = []
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   893
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   894
@eh.extsetup
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   895
def _installobsmarkersdiscovery(ui):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   896
    olddisco = exchange.pushdiscoverymapping['obsmarker']
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   897
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   898
    def newdisco(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   899
        _pushdiscoveryobsmarkers(olddisco, pushop)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   900
    exchange.pushdiscoverymapping['obsmarker'] = newdisco
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   901
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   902
def buildpullobsmarkersboundaries(pullop, bundle2=True):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   903
    """small function returning the argument for pull markers call
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   904
    may to contains 'heads' and 'common'. skip the key for None.
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   905
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   906
    It is a separed function to play around with strategy for that."""
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   907
    repo = pullop.repo
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   908
    remote = pullop.remote
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   909
    unfi = repo.unfiltered()
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   910
    revs = unfi.revs('::(%ln - null)', pullop.common)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   911
    boundaries = {'heads': pullop.pulledsubset}
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   912
    if not revs: # nothing common
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   913
        boundaries['common'] = [node.nullid]
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   914
        return boundaries
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   915
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   916
    if not usediscovery(repo):
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   917
        # discovery disabled by users.
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   918
        repo.ui.status(obsdiscovery_skip_message)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   919
        boundaries['common'] = [node.nullid]
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   920
        return boundaries
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   921
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   922
    if bundle2 and _canobshashrange(repo, remote):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   923
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   924
                  % len(revs))
4349
01f4ee6779d5 obsdiscovery: use consistent filtering during discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4341
diff changeset
   925
        boundaries['missing'] = findmissingrange(repo.ui, unfi, pullop.remote,
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   926
                                                 revs)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   927
    else:
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   928
        boundaries['common'] = [node.nullid]
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   929
    return boundaries
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   930
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   931
# merge later for outer layer wrapping
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   932
eh.merge(stablerangecache.eh)