Files
dolt/integration-tests/mysql-client-tests/node/concurrency.js
2023-02-07 17:16:49 -08:00

122 lines
2.4 KiB
JavaScript

import mysql from "mysql2/promise";
import { getConfig } from "./helpers";
async function createTable() {
const conn = await getConnection();
try {
await conn.execute("create table users (name varchar(20))");
} catch (err) {
console.error(`Error creating table:`, err);
process.exit(1);
} finally {
conn.end();
}
}
async function commitTable() {
const conn = await getConnection();
try {
await conn.execute(`call dolt_add('.')`);
await conn.execute(`call dolt_commit('-am', 'new table')`);
} catch (err) {
console.error(`Error committing table:`, err);
} finally {
conn.end();
}
}
const authors = [
"bob",
"john",
"mary",
"alice",
"bob2",
"john2",
"mary2",
"alice2",
"bob3",
"john3",
"mary3",
"alice3",
"bob4",
"john4",
"mary4",
"alice4",
"bob5",
"john5",
"mary5",
"alice5",
"bob6",
"john6",
"mary6",
"alice6",
"bob7",
"john7",
"mary7",
"alice7",
"bob8",
"john8",
"mary8",
"alice8",
"bob9",
"john9",
"mary9",
"alice9",
];
async function insertAuthor(name) {
const conn = await getConnection();
try {
await conn.execute("start transaction");
await conn.execute("INSERT INTO users (name) VALUES(?);", [name]);
await conn.execute(`call dolt_commit('-am', concat('created author', ?))`, [
name,
]);
} catch (err) {
console.error(`Error committing ${name}:`, err);
process.exit(1);
} finally {
conn.end();
}
}
async function validateCommits(name) {
const conn = await getConnection();
let results;
try {
results = await conn.query(
`select count(*) as c from dolt_log where message like 'created author%'`
);
} catch (err) {
console.error(`Error:`, err);
process.exit(1);
} finally {
conn.end();
}
const count = results[0][0].c;
const expectedCount = authors.length;
if (count != expectedCount) {
console.error(
`Unexpected number of commits: expected ${expectedCount}, was ${count}`
);
process.exit(1);
}
}
async function getConnection() {
const connection = await mysql.createConnection(getConfig());
return connection;
}
// Regression test concurrent dolt_commit with node clients
// https://github.com/dolthub/dolt/issues/4361
async function main() {
await createTable();
await commitTable();
await Promise.all(authors.map(insertAuthor));
await validateCommits();
}
main();