feat(db): new db patch

This commit is contained in:
Alexey Kasyanchuk 2021-06-20 12:11:24 +03:00
parent 2ec7ad0501
commit 8df02cb296

View File

@ -16,6 +16,8 @@ const detectOnebyteEncoding = require('detect-onebyte-encoding')
const isOneByteEncoding = require('./detectOneByte') const isOneByteEncoding = require('./detectOneByte')
const {promisify} = require('util'); const {promisify} = require('util');
const mkdirp = require('mkdirp') const mkdirp = require('mkdirp')
const mysql = require('./mysql')
const asyncWait = require('./asyncWait')
const findGoodPort = async (port, host) => { const findGoodPort = async (port, host) => {
while (!(await portCheck(port, host))) { while (!(await portCheck(port, host))) {
@ -106,7 +108,6 @@ const writeSphinxConfig = async (rootPath, dbPath, params = {}) => {
{ {
listen = 127.0.0.1:${appConfig.sphinx.interfacePort} listen = 127.0.0.1:${appConfig.sphinx.interfacePort}
listen = 127.0.0.1:${appConfig.sphinx.port}:mysql41 listen = 127.0.0.1:${appConfig.sphinx.port}:mysql41
network_timeout = 5
max_children = 30 max_children = 30
seamless_rotate = 1 seamless_rotate = 1
preopen_indexes = 1 preopen_indexes = 1
@ -252,6 +253,11 @@ module.exports = async (callback, dataDirectory, onClose, params = {}) => {
{ {
sphinx.fixDatabase() sphinx.fixDatabase()
} }
if(data.includes('indexes with meta prior to v.14 are no longer supported'))
{
sphinx.convertDatabase()
}
if(windowsEncodingFix && data.includes('failed to parse config file')) if(windowsEncodingFix && data.includes('failed to parse config file'))
{ {
@ -305,6 +311,90 @@ module.exports = async (callback, dataDirectory, onClose, params = {}) => {
} }
}) })
sphinx.convertDatabase = async () => {
if(sphinx.isExternal)
return
if(sphinx.fixing)
return
sphinx.fixing = true
// close db
await new Promise((resolve) => {
sphinx.stop(resolve, true)
logT('sphinx', 'revent start')
})
logT('sphinx', 'sphinx stoped')
const converterPath = path.resolve(appPath('index_converter'))
logT('dbconverter', 'Convert Path:', converterPath)
const binLogs = await findFiles(`${rootPath}/binlog.*`)
logT('dbconverter', 'remove ', binLogs)
if(binLogs)
binLogs.forEach(file => fs.unlinkSync(file));
logT('dbconverter', 'fixing ramchunks')
await new Promise((resolve) => {
const oldSphinxPath = path.resolve(appPath('searchd.v2'))
logT('dbconverter', 'old sphinx', oldSphinxPath);
const oldSphinxEXE = spawn(oldSphinxPath, ['--config', config]);
const tables = [];
oldSphinxEXE.stdout.on('data', async (data) => {
data = data.toString();
logT('sphinx', data);
const table = /precaching index '(\w+)'/.exec(data);
if(table)
tables.push(table[1]);
if (data.includes('accepting connections')) {
logT('sphinx', 'catched sphinx start')
const mydb = mysql.single();
for(const table of tables)
await mydb.query(`FLUSH RAMCHUNK ${table}`);
await mydb.end()
exec(`"${oldSphinxPath}" --config "${config}" --stopwait`)
}
if(data.includes('shutdown complete')) {
await asyncWait(200);
resolve();
}
});
});
logT('dbconverter', 'fixing ramchunks ok, start converting...')
await new Promise((resolve) => {
const converterEXE = spawn(converterPath, ['--config', config, '--all']);
converterEXE.stdout.on('data', (data) => {
data = data.toString();
logT('dbconverter', data);
if(data.includes('converted indexes')) {
resolve();
}
});
})
logT('dbconverter', 'database conveted');
// cleanup
const oldFiles = await findFiles(`${dbPath}/database/*.old.*`)
logT('dbconverter', 'remove ', oldFiles)
if(oldFiles)
oldFiles.forEach(file => fs.unlinkSync(file));
logT('dbconverter', 'cleanup finish');
// restart
sphinx.fixing = false
_.merge(sphinx, await sphinx.start(callback));
}
sphinx.fixDatabase = async () => { sphinx.fixDatabase = async () => {
if(sphinx.isExternal) if(sphinx.isExternal)
return return