mariadb-corporation / mariadb-connector-nodejs

MariaDB Connector/Node.js is used to connect applications developed on Node.js to MariaDB and MySQL databases. MariaDB Connector/Node.js is LGPL licensed.
GNU Lesser General Public License v2.1
363 stars 93 forks source link

Insert of Long Rows causes "ECONNRESET" or "Got packets out of order" with 3.2.3. Same code works with 2.5.6 #273

Closed markddrake closed 2 months ago

markddrake commented 5 months ago

The following code

"use strict"
import mariadb from 'mariadb';
import fs from 'fs';

async function main() {

    const connectionDetails = {
            host      : "yadamu-db1"
           ,user      : "root"
           ,password  : "oracle"
           ,port      : 3307
           ,database  : "mysql"
           ,multipleStatements: true
           ,typeCast:true
           ,bigNumberStrings:true
           ,dateStrings:true
           ,rowsAsArray:true}

  let results;

  try {

    const pool = mariadb.createPool(connectionDetails);
    const conn = await pool.getConnection();
    results = await conn.query(`SET AUTOCOMMIT = 0, TIME_ZONE = '+00:00',SESSION INTERACTIVE_TIMEOUT = 600000, WAIT_TIMEOUT = 600000, SQL_MODE='ANSI_QUOTES,PAD_CHAR_TO_FULL_LENGTH', GROUP_CONCAT_MAX_LEN = 1024000, GLOBAL LOCAL_INFILE = 'ON';`);
    results = await conn.query(`drop schema if exists "YADAMU_TEST";`);    
    results = await conn.query(`create schema "YADAMU_TEST";`);    

    results = await conn.query(`USE "YADAMU_TEST"`);    
    results = await conn.query(`create table  if not exists "YADAMU_TEST"."character_types"(
  "character_col" char(1) ,"character_varying_col" longtext ,"character_max_col" mediumtext ,"character_varying_max_col" mediumtext ,"character_4000_col" varchar(4000) ,"character_varying_4000_col" varchar(4000) ,"character_64k_col" text ,"character_varying_64k_col" text ,"text_col" longtext)`);

    const testData = fs.readFileSync('TEST_DATA.json');
    const data = JSON.parse(testData)
    console.log('ROWS',data.length)
    const flatData = data.flat()
    console.log('ARGS',flatData.length)

    const sql = `insert into "YADAMU_TEST"."character_types" ("character_col","character_varying_col","character_max_col","character_varying_max_col","character_4000_col","character_varying_4000_col","character_64k_col","character_varying_64k_col","text_col") values (?,?,?,?,?,?,?,?,?),(?,?,?,?,?,?,?,?,?),(?,?,?,?,?,?,?,?,?),(?,?,?,?,?,?,?,?,?)`;

    try {

      results = await conn.beginTransaction()
      results = await conn.query(`SAVEPOINT YADAMU_INSERT; `)
      console.log(1)
      results = await conn.query(sql,flatData);
      console.log(2)
      results = await conn.commit()
    } catch (e) {
      console.log(3)
      console.log(e)
    } 

   conn.end()
   pool.end();
 } catch(e) {
   console.log(e);
 }
}

main().then(() => {console.log("Success")}).catch((e) => {console.log(e)})

Works as expected with mariadb@2.5.6

root@47a34bcff7c1:/usr/src/YADAMU# node -v
v21.6.1
root@47a34bcff7c1:/usr/src/YADAMU# npm install mariadb@2.5.6

added 2 packages, changed 1 package, and audited 895 packages in 562ms

112 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
root@47a34bcff7c1:/usr/src/YADAMU# npm ls
yadamu@1.0.0 /usr/src/YADAMU
+-- @aws-sdk/client-s3@3.507.0
+-- @aws-sdk/lib-storage@3.507.0
+-- @azure/storage-blob@12.17.0
+-- @electron/remote@2.1.2
+-- bootstrap-icons@1.11.3
+-- bootstrap@5.3.2
+-- cookie-parser@1.4.6
+-- csv-parser@3.0.0
+-- electron-packager@17.1.2
+-- electron@27.3.1
+-- express-session@1.18.0
+-- express@4.18.2
+-- font-awesome@4.7.0
+-- ibm_db_electron@npm:ibm_db@3.2.3
+-- ibm_db@3.2.3
+-- install@0.13.0
+-- jquery@3.7.1
+-- mariadb@2.5.6
+-- mime-types@2.1.35
+-- mongodb@6.3.0
+-- mssql@10.0.2
+-- mysql@2.18.1
+-- npm@10.4.0
+-- oracledb@6.3.0
+-- pg-copy-streams@6.0.6
+-- pg-query-stream@4.5.3
+-- pg@8.11.3
+-- readable-stream@4.5.2
+-- snowflake-sdk@1.9.3
+-- uuid@9.0.1
`-- wkx@0.5.0

root@47a34bcff7c1:/usr/src/YADAMU#  node insertIssue2.js
ROWS 4
ARGS 36
1
2
Success
root@47a34bcff7c1:/usr/src/YADAMU#

However it fails with ECONNRESET after upgrading to mariadb@3.2.3

root@47a34bcff7c1:/usr/src/YADAMU# npm install mariadb@latest

removed 2 packages, changed 1 package, and audited 893 packages in 665ms

112 packages are looking for funding run npm fund for details

found 0 vulnerabilities root@47a34bcff7c1:/usr/src/YADAMU# node -v v21.6.1 root@47a34bcff7c1:/usr/src/YADAMU# npm ls yadamu@1.0.0 /usr/src/YADAMU +-- @aws-sdk/client-s3@3.507.0 +-- @aws-sdk/lib-storage@3.507.0 +-- @azure/storage-blob@12.17.0 +-- @electron/remote@2.1.2 +-- bootstrap-icons@1.11.3 +-- bootstrap@5.3.2 +-- cookie-parser@1.4.6 +-- csv-parser@3.0.0 +-- electron-packager@17.1.2 +-- electron@27.3.1 +-- express-session@1.18.0 +-- express@4.18.2 +-- font-awesome@4.7.0 +-- ibm_db_electron@npm:ibm_db@3.2.3 +-- ibm_db@3.2.3 +-- install@0.13.0 +-- jquery@3.7.1 +-- mariadb@3.2.3 +-- mime-types@2.1.35 +-- mongodb@6.3.0 +-- mssql@10.0.2 +-- mysql@2.18.1 +-- npm@10.4.0 +-- oracledb@6.3.0 +-- pg-copy-streams@6.0.6 +-- pg-query-stream@4.5.3 +-- pg@8.11.3 +-- readable-stream@4.5.2 +-- snowflake-sdk@1.9.3 +-- uuid@9.0.1 `-- wkx@0.5.0

root@47a34bcff7c1:/usr/src/YADAMU# node insertIssue2.js ROWS 4 ARGS 36 1 3 SqlError: (conn=20526, no: 1156, SQLState: 08S01) Got packets out of order sql: insert into "YADAMU_TEST"."character_types" ("character_col","character_varying_col","character_max_col","character_varying_max_col","character_4000_col","character_varying_4000_col","character_64k_col","character_varying_64k_col","text_col") values (?,?,?... at module.exports.createError (/usr/src/YADAMU/node_modules/mariadb/lib/misc/errors.js:64:10) at PacketNodeEncoded.readError (/usr/src/YADAMU/node_modules/mariadb/lib/io/packet.js:589:19) at Query.readResponsePacket (/usr/src/YADAMU/node_modules/mariadb/lib/cmd/parser.js:62:28) at PacketInputStream.receivePacketBasic (/usr/src/YADAMU/node_modules/mariadb/lib/io/packet-input-stream.js:85:9) at PacketInputStream.onData (/usr/src/YADAMU/node_modules/mariadb/lib/io/packet-input-stream.js:135:20) at Socket.emit (node:events:519:28) at addChunk (node:internal/streams/readable:559:12) at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) at Readable.push (node:internal/streams/readable:390:5) at TCP.onStreamRead (node:internal/stream_base_commons:190:23) { sqlMessage: 'Got packets out of order', sql: 'insert into "YADAMU_TEST"."character_types" ("character_col","character_varying_col","character_max_col","character_varying_max_col","character_4000_col","character_varying_4000_col","character_64k_col","character_varying_64k_col","text_col") values (?,?,?...', fatal: true, errno: 1156, sqlState: '08S01', code: 'ER_NET_PACKETS_OUT_OF_ORDER' } Success root@47a34bcff7c1:/usr/src/YADAMU# root@47a34bcff7c1:/usr/src/YADAMU# node insertIssue2.js ROWS 4 ARGS 36 1 3 Error: write ECONNRESET at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16) { errno: -104, code: 'ECONNRESET', syscall: 'write', fatal: true, sqlState: 'HY000' } Success root@47a34bcff7c1:/usr/src/YADAMU# node insertIssue2.js ROWS 4 ARGS 36 1 3 Error: write ECONNRESET at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16) { errno: -104, code: 'ECONNRESET', syscall: 'write', fatal: true, sqlState: 'HY000' } Success root@47a34bcff7c1:/usr/src/YADAMU# node insertIssue2.js ROWS 4 ARGS 36 1 3 Error: write ECONNRESET at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16) { errno: -104, code: 'ECONNRESET', syscall: 'write', fatal: true, sqlState: 'HY000' } Success root@47a34bcff7c1:/usr/src/YADAMU#

markddrake commented 5 months ago

Test Data is here ... TEST_DATA.zip

rusher commented 5 months ago

tested on my side without reproducing the problem (but i didn't use the same node.js version for now) could you :

markddrake commented 5 months ago

Here you go (It's always the same, as my driver always attempts to set it to the max allowed, if it is not already set)

C:\Development\YADAMU>mysql -uroot -poracle -hyadamu-db1 -P3307 -D mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 38200
Server version: 11.2.2-MariaDB-1:11.2.2+maria~ubu2204 mariadb.org binary distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT @@max_allowed_packet
    -> ;
+----------------------+
| @@max_allowed_packet |
+----------------------+
|           1073741824 |
+----------------------+
1 row in set (0.00 sec)

mysql>
rusher commented 2 months ago

closing since this must have been corrected in 3.3.0. If that's not the case, feel free to create new issue related to this one