Anshul Goyal
Anshul Goyal

Reputation: 139

Facing TLS write failed: -2 issue while writing to aerospike

I have aerospike 6.0.0 installed on server and being used as cache. Also I am using Node.js client 5.2.0 to connect to the database.The aerospike nodes are configured to use TLS. The config of the namespace I am using is:

namespace application_cache {
        memory-size 5G
        replication-factor 2
        default-ttl 1h
        nsup-period 1h
        high-water-memory-pct 80
        stop-writes-pct 90
        storage-engine memory 
        }

The config I am passing while connecting to the Db is:

"config": {
      "captureStackTraces":true,
      "connTimeoutMs": 10000,
      "maxConnsPerNode": 1000,
      "maxCommandsInQueue" : 300,
      "maxCommandsInProcess" : 100,
      "user": "test",
      "password": "test",
      "policies": {
        "read": {
          "maxRetries": 3,
          "totalTimeout": 0,
          "socketTimeout": 0
        },
        "write": {
          "maxRetries": 3,
          "totalTimeout": 0,
          "socketTimeout": 0
        },
        "info": {
          "timeout": 10000
        }
      },
      "tls": {
        "enable": true,
        "cafile": "./certs/ca.crt",
        "keyfile": "./certs/server.key",
        "certfile": "./certs/server.crt"
      },
      "hosts": [
        {
          "addr": "-----.com",
          "port": 4333,
          "tlsname": "----"
        },
        {
          "addr": "---.com",
          "port": 4333,
          "tlsname": "-----"
        },
        {
          "addr": "----.com",
          "port": 4333,
          "tlsname": "-----"
        }
      ]
    }

This is the function I am using to write to a set in this namespace:

async function updateApp(appKey, bins) {
     let result = {};
     try {
         const writePolicy = new Aerospike.WritePolicy({
             maxRetries: 3,
             socketTimeout: 0,
             totalTimeout: 0,
             exists: Aerospike.policy.exists.CREATE_OR_UPDATE,
             key: Aerospike.policy.key.SEND
         });
         const key = new Aerospike.Key(namespace, set, appKey);
         let meta = {
            ttl: 3600
         };
         let bins = {};

         result = await asc.put(key, bins, meta, writePolicy);
     } catch (err) {
         console.error("Aerospike Error:", JSON.stringify({params: {namespace, set, appKey}, err: {code: err.code, message: err.message}}));
         return err;
     }
     return result;
 }

It works most of the time but once in a while I get this error:

Aerospike Error: {"params":{"namespace":"application_cache","set":"apps","packageName":"com.test.application"},"err":{"code":-6,"message":"TLS write failed: -2 34D53CA5C4E0734F 10.57.49.180:4333"}}

Every record in this set has about 12-15 bins and the size of the record varies between 300Kb to 1.5Mb. The bigger the size of the record the higher chance of this error showing up. Has anyone faced this issue before and what could be causing this?

Upvotes: 2

Views: 116

Answers (1)

aanderson
aanderson

Reputation: 103

I answered this on the community forum but figured I'd add it here as well.

Looking at the server error codes a code: 6 is AS_ERR_BIN_EXISTS. Your write policy is setup with exists: Aerospike.policy.exists.CREATE_OR_UPDATE but the options for exists are:

Name Description
IGNORE Write the record, regardless of existence. (I.e. create or update.)
CREATE Create a record, ONLY if it doesn't exist.
UPDATE Update a record, ONLY if it exists.
REPLACE Completely replace a record, ONLY if it exists.
CREATE_OR_REPLACE Completely replace a record if it exists, otherwise create it.

My guess is that it's somehow defaulting to a CREATE only causing it to throw that error. Try updating your write policy to use exists: Aerospike.policy.exists.IGNORE and see if you still get that error.

Upvotes: 5

Related Questions