summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/hashserv/__init__.py37
1 files changed, 27 insertions, 10 deletions
diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init__.py
index fdc9ced9f2..768c5504cf 100644
--- a/bitbake/lib/hashserv/__init__.py
+++ b/bitbake/lib/hashserv/__init__.py
@@ -1,4 +1,4 @@
1# Copyright (C) 2018 Garmin Ltd. 1# Copyright (C) 2018-2019 Garmin Ltd.
2# 2#
3# SPDX-License-Identifier: GPL-2.0-only 3# SPDX-License-Identifier: GPL-2.0-only
4# 4#
@@ -32,7 +32,7 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
32 32
33 d = None 33 d = None
34 with contextlib.closing(self.db.cursor()) as cursor: 34 with contextlib.closing(self.db.cursor()) as cursor:
35 cursor.execute('SELECT taskhash, method, unihash FROM tasks_v1 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1', 35 cursor.execute('SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1',
36 {'method': method, 'taskhash': taskhash}) 36 {'method': method, 'taskhash': taskhash})
37 37
38 row = cursor.fetchone() 38 row = cursor.fetchone()
@@ -63,15 +63,29 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
63 63
64 with contextlib.closing(self.db.cursor()) as cursor: 64 with contextlib.closing(self.db.cursor()) as cursor:
65 cursor.execute(''' 65 cursor.execute('''
66 SELECT taskhash, method, unihash FROM tasks_v1 WHERE method=:method AND outhash=:outhash 66 -- Find tasks with a matching outhash (that is, tasks that
67 -- are equivalent)
68 SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND outhash=:outhash
69
70 -- If there is an exact match on the taskhash, return it.
71 -- Otherwise return the oldest matching outhash of any
72 -- taskhash
67 ORDER BY CASE WHEN taskhash=:taskhash THEN 1 ELSE 2 END, 73 ORDER BY CASE WHEN taskhash=:taskhash THEN 1 ELSE 2 END,
68 created ASC 74 created ASC
75
76 -- Only return one row
69 LIMIT 1 77 LIMIT 1
70 ''', {k: data[k] for k in ('method', 'outhash', 'taskhash')}) 78 ''', {k: data[k] for k in ('method', 'outhash', 'taskhash')})
71 79
72 row = cursor.fetchone() 80 row = cursor.fetchone()
73 81
82 # If no matching outhash was found, or one *was* found but it
83 # wasn't an exact match on the taskhash, a new entry for this
84 # taskhash should be added
74 if row is None or row['taskhash'] != data['taskhash']: 85 if row is None or row['taskhash'] != data['taskhash']:
86 # If a row matching the outhash was found, the unihash for
87 # the new taskhash should be the same as that one.
88 # Otherwise the caller provided unihash is used.
75 unihash = data['unihash'] 89 unihash = data['unihash']
76 if row is not None: 90 if row is not None:
77 unihash = row['unihash'] 91 unihash = row['unihash']
@@ -88,18 +102,17 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
88 if k in data: 102 if k in data:
89 insert_data[k] = data[k] 103 insert_data[k] = data[k]
90 104
91 cursor.execute('''INSERT INTO tasks_v1 (%s) VALUES (%s)''' % ( 105 cursor.execute('''INSERT INTO tasks_v2 (%s) VALUES (%s)''' % (
92 ', '.join(sorted(insert_data.keys())), 106 ', '.join(sorted(insert_data.keys())),
93 ', '.join(':' + k for k in sorted(insert_data.keys()))), 107 ', '.join(':' + k for k in sorted(insert_data.keys()))),
94 insert_data) 108 insert_data)
95 109
96 logger.info('Adding taskhash %s with unihash %s', data['taskhash'], unihash) 110 logger.info('Adding taskhash %s with unihash %s', data['taskhash'], unihash)
97 cursor.execute('SELECT taskhash, method, unihash FROM tasks_v1 WHERE id=:id', {'id': cursor.lastrowid})
98 row = cursor.fetchone()
99 111
100 self.db.commit() 112 self.db.commit()
101 113 d = {'taskhash': data['taskhash'], 'method': data['method'], 'unihash': unihash}
102 d = {k: row[k] for k in ('taskhash', 'method', 'unihash')} 114 else:
115 d = {k: row[k] for k in ('taskhash', 'method', 'unihash')}
103 116
104 self.send_response(200) 117 self.send_response(200)
105 self.send_header('Content-Type', 'application/json; charset=utf-8') 118 self.send_header('Content-Type', 'application/json; charset=utf-8')
@@ -120,7 +133,7 @@ def create_server(addr, db, prefix=''):
120 133
121 with contextlib.closing(db.cursor()) as cursor: 134 with contextlib.closing(db.cursor()) as cursor:
122 cursor.execute(''' 135 cursor.execute('''
123 CREATE TABLE IF NOT EXISTS tasks_v1 ( 136 CREATE TABLE IF NOT EXISTS tasks_v2 (
124 id INTEGER PRIMARY KEY AUTOINCREMENT, 137 id INTEGER PRIMARY KEY AUTOINCREMENT,
125 method TEXT NOT NULL, 138 method TEXT NOT NULL,
126 outhash TEXT NOT NULL, 139 outhash TEXT NOT NULL,
@@ -134,9 +147,13 @@ def create_server(addr, db, prefix=''):
134 PV TEXT, 147 PV TEXT,
135 PR TEXT, 148 PR TEXT,
136 task TEXT, 149 task TEXT,
137 outhash_siginfo TEXT 150 outhash_siginfo TEXT,
151
152 UNIQUE(method, outhash, taskhash)
138 ) 153 )
139 ''') 154 ''')
155 cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup ON tasks_v2 (method, taskhash)')
156 cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup ON tasks_v2 (method, outhash)')
140 157
141 logger.info('Starting server on %s', addr) 158 logger.info('Starting server on %s', addr)
142 return HTTPServer(addr, Handler) 159 return HTTPServer(addr, Handler)