diff options
author | Lianhao Lu <lianhao.lu@intel.com> | 2012-01-16 12:07:44 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-01-19 00:15:38 +0000 |
commit | 1fedd166b71a4000116fcc9bd993cb23a7899adb (patch) | |
tree | 0ad21e5f57a02ad5921398089a252d607712a278 /bitbake/lib | |
parent | 5724ee9c3a99519fea96446638910b727b89898d (diff) | |
download | poky-1fedd166b71a4000116fcc9bd993cb23a7899adb.tar.gz |
bitbake/persist_data: Reconnect when DB is locked
[YOCTO #1761]
Reconnect to the backend Sqlite DB in 'database is locked' exception so
the timeout can be leveraged in each time retry.
(Bitbake rev: b310382764367b573c84f33d847c6eb821266f9e)
Signed-off-by: Lianhao Lu <lianhao.lu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/persist_data.py | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/bitbake/lib/bb/persist_data.py b/bitbake/lib/bb/persist_data.py index 17620ef331..c4ea23bfda 100644 --- a/bitbake/lib/bb/persist_data.py +++ b/bitbake/lib/bb/persist_data.py | |||
@@ -47,9 +47,10 @@ if hasattr(sqlite3, 'enable_shared_cache'): | |||
47 | @total_ordering | 47 | @total_ordering |
48 | class SQLTable(collections.MutableMapping): | 48 | class SQLTable(collections.MutableMapping): |
49 | """Object representing a table/domain in the database""" | 49 | """Object representing a table/domain in the database""" |
50 | def __init__(self, cursor, table): | 50 | def __init__(self, cachefile, table): |
51 | self.cursor = cursor | 51 | self.cachefile = cachefile |
52 | self.table = table | 52 | self.table = table |
53 | self.cursor = connect(self.cachefile) | ||
53 | 54 | ||
54 | self._execute("CREATE TABLE IF NOT EXISTS %s(key TEXT, value TEXT);" | 55 | self._execute("CREATE TABLE IF NOT EXISTS %s(key TEXT, value TEXT);" |
55 | % table) | 56 | % table) |
@@ -63,6 +64,8 @@ class SQLTable(collections.MutableMapping): | |||
63 | except sqlite3.OperationalError as exc: | 64 | except sqlite3.OperationalError as exc: |
64 | if 'database is locked' in str(exc) and count < 500: | 65 | if 'database is locked' in str(exc) and count < 500: |
65 | count = count + 1 | 66 | count = count + 1 |
67 | self.cursor.close() | ||
68 | self.cursor = connect(self.cachefile) | ||
66 | continue | 69 | continue |
67 | raise | 70 | raise |
68 | 71 | ||
@@ -188,7 +191,7 @@ class PersistData(object): | |||
188 | del self.data[domain][key] | 191 | del self.data[domain][key] |
189 | 192 | ||
190 | def connect(database): | 193 | def connect(database): |
191 | return sqlite3.connect(database, timeout=30, isolation_level=None) | 194 | return sqlite3.connect(database, timeout=5, isolation_level=None) |
192 | 195 | ||
193 | def persist(domain, d): | 196 | def persist(domain, d): |
194 | """Convenience factory for SQLTable objects based upon metadata""" | 197 | """Convenience factory for SQLTable objects based upon metadata""" |
@@ -201,5 +204,4 @@ def persist(domain, d): | |||
201 | 204 | ||
202 | bb.utils.mkdirhier(cachedir) | 205 | bb.utils.mkdirhier(cachedir) |
203 | cachefile = os.path.join(cachedir, "bb_persist_data.sqlite3") | 206 | cachefile = os.path.join(cachedir, "bb_persist_data.sqlite3") |
204 | connection = connect(cachefile) | 207 | return SQLTable(cachefile, domain) |
205 | return SQLTable(connection, domain) | ||