Skip to content

SCAN Command Infinite Loop - Cursor has Non-Zero Value for Empty Keys in the Response #2879

Open
@sivakumar-74

Description

@sivakumar-74

Description

I encountered an infinite loop while using the SCAN command with pattern matching in Redis via AWS ElastiCache.
The issue arises when querying Redis for keys using a pattern (users:*). The loop keeps executing even when no more keys match the given pattern.

Below code to reproduce the issue

async function getActiveUsers(redisClient) {
  const activeUserQueryPattern = `users:*`;
  let cursor = 0;
  let activeUsers = [];

  console.log("Querying Redis for Active Users pattern :: ", activeUserQueryPattern);
  do {
    const userQueryData = await redisClient.scan(cursor, {
      MATCH: activeUserQueryPattern,
      COUNT: 100,
    });
    console.log("User Query Data :: ", userQueryData); 
    activeUsers = activeUsers.concat(userQueryData.keys);
    cursor = userQueryData.cursor;
  } while (cursor !== 0);

  console.log('Active Users :: ', activeUsers);
  return activeUsers;
}

I have fixed with checking keys length for now, but actually the cursor will return with zero, if there is not keys.

async function getActiveUsers(redisClient) {
  const activeUserQueryPattern = `users:*`;
  let keyLen = 1;
  let activeUsers = [];

  console.log("Querying Redis for Active Users pattern :: ", activeUserQueryPattern);
  do {
    const userQueryData = await redisClient.scan(cursor, {
      MATCH: activeUserQueryPattern,
      COUNT: 100,
    });
    console.log("User Query Data :: ", userQueryData); 
    activeUsers = activeUsers.concat(userQueryData.keys);
    keyLen = userQueryData.keys.length;
  } while (keyLen !== 0);

  console.log('Active Users :: ', activeUsers);
  return activeUsers;
}

Node.js Version

node v18.18.0

Redis Server Version

ElasticCache (Redis Version 7.1)

Node Redis Version

4.7.0

Platform

Windows

Logs

2024-12-07T15:33:22.237+05:30
2024-12-07T10:03:22.237Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.247+05:30
2024-12-07T10:03:22.247Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.249+05:30
2024-12-07T10:03:22.249Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.252+05:30
2024-12-07T10:03:22.252Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.255+05:30
2024-12-07T10:03:22.255Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.267+05:30
2024-12-07T10:03:22.267Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.270+05:30
2024-12-07T10:03:22.270Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.272+05:30
2024-12-07T10:03:22.272Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.275+05:30
2024-12-07T10:03:22.275Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.290+05:30
2024-12-07T10:03:22.290Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.292+05:30
2024-12-07T10:03:22.292Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.294+05:30
2024-12-07T10:03:22.294Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.307+05:30
2024-12-07T10:03:22.307Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.310+05:30
2024-12-07T10:03:22.310Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }
2024-12-07T15:33:22.312+05:30
2024-12-07T10:03:22.312Z 1cb6467a-63e1-41ce-8378-b57b1c365069 INFO User Query Data :: { cursor: 9283678325492940000, keys: [] }

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions