Fix v2.19.1 migration schema connection ownership
This commit is contained in:
1 parent
9ca372429b
commit
0044cbc1fc
2 files changed
+41
-16
No files matched your search
@@ -9,11 +9,9 @@ function createPool(responses) {
|
||||
const queries = [];
|
||||
return {
|
||||
queries,
|
||||
async getConnection() { return this; },
|
||||
async beginTransaction() { queries.push(['START TRANSACTION']); },
|
||||
async commit() { queries.push(['COMMIT']); },
|
||||
async rollback() { queries.push(['ROLLBACK']); },
|
||||
release() { queries.push(['RELEASE CONNECTION']); },
|
||||
async query(sql, params) {
|
||||
queries.push([sql, params]);
|
||||
const text = String(sql);
|
||||
@@ -244,11 +242,11 @@ test('2.19.1 migration rebuilds only managed font references for all content in
|
||||
assert.ok(pool.queries.some(([sql, params]) => sql.startsWith('SELECT id, content_json') && params[0] === 118));
|
||||
assert.ok(pool.queries.some(([sql, params]) => sql.startsWith('SELECT id, template_id, region_key') && params[0] === 900));
|
||||
assert.ok(!pool.queries.some(([sql]) => /^(UPDATE|ALTER|TRUNCATE)/.test(sql)));
|
||||
assert.deepEqual(pool.queries.slice(-2), [['COMMIT'], ['RELEASE CONNECTION']]);
|
||||
assert.deepEqual(pool.queries.slice(-1), [['COMMIT']]);
|
||||
assert.deepEqual(await getPendingMigrations(pool, { currentVersion: '2.19.1' }), []);
|
||||
});
|
||||
|
||||
test('2.19.1 font repair rolls back and releases its connection on failure', async () => {
|
||||
test('2.19.1 font repair rolls back without releasing the caller-owned connection on failure', async () => {
|
||||
const pool = createPool([
|
||||
{ match: sql => sql.includes('information_schema.COLUMNS'), result: [[{ column_count: 1 }]] },
|
||||
{ match: sql => sql.includes('information_schema.TABLES'), result: [[{ table_count: 0 }]] }
|
||||
@@ -261,6 +259,36 @@ test('2.19.1 font repair rolls back and releases its connection on failure', asy
|
||||
};
|
||||
|
||||
await assert.rejects(migration.run(pool), /read failed/);
|
||||
assert.deepEqual(pool.queries.slice(-2), [['ROLLBACK'], ['RELEASE CONNECTION']]);
|
||||
assert.deepEqual(pool.queries.slice(-1), [['ROLLBACK']]);
|
||||
assert.ok(!pool.queries.some(([sql]) => sql === 'COMMIT'));
|
||||
});
|
||||
|
||||
test('schema startup runs the 2.19.1 repair on its existing locked connection', async () => {
|
||||
const { ensureSchema } = require('../src/db');
|
||||
const connection = createPool([
|
||||
{ match: sql => sql.includes('SELECT GET_LOCK'), result: [[{ lock_acquired: 1 }]] },
|
||||
{ match: (sql, params) => sql.includes('information_schema.TABLES') && params[0] === 'o_app_state', result: [[{ table_count: 1 }]] },
|
||||
{ match: sql => sql.startsWith('SELECT state_value'), result: [[{ state_value: '2.19.0' }]] },
|
||||
{ match: sql => sql.includes('information_schema.COLUMNS'), result: [[{ column_count: 1 }]] },
|
||||
{ match: sql => sql.includes('information_schema.TABLES'), result: [[{ table_count: 0 }]] }
|
||||
]);
|
||||
connection.release = function () { connection.queries.push(['RELEASE CONNECTION']); };
|
||||
let acquisitions = 0;
|
||||
|
||||
await ensureSchema({
|
||||
async getConnection() {
|
||||
acquisitions += 1;
|
||||
return connection;
|
||||
}
|
||||
});
|
||||
|
||||
assert.equal(acquisitions, 1);
|
||||
const commitIndex = connection.queries.findIndex(([sql]) => sql === 'COMMIT');
|
||||
const versionIndex = connection.queries.findIndex(([sql, params]) => sql.startsWith('UPDATE o_app_state') && params[0] === '2.19.1');
|
||||
assert.ok(commitIndex > 0);
|
||||
assert.ok(versionIndex > commitIndex);
|
||||
assert.deepEqual(connection.queries.slice(-2), [
|
||||
['SELECT RELEASE_LOCK(?)', ['pulse_signage_schema_lock']],
|
||||
['RELEASE CONNECTION']
|
||||
]);
|
||||
});
|
||||
Reference in new issue
Block a user