hgext3rd/evolve/stablerangecache.py
author Joerg Sonnenberger <joerg@bec.de>
Fri, 01 May 2020 21:05:37 +0200
changeset 5313 fbe07b1cf5d4
parent 5276 8431bb224862
child 5322 498dc888ff40
permissions -rw-r--r--
py3: fix debugstablerangecache
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3403
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     1
# Code dedicated to the caching of "stable ranges"
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     2
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     3
# These stable ranges are use for obsolescence markers discovery
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     4
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     6
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     7
# This software may be used and distributed according to the terms of the
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     8
# GNU General Public License version 2 or any later version.
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     9
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
    10
import abc
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    11
import heapq
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
    12
import random
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    13
import sqlite3
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    14
import time
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    15
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
from mercurial import (
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    17
    commands,
4735
168c270e8347 py3: sqlite3.connect() expects str arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 4487
diff changeset
    18
    encoding,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    19
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
    localrepo,
4020
47b00d3b8ea2 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
    21
    node as nodemod,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    22
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
5176
b9af7b8f3eee compat: drop import compatibility <= 4.5 for `forcebytestr`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5137
diff changeset
    25
from mercurial.utils.stringutil import forcebytestr
5137
4fef6b157175 py3-exceptions: wrap more Exceptions in forcebytestr before formatting
willstott101@gmail.com
parents: 4837
diff changeset
    26
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    27
from . import (
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4137
diff changeset
    28
    compat,
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    29
    exthelper,
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    30
    genericcaches,
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    31
    stablerange,
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
    32
    utility,
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    33
)
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    34
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    35
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    36
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
eh = exthelper.exthelper()
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    38
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    39
LONG_WARNING_TIME = 60
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    40
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    41
LONG_MESSAGE = b"""Stable range cache is taking a while to load
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    42
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    43
Your repository is probably big.
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    44
5264
8e290f172423 evolve: fixed some typos in stablerangecache LONG_MESSAGE, fix #6279
Yohann Rebattu <yohann@rebattu.fr>
parents: 5137
diff changeset
    45
Stable ranges are used for discovery missing obsolescence markers during
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    46
exchange. While the algorithm we use can scale well for large repositories, the
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    47
naive python implementation that you are using is not very efficient, the
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    48
storage backend for that cache neither.
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    49
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    50
This computation will finish in a finite amount of time, even for repositories
5265
151731be7166 evolve: fixed some typos in stablerangecache LONG_MESSAGE (issue6279)
Yohann Rebattu <yohann@rebattu.fr>
parents: 5264
diff changeset
    51
with millions of revisions and many merges. However it might take multiple tens
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    52
of minutes to complete in such case.
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    53
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    54
In the future, better implementation of the algorithm in a more appropriate
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    55
language than Python will make it much faster. This data should also get
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    56
exchanged between server and clients removing recomputation needs.
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    57
5264
8e290f172423 evolve: fixed some typos in stablerangecache LONG_MESSAGE, fix #6279
Yohann Rebattu <yohann@rebattu.fr>
parents: 5137
diff changeset
    58
In the meantime, go take a break while this cache is warming.
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    59
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    60
See `hg help -e evolve` for details about how to control obsmarkers discovery and
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    61
the update of related cache.
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    62
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    63
--- Sorry for the delay ---
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    64
"""
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    65
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    66
class stablerangeondiskbase(stablerange.stablerangecached,
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    67
                            genericcaches.changelogsourcebase):
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    68
    """combine the generic stablerange cache usage with generic changelog one
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    69
    """
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    70
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    71
    def _updatefrom(self, repo, data):
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    72
        """compute the rev of one revision, assert previous revision has an hot cache
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    73
        """
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    74
        repo = repo.unfiltered()
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    75
        ui = repo.ui
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    76
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    77
        rangeheap = []
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    78
        for r in data:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    79
            rangeheap.append((r, 0))
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    80
        total = len(data)
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    81
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    82
        heappop = heapq.heappop
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    83
        heappush = heapq.heappush
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    84
        heapify = heapq.heapify
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    85
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    86
        original = set(rangeheap)
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    87
        seen = 0
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    88
        # progress report is showing up in the profile for small and fast
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    89
        # repository so we only update it every so often
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    90
        progress_each = 100
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    91
        initial_time = progress_last = time.time()
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
    92
        warned_long = False
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    93
        heapify(rangeheap)
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    94
        while rangeheap:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    95
            rangeid = heappop(rangeheap)
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    96
            if rangeid in original:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    97
                if not seen % progress_each:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    98
                    # if a lot of time passed, report more often
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    99
                    progress_new = time.time()
4055
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
   100
                    if not warned_long and LONG_WARNING_TIME < (progress_new - initial_time):
555028f992eb obshashrange: issue a warning if the cache takes a long time to load
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4029
diff changeset
   101
                        repo.ui.warn(LONG_MESSAGE)
4089
ecd90548a10d stablerange: only issue the message once
Gerald Squelart <gsquelart@mozilla.com>
parents: 4055
diff changeset
   102
                        warned_long = True
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   103
                    if (1 < progress_each) and (0.1 < progress_new - progress_last):
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   104
                        progress_each /= 10
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   105
                    compat.progress(ui, _(b"filling stablerange cache"), seen,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   106
                                    total=total, unit=_(b"changesets"))
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   107
                    progress_last = progress_new
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   108
                seen += 1
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   109
                original.remove(rangeid) # might have been added from other source
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   110
            rangeid = rangeid
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   111
            if self._getsub(rangeid) is None:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   112
                for sub in self.subranges(repo, rangeid):
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   113
                    if self._getsub(sub) is None:
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   114
                        heappush(rangeheap, sub)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   115
        compat.progress(ui, _(b"filling stablerange cache"), None, total=total)
3342
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   116
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   117
    def clear(self, reset=False):
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   118
        super(stablerangeondiskbase, self).clear()
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   119
        self._subrangescache.clear()
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
   120
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   121
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   122
### simple sqlite caching ###
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   123
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   124
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   125
_sqliteschema = [
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   126
    r"""CREATE TABLE range(rev INTEGER  NOT NULL,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   127
                          idx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   128
                          PRIMARY KEY(rev, idx));""",
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   129
    r"""CREATE TABLE subranges(listidx INTEGER NOT NULL,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   130
                              suprev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   131
                              supidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   132
                              subrev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   133
                              subidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   134
                              PRIMARY KEY(listidx, suprev, supidx),
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   135
                              FOREIGN KEY (suprev, supidx) REFERENCES range(rev, idx),
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   136
                              FOREIGN KEY (subrev, subidx) REFERENCES range(rev, idx)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   137
    );""",
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   138
    r"CREATE INDEX subranges_index ON subranges (suprev, supidx);",
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   139
    r"CREATE INDEX superranges_index ON subranges (subrev, subidx);",
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   140
    r"CREATE INDEX range_index ON range (rev, idx);",
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   141
    r"""CREATE TABLE meta(schemaversion INTEGER NOT NULL,
4022
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4020
diff changeset
   142
                         tiprev        INTEGER NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4020
diff changeset
   143
                         tipnode       BLOB    NOT NULL
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4020
diff changeset
   144
                        );""",
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   145
]
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   146
_newmeta = r"INSERT INTO meta (schemaversion, tiprev, tipnode) VALUES (?,?,?);"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   147
_updatemeta = r"UPDATE meta SET tiprev = ?, tipnode = ?;"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   148
_updaterange = r"INSERT INTO range(rev, idx) VALUES (?,?);"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   149
_updatesubranges = r"""INSERT
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   150
                       INTO subranges(listidx, suprev, supidx, subrev, subidx)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   151
                       VALUES (?,?,?,?,?);"""
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   152
_queryexist = r"SELECT name FROM sqlite_master WHERE type='table' AND name='meta';"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   153
_querymeta = r"SELECT schemaversion, tiprev, tipnode FROM meta;"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   154
_queryrange = r"SELECT * FROM range WHERE (rev = ? AND idx = ?);"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   155
_querysubranges = r"""SELECT subrev, subidx
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   156
                     FROM subranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   157
                     WHERE (suprev = ? AND supidx = ?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   158
                     ORDER BY listidx;"""
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   159
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   160
_querysuperrangesmain = r"""SELECT DISTINCT suprev, supidx
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   161
                           FROM subranges
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   162
                           WHERE %s;"""
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   163
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   164
_querysuperrangesbody = r'(subrev = %d and subidx = %d)'
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   165
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   166
def _make_querysuperranges(ranges):
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   167
    # building a tree of OR would allow for more ranges
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4750
diff changeset
   168
    body = r' OR '.join(_querysuperrangesbody % r for r in ranges)
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   169
    return _querysuperrangesmain % body
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   170
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   171
class stablerangesqlbase(stablerange.stablerangecached):
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   172
    """class that can handle all the bits needed to store range into sql
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   173
    """
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   174
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   175
    __metaclass__ = abc.ABCMeta
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   176
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   177
    _schemaversion = None
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   178
    _cachefile = None
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   179
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   180
    def __init__(self, repo, **kwargs):
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   181
        super(stablerangesqlbase, self).__init__(**kwargs)
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   182
        self._vfs = repo.vfs
4487
d972041022cb evolve: when using evolve, cache files belong into the master repo
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   183
        self._path = repo.cachevfs.join(self._cachefile)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   184
        self._cl = repo.unfiltered().changelog # (okay to keep an old one)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   185
        self._ondisktiprev = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   186
        self._ondisktipnode = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   187
        self._unsavedsubranges = {}
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   188
3355
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   189
    def contains(self, repo, revs):
3954
b53bf9942e0a obshashrange: do not search for affected stable range cache is unavailable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3953
diff changeset
   190
        con = self._con
b53bf9942e0a obshashrange: do not search for affected stable range cache is unavailable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3953
diff changeset
   191
        assert con is not None
3355
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   192
        new = set()
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   193
        known = set()
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   194
        depth = repo.depthcache.get
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   195
        for r in revs:
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   196
            new.add((r, depth(r) - 1))
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   197
            new.add((r, 0))
3954
b53bf9942e0a obshashrange: do not search for affected stable range cache is unavailable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3953
diff changeset
   198
        while new:
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   199
            if len(new) < 300:
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   200
                sample = new
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   201
            else:
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   202
                sample = random.sample(new, 300)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   203
            known.update(sample)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   204
            query = _make_querysuperranges(sample)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   205
            ranges = set(con.execute(query).fetchall())
3355
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   206
            new.update(ranges)
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   207
            new -= known
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   208
        return sorted(known)
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   209
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   210
    def _getsub(self, rangeid):
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   211
        # 1) check the in memory cache
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   212
        # 2) check the sqlcaches (and warm in memory cache we want we find)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   213
        cache = self._subrangescache
4750
d9d55e34943c py3: avoid comparing int and None
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   214
        if (rangeid not in cache
d9d55e34943c py3: avoid comparing int and None
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   215
            and self._ondisktiprev is not None
d9d55e34943c py3: avoid comparing int and None
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   216
            and rangeid[0] <= self._ondisktiprev
d9d55e34943c py3: avoid comparing int and None
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   217
            and self._con is not None):
d9d55e34943c py3: avoid comparing int and None
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   218
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   219
            value = None
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   220
            try:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   221
                result = self._con.execute(_queryrange, rangeid).fetchone()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   222
                if result is not None: # database know about this node (skip in the future?)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   223
                    value = self._con.execute(_querysubranges, rangeid).fetchall()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   224
                # in memory caching of the value
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   225
                cache[rangeid] = value
4027
130a60a51fff sqlcache: also catch malformed database error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4026
diff changeset
   226
            except (sqlite3.DatabaseError, sqlite3.OperationalError):
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   227
                # 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
   228
                # Since this is a cache, we ignore it.
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   229
                if r'_con' in vars(self):
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   230
                    del self._con
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   231
                self._unsavedsubranges.clear()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   232
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   233
        return cache.get(rangeid)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   234
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   235
    def _setsub(self, rangeid, value):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   236
        assert rangeid not in self._unsavedsubranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   237
        self._unsavedsubranges[rangeid] = value
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   238
        super(stablerangesqlbase, self)._setsub(rangeid, value)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   239
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   240
    def _db(self):
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   241
        try:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   242
            util.makedirs(self._vfs.dirname(self._path))
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   243
        except OSError:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   244
            return None
4735
168c270e8347 py3: sqlite3.connect() expects str arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 4487
diff changeset
   245
        con = sqlite3.connect(encoding.strfromlocal(self._path), timeout=30,
4811
e1dc374909bd python3: add raw prefix to sqlite isolation level
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   246
                              isolation_level=r"IMMEDIATE")
4736
9e0d35d2f7d4 py3: read sqlite3 data as bytes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4735
diff changeset
   247
        con.text_factory = bytes
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   248
        return con
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   249
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   250
    @util.propertycache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   251
    def _con(self):
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   252
        con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   253
        if con is None:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   254
            return None
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   255
        cur = con.execute(_queryexist)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   256
        if cur.fetchone() is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   257
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   258
        meta = con.execute(_querymeta).fetchone()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   259
        if meta is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   260
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   261
        if meta[0] != self._schemaversion:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   262
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   263
        if len(self._cl) <= meta[1]:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   264
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   265
        if self._cl.node(meta[1]) != meta[2]:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   266
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   267
        self._ondisktiprev = meta[1]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   268
        self._ondisktipnode = meta[2]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   269
        if self._tiprev < self._ondisktiprev:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   270
            self._tiprev = self._ondisktiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   271
            self._tipnode = self._ondisktipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   272
        return con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   273
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   274
    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
   275
        if not self._unsavedsubranges:
f59b262400fb sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4022
diff changeset
   276
            return
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   277
        try:
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   278
            return self._trysave(repo)
4105
dda7746647f2 stablerangecache: be more paranoid in the errors we catch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4089
diff changeset
   279
        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
   280
            # 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
   281
            #
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   282
            # 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
   283
            # IntegrityError catch Unique constraint error that may arise
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   284
            if r'_con' in vars(self):
4019
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   285
                del self._con
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   286
            self._unsavedsubranges.clear()
5137
4fef6b157175 py3-exceptions: wrap more Exceptions in forcebytestr before formatting
willstott101@gmail.com
parents: 4837
diff changeset
   287
            repo.ui.log(b'evoext-cache', b'error while saving new data: %s' % forcebytestr(exc))
4fef6b157175 py3-exceptions: wrap more Exceptions in forcebytestr before formatting
willstott101@gmail.com
parents: 4837
diff changeset
   288
            repo.ui.debug(b'evoext-cache: error while saving new data: %s' % forcebytestr(exc))
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   289
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   290
    def _trysave(self, repo):
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   291
        repo = repo.unfiltered()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   292
        repo.depthcache.save(repo)
3966
ea7687a9a4b8 obshashrange: force saving of stablesort and firstmerge cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3964
diff changeset
   293
        repo.stablesort.save(repo)
ea7687a9a4b8 obshashrange: force saving of stablesort and firstmerge cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3964
diff changeset
   294
        repo.firstmergecache.save(repo)
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   295
        if not self._unsavedsubranges:
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   296
            return # no new data
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   297
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   298
        if self._con is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   299
            util.unlinkpath(self._path, ignoremissing=True)
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   300
            if r'_con' in vars(self):
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   301
                del self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   302
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   303
            con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   304
            if con is None:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   305
                return
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   306
            with con:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   307
                for req in _sqliteschema:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   308
                    con.execute(req)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   309
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   310
                meta = [self._schemaversion,
4026
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   311
                        nodemod.nullrev,
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   312
                        nodemod.nullid,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   313
                ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   314
                con.execute(_newmeta, meta)
4026
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   315
                self._ondisktiprev = nodemod.nullrev
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   316
                self._ondisktipnode = nodemod.nullid
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   317
        else:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   318
            con = self._con
4026
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   319
        with con:
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   320
            meta = con.execute(_querymeta).fetchone()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   321
            if meta[2] != self._ondisktipnode or meta[1] != self._ondisktiprev:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   322
                # drifting is currently an issue because this means another
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   323
                # process might have already added the cache line we are about
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   324
                # to add. This will confuse sqlite
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   325
                msg = _(b'stable-range cache: skipping write, '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   326
                        b'database drifted under my feet\n')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   327
                hint = _(b'(disk: %s-%s vs mem: %s-%s)\n')
4020
47b00d3b8ea2 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   328
                data = (nodemod.hex(meta[2]), meta[1],
47b00d3b8ea2 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   329
                        nodemod.hex(self._ondisktipnode), self._ondisktiprev)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   330
                repo.ui.warn(msg)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   331
                repo.ui.warn(hint % data)
4026
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   332
                self._unsavedsubranges.clear()
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   333
                return
4026
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   334
            else:
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   335
                self._saverange(con, repo)
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   336
                meta = [self._tiprev,
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   337
                        self._tipnode,
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   338
                ]
b375398074b0 stablerange: rework saving logic to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   339
                con.execute(_updatemeta, meta)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   340
        self._ondisktiprev = self._tiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   341
        self._ondisktipnode = self._tipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   342
        self._unsavedsubranges.clear()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   343
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   344
    def _saverange(self, con, repo):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   345
        repo = repo.unfiltered()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   346
        data = []
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   347
        allranges = set()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   348
        for key, value in self._unsavedsubranges.items():
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   349
            allranges.add(key)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   350
            for idx, sub in enumerate(value):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   351
                data.append((idx, key[0], key[1], sub[0], sub[1]))
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   352
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   353
        con.executemany(_updaterange, allranges)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   354
        con.executemany(_updatesubranges, data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   355
3343
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   356
class stablerangesql(stablerangesqlbase, stablerangeondiskbase):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   357
    """base clase able to preserve data to disk as sql"""
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   358
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   359
    __metaclass__ = abc.ABCMeta
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   360
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   361
    # self._cachekey = (tiprev, tipnode)
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   362
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   363
    @property
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   364
    def _tiprev(self):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   365
        return self._cachekey[0]
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   366
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   367
    @_tiprev.setter
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   368
    def _tiprev(self, value):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   369
        self._cachekey = (value, self._cachekey[1])
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   370
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   371
    @property
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   372
    def _tipnode(self):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   373
        return self._cachekey[1]
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   374
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   375
    @_tipnode.setter
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   376
    def _tipnode(self, value):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   377
        self._cachekey = (self._cachekey[0], value)
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   378
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   379
    def clear(self, reset=False):
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   380
        super(stablerangesql, self).clear(reset=reset)
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   381
        if r'_con' in vars(self):
3348
895e16385a4f stablerange: be more cautious when deleting the sql connection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3347
diff changeset
   382
            del self._con
3343
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   383
        self._subrangescache.clear()
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   384
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   385
    def load(self, repo):
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   386
        """load data from disk"""
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   387
        assert repo.filtername is None
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   388
        self._cachekey = self.emptykey
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   389
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   390
        if self._con is not None:
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   391
            self._cachekey = (self._ondisktiprev, self._ondisktipnode)
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   392
        self._ondiskkey = self._cachekey
3343
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   393
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   394
    def save(self, repo):
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   395
        if self._cachekey is None or self._cachekey == self._ondiskkey:
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   396
            return
3343
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   397
        self._save(repo)
86a03229d32d stablerange: introduce a sql backed version of the generic on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3342
diff changeset
   398
3344
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   399
class mergepointsql(stablerangesql, stablerange.stablerange_mergepoint):
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   400
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4109
diff changeset
   401
    _schemaversion = 3
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   402
    _cachefile = b'evoext_stablerange_v2.sqlite'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   403
    _cachename = b'evo-ext-stablerange-mergepoint'
3344
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   404
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   405
class sqlstablerange(stablerangesqlbase, stablerange.stablerange):
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   406
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   407
    _schemaversion = 1
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   408
    _cachefile = b'evoext_stablerange_v1.sqlite'
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   409
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   410
    def warmup(self, repo, upto=None):
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   411
        self._con # make sure the data base is loaded
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   412
        try:
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   413
            # samelessly lock the repo to ensure nobody will update the repo
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   414
            # concurently. This should not be too much of an issue if we warm
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   415
            # at the end of the transaction.
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   416
            #
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   417
            # XXX However, we lock even if we are up to date so we should check
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   418
            # before locking
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   419
            with repo.lock():
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   420
                super(sqlstablerange, self).warmup(repo, upto)
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   421
                self._save(repo)
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   422
        except error.LockError:
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   423
            # Exceptionnally we are noisy about it since performance impact is
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   424
            # large We should address that before using this more widely.
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   425
            repo.ui.warn(b'stable-range cache: unable to lock repo while warming\n')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   426
            repo.ui.warn(b'(cache will not be saved)\n')
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   427
            super(sqlstablerange, self).warmup(repo, upto)
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   428
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   429
@eh.command(
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   430
    b'debugstablerangecache',
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   431
    [] + commands.formatteropts,
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   432
    _(b''))
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   433
def debugstablerangecache(ui, repo, **opts):
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   434
    """display data about the stable sort cache of a repository
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   435
    """
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   436
    unfi = repo.unfiltered()
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   437
    revs = unfi.revs('all()')
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   438
    nbrevs = len(revs)
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   439
    ui.write(b'number of revisions:  %12d\n' % nbrevs)
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   440
    heads = unfi.revs('heads(all())')
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   441
    nbheads = len(heads)
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   442
    ui.write(b'number of heads:      %12d\n' % nbheads)
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   443
    merge = unfi.revs('merge()')
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   444
    nbmerge = len(merge)
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   445
    ui.write(b'number of merge:      %12d (%3d%%)\n'
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   446
             % (nbmerge, 100 * nbmerge / nbrevs))
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   447
    cache = unfi.stablerange
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   448
    allsubranges = stablerange.subrangesclosure(unfi, cache, heads)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   449
    nbsubranges = len(allsubranges) - nbrevs # we remove leafs
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   450
    ui.write(b'number of range:      %12d\n' % nbsubranges)
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   451
    import collections
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   452
    subsizedistrib = collections.defaultdict(lambda: 0)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   453
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   454
    def smallsize(r):
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   455
        # This is computing the size it would take to store a range for a
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   456
        # revision
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   457
        #
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   458
        # one int for the initial/top skip
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   459
        # two int per middle ranges
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   460
        # one int for the revision of the bottom part
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   461
        return 4 * (2 + ((len(r) - 2) * 2))
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   462
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   463
    totalsize = 0
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   464
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   465
    allmiddleranges = []
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   466
    for s in allsubranges:
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   467
        sr = cache.subranges(repo, s)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   468
        srl = len(sr)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   469
        if srl == 0:
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   470
            # leaf range are not interresting
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   471
            continue
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   472
        subsizedistrib[srl] += 1
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   473
        allmiddleranges.append(s)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   474
        totalsize += smallsize(sr)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   475
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   476
    for ss in sorted(subsizedistrib):
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   477
        ssc = subsizedistrib[ss]
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   478
        ssp = ssc * 100 // nbsubranges
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   479
        ui.write(b'  with %3d subranges: %12d (%3d%%)\n' % (ss, ssc, ssp))
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   480
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   481
    depth = repo.depthcache.get
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   482
    stdslice = 0
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   483
    oddslice = 0
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   484
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   485
    for s in allmiddleranges:
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   486
        head, skip = s
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   487
        d = depth(head)
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   488
        k = d - 1
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   489
        if (skip & k) == skip:
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   490
            stdslice += 1
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   491
        else:
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   492
            oddslice += 1
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   493
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   494
    ui.write(b'standard slice point cut: %12d (%3d%%)\n'
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   495
             % (stdslice, stdslice * 100 // nbsubranges))
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   496
    ui.write(b'other    slice point cut: %12d (%3d%%)\n'
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   497
             % (oddslice, oddslice * 100 // nbsubranges))
5313
fbe07b1cf5d4 py3: fix debugstablerangecache
Joerg Sonnenberger <joerg@bec.de>
parents: 5276
diff changeset
   498
    ui.write(b'est. naive compact store: %12d bytes\n' % totalsize)
4837
b59231359479 stablerange: add a debugstablerangecache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   499
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   500
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   501
def setupcache(ui, repo):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   502
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   503
    class stablerangerepo(repo.__class__):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   504
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   505
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   506
        def stablerange(self):
3646
0dd393a32567 stablerangecache: use self instead of repo in stablerangerepo.stablerange()
Anton Shestakov <av6@dwimlabs.net>
parents: 3504
diff changeset
   507
            cache = mergepointsql(self)
0dd393a32567 stablerangecache: use self instead of repo in stablerangerepo.stablerange()
Anton Shestakov <av6@dwimlabs.net>
parents: 3504
diff changeset
   508
            cache.update(self)
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   509
            return cache
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   510
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   511
        @localrepo.unfilteredmethod
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   512
        def destroyed(self):
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   513
            if r'stablerange' in vars(self):
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   514
                self.stablerange.clear()
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   515
                del self.stablerange
2287
18b8dc058f75 repo: properly progate "destroyed" call to super class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   516
            super(stablerangerepo, self).destroyed()
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   517
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   518
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   519
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   520
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   521
                self.stablerange.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   522
                self.stablerange.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   523
            super(stablerangerepo, self).updatecaches(tr, **kwargs)
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   524
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   525
    repo.__class__ = stablerangerepo
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3659
diff changeset
   526
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3659
diff changeset
   527
eh.merge(stablerange.eh)