From f1ea52f9e11d025a8d369d869eb02c46552cf884 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Tue, 28 Jul 2026 12:54:49 +0700 Subject: [PATCH] update --- models/GpsTracksModels.js | 167 +++----------------------------------- 1 file changed, 10 insertions(+), 157 deletions(-) diff --git a/models/GpsTracksModels.js b/models/GpsTracksModels.js index ddbda5b..6d6f95b 100755 --- a/models/GpsTracksModels.js +++ b/models/GpsTracksModels.js @@ -256,137 +256,6 @@ class GpsTracksModels { // }) // } - // static bundleCreate2(logs = {}, rltm = {}) { - // return new Promise(async (resolve, reject) => { - // let lock = null - // try { - // const conn = await MysqlHelpers.createConnection() - // await MysqlHelpers.createTrx(conn) - - // let rltmLength = Object.keys(rltm).length - // let resLogs = undefined - - // if (Object.keys(logs).length > 0) { - // resLogs = await MysqlHelpers.queryTrx( - // conn, - // `INSERT INTO t_gps_tracks SET ?;`, - // [logs], - // ) - - // if (logs.action == "location") { - // const date = logs.crt_d - // const mm = moment.unix(date).format("MM") - // const yy = moment.unix(date).format("YY") - // logs.id = resLogs.insertId - - // try { - // await MysqlHelpers.queryTrx( - // conn, - // ` - // INSERT INTO tracks_${yy}${mm} - // SET ? - // `, - // [logs], - // ) - // } catch (error) { - // console.log(error) - // fs.appendFileSync( - // path.join(__dirname, `error_data_log.txt`), - // JSON.stringify(logs) + `\n`, - // ) - // } - // } - // } - - // if (rltmLength > 0 && typeof resLogs !== "undefined") - // rltm.master_id = resLogs.insertId - - // if ( - // rltmLength > 0 && - // rltm.latitude !== null && - // rltm.longitude !== null - // ) { - // // === KUNCI DI SINI === - // // Lock per device_id supaya SELECT-DELETE-INSERT untuk - // // device yang sama tidak berjalan bersamaan dari request/worker - // // lain. Inilah yang tadinya memicu ER_DUP_ENTRY dan - // // "Lock wait timeout" karena banyak transaksi menumpuk - // // menunggu baris yang sama. - // lock = await rltmMutex.lock(`t_gps_tracks_rltm:${rltm.device_id}`, { - // duration: 50000, // maksimal lock dipegang 5 detik - // maxWait: 50000, // menunggu lock maksimal 10 detik lalu error - // }) - - // let devices = await MysqlHelpers.queryTrx( - // conn, - // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.device_id = ?`, - // [rltm.device_id], - // ) - // if (devices.length > 1) - // await MysqlHelpers.queryTrx( - // conn, - // `DELETE from t_gps_tracks_rltm WHERE device_id = ?;`, - // [rltm.device_id], - // ) - - // if (rltm.vhc_id != 0) { - // let vhcs = await MysqlHelpers.queryTrx( - // conn, - // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.vhc_id = ?`, - // [rltm.vhc_id], - // ) - // if (vhcs.length > 1) - // await MysqlHelpers.queryTrx( - // conn, - // `DELETE from t_gps_tracks_rltm WHERE vhc_id = ?;`, - // [rltm.vhc_id], - // ) - // } - - // if (rltm.drv_id != 0) { - // let drvs = await MysqlHelpers.queryTrx( - // conn, - // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.drv_id = ?`, - // [rltm.drv_id], - // ) - // if (drvs.length > 1) - // await MysqlHelpers.queryTrx( - // conn, - // `DELETE from t_gps_tracks_rltm WHERE drv_id = ?;`, - // [rltm.drv_id], - // ) - // } - - // await MysqlHelpers.queryTrx( - // conn, - // `INSERT INTO t_gps_tracks_rltm SET ? ON DUPLICATE KEY UPDATE ?;`, - // [rltm, rltm], - // ) - // } - - // await MysqlHelpers.commit(conn) - - // resolve({ - // type: "success", - // result: resLogs, - // }) - // } catch (err) { - // console.log("ERROR bundleCreate2 : " + rltm.device_id) - // reject(err) - // } finally { - // // Lock selalu dilepas, baik sukses maupun gagal, - // // supaya tidak deadlock request device yang sama berikutnya. - // if (lock) { - // try { - // await rltmMutex.unlock(lock) - // } catch (unlockErr) { - // console.log("ERROR unlock mutex : " + rltm.device_id, unlockErr) - // } - // } - // } - // }) - // } - static bundleCreate2(logs = {}, rltm = {}) { return new Promise(async (resolve, reject) => { let lock = null @@ -410,20 +279,7 @@ class GpsTracksModels { const yy = moment.unix(date).format("YY") logs.id = resLogs.insertId - // === KUNCI DI SINI JUGA === - // Lock per device_id supaya insert ke tabel tracks_YYMM - // untuk device yang sama tidak berjalan bersamaan - // (mencegah kondisi tabrakan serupa seperti di t_gps_tracks_rltm). - let tracksLock = null try { - tracksLock = await rltmMutex.lock( - `tracks_${yy}${mm}:${logs.device_id}`, - { - duration: 50000, - maxWait: 50000, - }, - ) - await MysqlHelpers.queryTrx( conn, ` @@ -438,17 +294,6 @@ class GpsTracksModels { path.join(__dirname, `error_data_log.txt`), JSON.stringify(logs) + `\n`, ) - } finally { - if (tracksLock) { - try { - await rltmMutex.unlock(tracksLock) - } catch (unlockErr) { - console.log( - "ERROR unlock mutex tracks_ : " + logs.device_id, - unlockErr, - ) - } - } } } } @@ -461,9 +306,15 @@ class GpsTracksModels { rltm.latitude !== null && rltm.longitude !== null ) { + // === KUNCI DI SINI === + // Lock per device_id supaya SELECT-DELETE-INSERT untuk + // device yang sama tidak berjalan bersamaan dari request/worker + // lain. Inilah yang tadinya memicu ER_DUP_ENTRY dan + // "Lock wait timeout" karena banyak transaksi menumpuk + // menunggu baris yang sama. lock = await rltmMutex.lock(`t_gps_tracks_rltm:${rltm.device_id}`, { - duration: 50000, - maxWait: 50000, + duration: 50000, // maksimal lock dipegang 5 detik + maxWait: 50000, // menunggu lock maksimal 10 detik lalu error }) let devices = await MysqlHelpers.queryTrx( @@ -523,6 +374,8 @@ class GpsTracksModels { console.log("ERROR bundleCreate2 : " + rltm.device_id) reject(err) } finally { + // Lock selalu dilepas, baik sukses maupun gagal, + // supaya tidak deadlock request device yang sama berikutnya. if (lock) { try { await rltmMutex.unlock(lock)