qishibo/AnotherRedisDesktopManager · error

e.message

Error message

e.message

What it means

The chunked DEL itself rejected in the non-cluster branch. DEL rarely fails for data reasons; a rejection means the command could not complete: connection lost, NOAUTH/NOPERM, READONLY replica, or a timeout on very large batches. The app routes the raw message to deleteFailed, which also resets the loading flags.

Source

Thrown at src/components/DeleteBatch.vue:162

          // del 5000 keys one time
          if (chunked.length >= 5000) {
            delPromise = this.client.del(chunked);
            chunked = [];
          }
        }

        if (chunked.length) {
          delPromise = this.client.del(chunked);
        }
        // use final promise
        delPromise.then((reply) => {
          if (reply > 0) {
            this.afterDelete();
          } else {
            this.deleteFailed(this.$t('message.delete_failed'));
          }
        }).catch((e) => {
          this.deleteFailed(e.message);
        });
      }

      // cluster, one key per time instead of batch
      else {
        for (let i = 0; i < total; i++) {
          delPromise = this.client.del(keys[i].key);
          delPromise.catch((e) => {});
        }

        // use final promise
        delPromise.then((reply) => {
          if (reply == 1) {
            this.afterDelete();
          } else {
            this.deleteFailed(this.$t('message.delete_failed'));
          }
        }).catch((e) => {

View on GitHub (pinned to c149855106)

Solutions

  1. Reconnect and retry the delete; the scanned list is still available
  2. Verify the target is a writable primary and the user has +del
  3. Reduce the chunk size passed to DEL so single batches stay under timeouts
  4. On repeated failures, fall back to per-key deletes to isolate the bad key

Example fix

// before
delPromise.then((reply) => { /* ... */ }).catch((e) => {
  this.deleteFailed(e.message);
});

// after
delPromise.then((reply) => { /* ... */ }).catch((e) => {
  const m = String(e.message);
  if (/NOPERM/i.test(m)) { this.deleteFailed(this.$t('message.no_permission_del')); }
  else if (/READONLY/i.test(m)) { this.deleteFailed(this.$t('message.readonly_replica')); }
  else { this.deleteFailed(e.message); }
});
Defensive patterns

Strategy: try-catch

Try / catch

.catch((e) => {
  const m = String(e.message);
  if (/NOPERM|no permissions/i.test(m)) { /* ACL: request +del */ }
  else if (/READONLY/i.test(m)) { /* route to primary */ }
  else if (/ECONNRESET|closed/i.test(m)) { /* reconnect and retry once */ }
  else { this.deleteFailed(m); }
})

Prevention

When it happens

Trigger: Connection dropping between scan and delete; batch DEL on a replica with replica-read-only yes; ACL user without del permission; huge chunks hitting server or client timeouts.

Common situations: VPN blips during long cleanup, deleting against read replicas, least-privilege ACL users missing +del, chunk sizes in the thousands.

Related errors


AI-assisted analysis of qishibo/AnotherRedisDesktopManager@c149855106 (2026-08-22). Data as JSON: /api/errors/2fb2cfb9a4d83b66. Report an issue: GitHub.