From 8cf68e480a86c19fd3d2545a43fcdcb02804587e Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 16 Jun 2025 17:34:28 +0100 Subject: [PATCH 1/2] refactor: replace `batch()` with `async`/`await` --- packages/server/lib/machine-loader.js | 33 +++++++++++---------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index 174ddeb1..aa05e08a 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -721,38 +721,31 @@ const isEmptyIterable = iter => { } const batchRecordPendingPings = () => { - let pings = pendingRecordPings.values() + const pings = pendingRecordPings.values() pendingRecordPings = new Map() if (isEmptyIterable(pings)) return Promise.resolve() - const prepareChunk = (t, chunk) => - chunk - .flatMap(({ deviceId, last_online, version, model }) => [ - t.none( + return db.task(async t => { + for (const { deviceId, last_online, version, model } of pings) { + await t + .none( `INSERT INTO machine_pings (device_id, device_time) VALUES ($1, $2) ON CONFLICT (device_id) DO UPDATE SET device_time = $2, updated = now()`, [deviceId, last_online], - ), - t.none( + ) + .catch(err => logger.error(err)) + await t + .none( pgp.helpers.update({ last_online, version, model }, null, 'devices') + 'WHERE device_id = ${deviceId}', { deviceId }, - ), - ]) - .toArray() - - const MaxBatchSize = 500 - return db - .task(async t => { - while (!isEmptyIterable(pings)) { - const chunk = pings.take(MaxBatchSize) - await t.batch(prepareChunk(t, chunk)).catch(err => logger.error(err)) - } - }) - .catch(err => logger.error(err)) + ) + .catch(err => logger.error(err)) + } + }) } module.exports = { From 16761b07442fd57fdfa5c8d9913f86429b8dfcb2 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 16 Jun 2025 17:35:49 +0100 Subject: [PATCH 2/2] fix: don't drop pings out of the table --- packages/server/lib/machine-loader.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index aa05e08a..405f2fb9 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -714,16 +714,9 @@ const enqueueRecordPing = ping => { pendingRecordPings.set(ping.deviceId, ping) } -// from @sindresorhus/is-empty-iterable -const isEmptyIterable = iter => { - for (const _ of iter) return false - return true -} - const batchRecordPendingPings = () => { const pings = pendingRecordPings.values() pendingRecordPings = new Map() - if (isEmptyIterable(pings)) return Promise.resolve() return db.task(async t => { for (const { deviceId, last_online, version, model } of pings) {