cube-js/cube

Leaking Timeout In LocalQueueDriver

Offen

#4.198 geöffnet am 10.03.2022

 (3 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)Rust (1.965 Forks)batch import
good first issuehelp wanted

Repository-Metriken

Stars
 (19.563 Sterne)
PR-Merge-Metriken
 (PR-Metriken ausstehend)

Beschreibung

Describe the bug The LocalQueueDriver leaks setTimeout in a Promise.race.

To Reproduce Steps to reproduce the behavior:

  1. Set continueWaitTimeout to a high number, 20+ seconds or so.
  2. Make a load request to Cubejs
  3. Call shutdown on the server.
  4. Process runs until timeout ends.

Expected behavior Timeout should be canceled if nothing is awaiting it.

In LocalQueueDriver.js,

 async getResultBlocking(queryKey) {
    const resultListKey = this.resultListKey(queryKey);
    if (!this.queryDef[this.redisHash(queryKey)] && !this.resultPromises[resultListKey]) {
      return null;
    }

    const timeoutPromise = (timeout) => new Promise((resolve) => setTimeout(() => resolve(null), timeout));

    const res = await Promise.race([
      this.getResultPromise(resultListKey),

      // LEAKING TIMEOUT HERE

      timeoutPromise(this.continueWaitTimeout * 1000),
    ]);

    if (res) {
      delete this.resultPromises[resultListKey];
    }
    return res;

** Example Config **

    orchestratorOptions: {
      queryCacheOptions: {
        queueOptions: {
          continueWaitTimeout: 30,
        },
      },
    },

Contributor Guide