Redis issue on module-redis-fork

461 views Asked by At

Issue

Hi everyone,

I have an issue while trying to interact with Redis in those conditions:

  1. Redis instance with Redisearch module,
  2. Create node-redis client before Redis module fork is ongoing,
  3. Redis module fork is on-going

The behaviour that I get is that "send_command" stays idle until the fork stops. When the fork ends I get this error:

debug mode ->

Redis connection is gone from end event

client error ->

AbortError: Redis connection lost and command aborted. It might have been processed.

After I get this error the commands from the same client (without creating a new client) come back to works fine.

On every fork, I got the same behaviour.

Additional Info:

keys: 37773168,
used_memory_human: '87.31G'

Code Example:

This is a simple express app,

'use strict';
const express = require('express');
const Redis = require('redis');
// Redis.debug_mode = true;
const router = express.Router();

let client = null;

router.get('/redisearch/connect', async (req, res, next) => {
    const conf = {
        'host': '127.0.0.1',
        'port': 6379,
        'db': 0,
    };

    try {
        if (!client) client = Redis.createClient(conf.port, conf.host, { db: conf.db });
        res.send('Connected');
    } catch (err) {
        res.send(err);
    }
});

router.get('/redisearch/d', async (req, res, next) => {
    const num = 10;
    const dArgs = ['testIndexName', `@ic:[${num} ${num}]`, 'GROUPBY', 1, '@d'];

    try {
        client.send_command('FT.AGGREGATE', dArgs, (err, reply) => {
            if (err) {
                res.send({ err: err });
            };
            res.send({ d: reply });
        });
    } catch (err) {
        res.send(err);
    }
});

module.exports = router;

this is the simplest way I have to replicate the problem.

I don't know if there is a way to force redis to use the fork, in my case it appears following a massive search on index followed by delete and insert of records.

Redis however during these operations (insert/delete) works normally, I can launch commands from the redis-cli;

By creating a new instance of the node-redis client while the fork is present everything works normally and when the fork goes away everything keep working.

Environment

  • Node.js Version: v14.15.1
  • Redis Version: 6.0.4
  • redisearch Version: 1.6.15
  • node-redis Version: 3.2
  • Platform: Server 128GB RAM, 8 Core, Debian
0

There are 0 answers