hgext3rd/evolve/stablerangecache.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 27 Aug 2018 11:40:32 +0200
changeset 4011 3cb41bf56f16
parent 4010 4c2fcd53c601
child 4013 434398b37e16
permissions -rw-r--r--
sqlcache: protect read query too Some error (like locked database) can even happens when doing readonly operation. So we protect them too. At that point, it seems that pysqlite3 is not the right tool for this job.
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 (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    17
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
    localrepo,
4007
d468db69f9a0 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4006
diff changeset
    19
    node as nodemod,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    20
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    23
from . import (
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    24
    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
    25
    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
    26
    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
    27
    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
    28
)
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3306
diff changeset
    29
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    30
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    31
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
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
    33
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    34
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
    35
                            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
    36
    """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
    37
    """
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
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    39
    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
    40
        """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
    41
        """
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    42
        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
    43
        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
    44
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    45
        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
    46
        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
    47
            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
    48
        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
    49
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    50
        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
    51
        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
    52
        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
    53
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    54
        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
    55
        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
    56
        # 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
    57
        # 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
    58
        progress_each = 100
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    59
        progress_last = time.time()
3194aec207ae stablerange: add a base class for on disk stored stablerange class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3308
diff changeset
    60
        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
    61
        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
    62
            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
    63
            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
    64
                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
    65
                    # 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
    66
                    progress_new = time.time()
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
                    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
    68
                        progress_each /= 10
3659
1e9b535cd9be stablerangecache: include units in ui.progress() calls
Anton Shestakov <av6@dwimlabs.net>
parents: 3646
diff changeset
    69
                    ui.progress(_("filling stablerange cache"), seen,
1e9b535cd9be stablerangecache: include units in ui.progress() calls
Anton Shestakov <av6@dwimlabs.net>
parents: 3646
diff changeset
    70
                                total=total, unit=_("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
    71
                    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
    72
                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
    73
                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
    74
            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
    75
            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
    76
                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
    77
                    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
    78
                        heappush(rangeheap, sub)
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
        ui.progress(_("filling stablerange cache"), None, total=total)
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
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
    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
    82
        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
    83
        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
    84
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    85
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    86
### simple sqlite caching ###
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    87
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    88
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    89
_sqliteschema = [
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    90
    """CREATE TABLE range(rev INTEGER  NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    91
                          idx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    92
                          PRIMARY KEY(rev, idx));""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    93
    """CREATE TABLE subranges(listidx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    94
                              suprev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    95
                              supidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    96
                              subrev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    97
                              subidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    98
                              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
    99
                              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
   100
                              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
   101
    );""",
2240
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   102
    "CREATE INDEX subranges_index ON subranges (suprev, supidx);",
3356
24b72cbc486f stablerange: add an sql index on subranges id too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   103
    "CREATE INDEX superranges_index ON subranges (subrev, subidx);",
2240
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   104
    "CREATE INDEX range_index ON range (rev, idx);",
4009
c58362473bd4 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4007
diff changeset
   105
    """CREATE TABLE meta(schemaversion INTEGER NOT NULL,
c58362473bd4 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4007
diff changeset
   106
                         tiprev        INTEGER NOT NULL,
c58362473bd4 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4007
diff changeset
   107
                         tipnode       BLOB    NOT NULL
c58362473bd4 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4007
diff changeset
   108
                        );""",
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   109
]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   110
_newmeta = "INSERT INTO meta (schemaversion, tiprev, tipnode) VALUES (?,?,?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   111
_updatemeta = "UPDATE meta SET tiprev = ?, tipnode = ?;"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   112
_updaterange = "INSERT INTO range(rev, idx) VALUES (?,?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   113
_updatesubranges = """INSERT
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   114
                       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
   115
                       VALUES (?,?,?,?,?);"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   116
_queryexist = "SELECT name FROM sqlite_master WHERE type='table' AND name='meta';"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   117
_querymeta = "SELECT schemaversion, tiprev, tipnode FROM meta;"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   118
_queryrange = "SELECT * FROM range WHERE (rev = ? AND idx = ?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   119
_querysubranges = """SELECT subrev, subidx
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   120
                     FROM subranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   121
                     WHERE (suprev = ? AND supidx = ?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   122
                     ORDER BY listidx;"""
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   123
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   124
_querysuperrangesmain = """SELECT DISTINCT suprev, supidx
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   125
                           FROM subranges
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   126
                           WHERE %s;"""
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   127
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   128
_querysuperrangesbody = '(subrev = %d and subidx = %d)'
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   129
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   130
def _make_querysuperranges(ranges):
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   131
    # building a tree of OR would allow for more ranges
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   132
    body = ' OR '.join(_querysuperrangesbody % r for r in ranges)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   133
    return _querysuperrangesmain % body
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   134
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   135
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
   136
    """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
   137
    """
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   138
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   139
    __metaclass__ = abc.ABCMeta
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   140
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   141
    _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
   142
    _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
   143
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   144
    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
   145
        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
   146
        self._vfs = repo.vfs
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   147
        self._path = repo.vfs.join(self._cachefile)
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   148
        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
   149
        self._ondisktiprev = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   150
        self._ondisktipnode = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   151
        self._unsavedsubranges = {}
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   152
3355
c261eece1eab obshashrange: less brutal reset when receiving markers on existing node
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3353
diff changeset
   153
    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
   154
        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
   155
        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
   156
        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
   157
        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
   158
        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
   159
        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
   160
            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
   161
            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
   162
        while new:
3953
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   163
            if len(new) < 300:
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   164
                sample = new
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   165
            else:
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   166
                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
   167
            known.update(sample)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   168
            query = _make_querysuperranges(sample)
2174de498a69 stablerange: build closure a bit less inefficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   169
            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
   170
            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
   171
            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
   172
        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
   173
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   174
    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
   175
        # 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
   176
        # 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
   177
        cache = self._subrangescache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   178
        if rangeid not in cache and rangeid[0] <= self._ondisktiprev and self._con is not None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   179
            value = None
4011
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   180
            try:
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   181
                result = self._con.execute(_queryrange, rangeid).fetchone()
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   182
                if result is not None: # database know about this node (skip in the future?)
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   183
                    value = self._con.execute(_querysubranges, rangeid).fetchall()
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   184
                # in memory caching of the value
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   185
                cache[rangeid] = value
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   186
            except sqlite3.OperationalError:
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   187
                # something is wrong with the sqlite db
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   188
                # Since this is a cache, we ignore it.
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   189
                if '_con' in vars(self):
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   190
                    del self._con
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   191
                self._unsavedsubranges.clear()
3cb41bf56f16 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4010
diff changeset
   192
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   193
        return cache.get(rangeid)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   194
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   195
    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
   196
        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
   197
        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
   198
        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
   199
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   200
    def _db(self):
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   201
        try:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   202
            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
   203
        except OSError:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   204
            return None
4004
e47cdbb48ac7 sqlcache: passe better connection option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   205
        con = sqlite3.connect(self._path, timeout=30, isolation_level="IMMEDIATE")
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   206
        con.text_factory = str
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   207
        return con
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   208
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   209
    @util.propertycache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   210
    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
   211
        con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   212
        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
   213
            return None
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   214
        cur = con.execute(_queryexist)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   215
        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
   216
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   217
        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
   218
        if meta is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   219
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   220
        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
   221
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   222
        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
   223
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   224
        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
   225
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   226
        self._ondisktiprev = meta[1]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   227
        self._ondisktipnode = meta[2]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   228
        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
   229
            self._tiprev = self._ondisktiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   230
            self._tipnode = self._ondisktipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   231
        return con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   232
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   233
    def _save(self, repo):
4010
4c2fcd53c601 sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4009
diff changeset
   234
        if not self._unsavedsubranges:
4c2fcd53c601 sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4009
diff changeset
   235
            return
4005
d85556dd18b5 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4004
diff changeset
   236
        try:
d85556dd18b5 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4004
diff changeset
   237
            return self._trysave(repo)
4006
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   238
        except (sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   239
            # Catch error that may arise under stress
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   240
            #
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   241
            # operational error catch read-only and locked database
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   242
            # IntegrityError catch Unique constraint error that may arise
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   243
            if '_con' in vars(self):
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   244
                del self._con
21aee0a596ce sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4005
diff changeset
   245
            self._unsavedsubranges.clear()
4005
d85556dd18b5 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4004
diff changeset
   246
            repo.ui.log('evoext-cache', 'error while saving new data: %s' % exc)
d85556dd18b5 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4004
diff changeset
   247
d85556dd18b5 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4004
diff changeset
   248
    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
   249
        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
   250
        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
   251
        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
   252
        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
   253
        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
   254
            return # no new data
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   255
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   256
        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
   257
            util.unlinkpath(self._path, ignoremissing=True)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   258
            if '_con' in vars(self):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   259
                del self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   260
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   261
            con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   262
            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
   263
                return
3347
ab5172ba3c81 stablerange: clarify sql transaction logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3346
diff changeset
   264
            con.execute('BEGIN IMMEDIATE;')
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   265
            with con:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   266
                for req in _sqliteschema:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   267
                    con.execute(req)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   268
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   269
                meta = [self._schemaversion,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   270
                        self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   271
                        self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   272
                ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   273
                con.execute(_newmeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   274
        else:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   275
            con = self._con
3347
ab5172ba3c81 stablerange: clarify sql transaction logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3346
diff changeset
   276
            con.execute('BEGIN IMMEDIATE;')
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   277
            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
   278
            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
   279
                # 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
   280
                # 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
   281
                # to add. This will confuse sqlite
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   282
                msg = _('stable-range cache: skipping write, '
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   283
                        'database drifted under my feet\n')
4007
d468db69f9a0 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4006
diff changeset
   284
                hint = _('(disk: %s-%s vs mem: %s-%s)\n')
d468db69f9a0 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4006
diff changeset
   285
                data = (nodemod.hex(meta[2]), meta[1],
d468db69f9a0 stablerangecache: fix output in the drifted case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4006
diff changeset
   286
                        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
   287
                repo.ui.warn(msg)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   288
                repo.ui.warn(hint % data)
3347
ab5172ba3c81 stablerange: clarify sql transaction logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3346
diff changeset
   289
                con.execute('ROLLBACK;')
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   290
                return
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   291
            meta = [self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   292
                    self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   293
            ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   294
            con.execute(_updatemeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   295
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   296
        self._saverange(con, repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   297
        con.commit()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   298
        self._ondisktiprev = self._tiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   299
        self._ondisktipnode = self._tipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   300
        self._unsavedsubranges.clear()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   301
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   302
    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
   303
        repo = repo.unfiltered()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   304
        data = []
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   305
        allranges = set()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   306
        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
   307
            allranges.add(key)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   308
            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
   309
                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
   310
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   311
        con.executemany(_updaterange, allranges)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   312
        con.executemany(_updatesubranges, data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   313
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
   314
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
   315
    """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
   316
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
   317
    __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
   318
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
   319
    # 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
   320
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
   321
    @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
   322
    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
   323
        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
   324
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
   325
    @_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
   326
    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
   327
        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
   328
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
   329
    @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
   330
    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
   331
        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
   332
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
   333
    @_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
   334
    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
   335
        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
   336
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
   337
    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
   338
        super(stablerangesql, self).clear(reset=reset)
3348
895e16385a4f stablerange: be more cautious when deleting the sql connection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3347
diff changeset
   339
        if '_con' in vars(self):
895e16385a4f stablerange: be more cautious when deleting the sql connection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3347
diff changeset
   340
            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
   341
        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
   342
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
   343
    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
   344
        """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
   345
        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
   346
        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
   347
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   348
        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
   349
            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
   350
        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
   351
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
   352
    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
   353
        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
   354
            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
   355
        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
   356
3344
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   357
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
   358
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   359
    _schemaversion = 2
4d054737a79c stablerange: have a mergepoint based sql backed class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3343
diff changeset
   360
    _cachefile = 'cache/evoext_stablerange_v2.sqlite'
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3344
diff changeset
   361
    _cachename = '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
   362
3308
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   363
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
   364
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   365
    _schemaversion = 1
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   366
    _cachefile = 'cache/evoext_stablerange_v1.sqlite'
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   367
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   368
    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
   369
        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
   370
        try:
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   371
            # 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
   372
            # 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
   373
            # 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
   374
            #
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   375
            # 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
   376
            # 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
   377
            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
   378
                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
   379
                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
   380
        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
   381
            # 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
   382
            # large We should address that before using this more widely.
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   383
            repo.ui.warn('stable-range cache: unable to lock repo while warming\n')
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   384
            repo.ui.warn('(cache will not be saved)\n')
65af5f9f232b stablerange: abstract the bit able to store cache into sql
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   385
            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
   386
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   387
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   388
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
   389
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   390
    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
   391
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   392
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   393
        def stablerange(self):
3646
0dd393a32567 stablerangecache: use self instead of repo in stablerangerepo.stablerange()
Anton Shestakov <av6@dwimlabs.net>
parents: 3504
diff changeset
   394
            cache = mergepointsql(self)
0dd393a32567 stablerangecache: use self instead of repo in stablerangerepo.stablerange()
Anton Shestakov <av6@dwimlabs.net>
parents: 3504
diff changeset
   395
            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
   396
            return cache
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   397
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   398
        @localrepo.unfilteredmethod
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   399
        def destroyed(self):
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   400
            if '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
   401
                self.stablerange.clear()
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   402
                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
   403
            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
   404
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   405
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   406
        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
   407
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   408
                self.stablerange.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   409
                self.stablerange.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3966
diff changeset
   410
            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
   411
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   412
    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
   413
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3659
diff changeset
   414
eh.merge(stablerange.eh)