oracle / node-oracledb

Oracle Database driver for Node.js maintained by Oracle Corp.
http://oracle.github.io/node-oracledb/
Other
2.26k stars 1.07k forks source link

On OCI ADB-23ai with >=oracle-node-6.5.* connection gets NJS-521: connection to host x.x.x.x port 1522 received end-of-file on communication channel. #1697

Open ChaosEngine opened 1 week ago

ChaosEngine commented 1 week ago

Driver mode: thin

  1. What versions are you using? >=oracledb-6.5.0 - problem exists with establishing connection \<=oracledb-6.4.0 - connection is established
  process.platform: win32 and linux
  process.version: v20.18.0
  process.arch: x64
  require('oracledb').versionString: 6.6.0
  require('oracledb').oracleClientVersionString: undefined
  1. Is it an error or a hang or a crash? Error when trying to establish connection to Oracle OPCI ADB 23ai with mTLS wallet connection.

  2. What error(s) or behavior you are seeing?

Error on Linux:

Error: NJS-500: connection to the Oracle Database was broken
NJS-521: connection to host 138.1.3.227 port 1522 received end-of-file on communication channel. (CONNECTION_ID=oZD/yfgrKj5yUjTpiIh3KA==)
    at NTTCP.checkErr (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/sqlnet/ntTcp.js:327:29)
    at NTTCP.receive (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/sqlnet/ntTcp.js:463:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async NetworkSession._recvPacket (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/sqlnet/networkSession.js:390:22)
    at async NetworkSession.recvPacket (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/sqlnet/networkSession.js:455:12)
    at async ReadPacket.waitForPackets (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/protocol/packet.js:324:18)
    at async Protocol._decodeMessage (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/protocol/protocol.js:70:5)
    at async Protocol._processMessage (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/protocol/protocol.js:153:9)
    at async ThinConnectionImpl.connect (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/connection.js:696:9)
    at async ThinPoolImpl.bgThreadFunc (/home/node/node_modules/.pnpm/oracledb@6.5.0/node_modules/oracledb/lib/thin/pool.js:437:11) {
  code: 'NJS-500'
}

Error on Windows:

Error: NJS-500: connection to the Oracle Database was broken
NJS-521: connection to host 138.1.3.227 port 1522 received end-of-file on communication channel. (CONNECTION_ID=zvjqbkKtow3Zi2v0rcaOSw==)
    at NTTCP.checkErr (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6.5.0\node_modules
\oracledb\lib\thin\sqlnet\ntTcp.js:327:29)
    at NTTCP.receive (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6.5.0\node_modules\
oracledb\lib\thin\sqlnet\ntTcp.js:463:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async NetworkSession._recvPacket (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@
6.5.0\node_modules\oracledb\lib\thin\sqlnet\networkSession.js:390:22)
    at async NetworkSession.recvPacket (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6
.5.0\node_modules\oracledb\lib\thin\sqlnet\networkSession.js:455:12)
    at async ReadPacket.waitForPackets (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6
.5.0\node_modules\oracledb\lib\thin\protocol\packet.js:324:18)
    at async Protocol._decodeMessage (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6.5
.0\node_modules\oracledb\lib\thin\protocol\protocol.js:70:5)
    at async Protocol._processMessage (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6.
5.0\node_modules\oracledb\lib\thin\protocol\protocol.js:153:9)
    at async ThinConnectionImpl.connect (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@
6.5.0\node_modules\oracledb\lib\thin\connection.js:696:9)
    at async ThinPoolImpl.bgThreadFunc (C:\Users\Andrzej\source\repos\ChaosEngine\serverless-scaleway-apollo-typescript\node_modules\.pnpm\oracledb@6
.5.0\node_modules\oracledb\lib\thin\pool.js:437:11) {
  code: 'NJS-500'
}
  1. Include a runnable Node.js script that shows the problem.

Repro using https://github.com/ChaosEngine/serverless-scaleway-apollo-typescript.git project on oracle branch and ADB with mTLS wallet with some password:

git clone --branch=oracle https://github.com/ChaosEngine/serverless-scaleway-apollo-typescript.git
cd serverless-scaleway-apollo-typescript/
mkdir -p credentials/wallet

#execute content of db.sql on ADB database, user adb_test_user  is created with some password and schema

cat << EOF > credentials/oracle-creds.env
NODE_ORACLEDB_USER=adb_test_user
NODE_ORACLEDB_PASSWORD=adb_Password443^2
NODE_ORACLEDB_CONNECTIONSTRING=dataplayground2_medium
NODE_ORACLEDB_WALLET_PASSWORD=123456WalPAs!s
EOF

#obtain wallet.zip with password (if needed) and unzip it under credentials/wallet/
unzip -d credentials/wallet/ wallet.zip
docker build -t oracledb-test .
docker run -it --rm -p 8081:8081 --env-file credentials/oracle-creds.env oracledb-test

Verification - open browser to http://localhost:8081/ and execute following graphql

    query ExampleQuery {
      dogs {
        id
        name
      }
      owners {
        firstname
        lastname
      }
    }

This should work returning some results

Now breaking it by updating to newest oracldb-6.6.0 (or >oracldb-6.4.0) version

sed  -i 's/"oracledb": "6.4.0"/"oracledb": "6.6.0"/' package.json

#building and running the same
docker build -t oracledb-test .
docker run -it --rm -p 8081:8081 --env-file credentials/oracle-creds.env oracledb-test

Now it does not work giving Error: NJS-500: connection to the Oracle Database was broken

Solution: As suggested here patching solves the issue with oracledb-6.6.0

sharadraju commented 1 week ago

Please test it with node-oracledb Thick mode in node-oracledb versions 6.5 and above and let us know if you are able to make the connection.

sudarshan12s commented 1 week ago

@ChaosEngine , Can you please confirm if this patch on node-oracledb 6.6.0 works for you?


diff --git a/lib/thin/connection.js b/lib/thin/connection.js
index 6d9d4f05d..84e2d4f02 100644
--- a/lib/thin/connection.js
+++ b/lib/thin/connection.js
@@ -797,8 +797,11 @@ class ThinConnectionImpl extends ConnectionImpl {
           await this._protocol._processMessage(authMessage);
         }
       } else {
+        const endOfRequestSupport = this.nscon.endOfRequestSupport;
+        this.nscon.endOfRequestSupport = false;
         await this._protocol._processMessage(protocolMessage);
         await this._protocol._processMessage(dataTypeMessage);
+        this.nscon.endOfRequestSupport = endOfRequestSupport;
         await this._protocol._processMessage(authMessage);
       }
       if (!params.token) { // non-token Authentication
sudarshan12s commented 1 week ago

If it does not help, please share console prints after setting the below env:

NODE_ORACLEDB_DEBUG_PACKETS=1

ChaosEngine commented 1 week ago

@ChaosEngine , Can you please confirm if this patch on node-oracledb 6.6.0 works for you?

diff --git a/lib/thin/connection.js b/lib/thin/connection.js
index 6d9d4f05d..84e2d4f02 100644
--- a/lib/thin/connection.js
+++ b/lib/thin/connection.js
@@ -797,8 +797,11 @@ class ThinConnectionImpl extends ConnectionImpl {
           await this._protocol._processMessage(authMessage);
         }
       } else {
+        const endOfRequestSupport = this.nscon.endOfRequestSupport;
+        this.nscon.endOfRequestSupport = false;
         await this._protocol._processMessage(protocolMessage);
         await this._protocol._processMessage(dataTypeMessage);
+        this.nscon.endOfRequestSupport = endOfRequestSupport;
         await this._protocol._processMessage(authMessage);
       }
       if (!params.token) { // non-token Authentication

This patch works both on linux and windows. And with thin driver mode. Thank You. How this will be somehow addressed in next release? Any idea what might be the main culprit?

ChaosEngine commented 1 week ago

Please test it with node-oracledb Thick mode in node-oracledb versions 6.5 and above and let us know if you are able to make the connection.

I'd rather stick thin mode instead unnecessarily bundling instant client inside docker image ;->

sudarshan12s commented 6 days ago

@ChaosEngine , Can you please confirm if this patch on node-oracledb 6.6.0 works for you?

diff --git a/lib/thin/connection.js b/lib/thin/connection.js
index 6d9d4f05d..84e2d4f02 100644
--- a/lib/thin/connection.js
+++ b/lib/thin/connection.js
@@ -797,8 +797,11 @@ class ThinConnectionImpl extends ConnectionImpl {
           await this._protocol._processMessage(authMessage);
         }
       } else {
+        const endOfRequestSupport = this.nscon.endOfRequestSupport;
+        this.nscon.endOfRequestSupport = false;
         await this._protocol._processMessage(protocolMessage);
         await this._protocol._processMessage(dataTypeMessage);
+        this.nscon.endOfRequestSupport = endOfRequestSupport;
         await this._protocol._processMessage(authMessage);
       }
       if (!params.token) { // non-token Authentication

This patch works both on linux and windows. And with thin driver mode. Thank You. How this will be somehow addressed in next release? Any idea what might be the main culprit?

Thanks for checking. Yes the fix is already part of coming release . It was seen with specific setting (disabling fast auth) for few ADBs instances.

sharadraju commented 6 days ago

Please test it with node-oracledb Thick mode in node-oracledb versions 6.5 and above and let us know if you are able to make the connection.

I'd rather stick thin mode instead unnecessarily bundling instant client inside docker image ;->

Since the patch has worked, I guess we do not need to test with Thick mode. We generally request users to test with Thick mode to narrow down the source of the issue to any Thin-mode related changes.