Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
sivakumar-74 opened this issue Dec 7, 2024 · 0 comments
Labels

Comments

@sivakumar-74
Copy link

sivakumar-74 commented Dec 7, 2024

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: [] }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant