diff options
Diffstat (limited to 'bitbake')
| -rw-r--r-- | bitbake/lib/hashserv/__init__.py | 37 |
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) |
