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

LiveQueryServer crashes when configured to run with Redis cacheAdapter #9432

Open
evtimmy opened this issue Nov 13, 2024 · 2 comments
Open
Labels
type:bug Impaired feature or lacking behavior that is likely assumed

Comments

@evtimmy
Copy link

evtimmy commented Nov 13, 2024

Issue Description

Running ParseLiveQueryServer where a RedisCacheAdapter is also configured causes crash when ParseLiveQueryServer tries to use the cache adapter.

Steps to reproduce

  1. Run parse-server with ParseLiveQueryServer enabled. The cache adapter I configured via config.json like so:
 "cacheAdapter": {
  "module": "../Adapters/Cache/RedisCacheAdapter.js",
  "options": {
    "url": {{ printf "redis://%s-redis-cache-app-server-master:6379" .Release.Name | quote }}
    "password": {{ $redisAppServerCachePassword | quote }}
  }
}
  1. Subscribe a client to listen to a query
  2. Update an object that the query matches

Actual Outcome

error: RedisCacheAdapter error on get {"error":{}}
error: RedisCacheAdapter error on get {"error":{}}
An uncaught exception occurred: The client is closedStack Trace:
Error: The client is closed
at Commander._RedisClient_sendCommand (/parse-server/node_modules/@redis/client/dist/lib/client/index.js:510:31)
at Commander.commandsExecutor (/parse-server/node_modules/@redis/client/dist/lib/client/index.js:190:154)
at BaseClass.<computed> [as set] (/parse-server/node_modules/@redis/client/dist/lib/commander.js:8:29)
at RedisCacheAdapter.put (/parse-server/lib/Adapters/Cache/RedisCacheAdapter.js:85:24)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Expected Outcome

LiveQueryServer post update to client

Environment

Server

  • Parse Server version: 7.4.0-alpha.5
  • Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc): Azure

Client

  • SDK (iOS, Android, JavaScript, PHP, Unity, etc): iOS/Android

Workaround:

disable the redis cache adapter.

Copy link

Thanks for opening this issue!

@evtimmy
Copy link
Author

evtimmy commented Nov 13, 2024

I did debug the initialization of the server and saw that ParseLiveQueryServer creates its own cacheController instance:

this.cacheController = getCacheController(parseServerConfig);

but that instance connect() is never called. The regular ParseServer does call connect() on its own instance of the cache when initializing the startup promises.

This used to work in earlier versions of parse-server, before we switched to redis 4 client as redis 4 requires the async connect() to be explicitly called before using the client, whereas redis 3 automatically called connect() if the client was not connected.

One simple fix would be to add initialization await this.cacheController.connect() here:

async connect() {
if (this.subscriber.isOpen) {
return;
}
if (typeof this.subscriber.connect === 'function') {
await Promise.resolve(this.subscriber.connect());
} else {
this.subscriber.isOpen = true;
}
this._createSubscribers();
}

I'm just not clear on why we check this.subscriber.isOpen and if this connect() may be called multiple times, or only on startup?

@mtrezza mtrezza added the type:bug Impaired feature or lacking behavior that is likely assumed label Nov 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type:bug Impaired feature or lacking behavior that is likely assumed
Projects
None yet
Development

No branches or pull requests

2 participants