From 13040f41a1ebbd87927814b8cdb1a53ad2f141ac Mon Sep 17 00:00:00 2001 From: Zoran Joka Date: Wed, 21 Nov 2018 11:08:19 +0100 Subject: [PATCH] Optimize machine pings query (#222) * refactor recordPing method * optimize queries * migrate machine_pings remove id, serial_number add primary key on device_id add unique constraint on device_id * remove filelds from query, rename migration, delete duplicate migration * truncate machine_pings in migration --- lib/notifier.js | 4 +--- lib/plugins.js | 13 ++++--------- migrations/1542638179228-alter-machine-pings.js | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 migrations/1542638179228-alter-machine-pings.js diff --git a/lib/notifier.js b/lib/notifier.js index 20b5e00a..b44ae5bd 100644 --- a/lib/notifier.js +++ b/lib/notifier.js @@ -130,9 +130,7 @@ function checkStuckScreen (deviceEvents) { function checkPing (deviceId) { const sql = `select (EXTRACT(EPOCH FROM (now() - created))) * 1000 AS age from machine_pings - where device_id=$1 - order by created desc - limit 1` + where device_id=$1` return db.oneOrNone(sql, [deviceId]) .then(row => { diff --git a/lib/plugins.js b/lib/plugins.js index 89b9a6da..c5585d8e 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -203,7 +203,7 @@ function plugins (settings, deviceId) { const tickerPromises = cryptoCodes.map(c => ticker.getRates(settings, fiatCode, c)) const balancePromises = cryptoCodes.map(c => fiatBalance(fiatCode, c)) const testnetPromises = cryptoCodes.map(c => wallet.cryptoNetwork(settings, c)) - const pingPromise = recordPing(serialNumber, deviceTime, deviceRec) + const pingPromise = recordPing(deviceTime) const currentConfigVersionPromise = fetchCurrentConfigVersion() const promises = [ @@ -236,19 +236,14 @@ function plugins (settings, deviceId) { return wallet.sendCoins(settings, tx.toAddress, tx.cryptoAtoms, tx.cryptoCode) } - function recordPing (serialNumber, deviceTime, rec) { - const machinePings = { - id: uuid.v4(), - device_id: deviceId, - serial_number: serialNumber, - device_time: deviceTime - } + function recordPing (deviceTime) { const devices = { last_online: deviceTime } return Promise.all([ - db.none(pgp.helpers.insert(machinePings, null, 'machine_pings')), + db.none(`insert into machine_pings(device_id, device_time) values($1, $2) + ON CONFLICT (device_id) DO UPDATE SET device_time = $2`, [deviceId, deviceTime]), db.none(pgp.helpers.update(devices, null, 'devices') + 'WHERE device_id = ${deviceId}', { deviceId }) ]) } diff --git a/migrations/1542638179228-alter-machine-pings.js b/migrations/1542638179228-alter-machine-pings.js new file mode 100644 index 00000000..aa7cdf8c --- /dev/null +++ b/migrations/1542638179228-alter-machine-pings.js @@ -0,0 +1,17 @@ +const db = require('./db') + +exports.up = function(next) { + var sql = [ + 'TRUNCATE TABLE machine_pings', + 'ALTER TABLE machine_pings DROP id', + 'ALTER TABLE machine_pings DROP serial_number', + 'ALTER TABLE machine_pings ADD CONSTRAINT PK_device_id PRIMARY KEY (device_id)', + 'ALTER TABLE machine_pings ADD CONSTRAINT U_device_id UNIQUE(device_id)' + ] + + db.multi(sql, next) +}; + +exports.down = function(next) { + next(); +};