qishibo/AnotherRedisDesktopManager · warning

this.$t('message.delete_failed')

Error message

this.$t('message.delete_failed')

What it means

Application-level toast ('Deletion Failed') when TS.DEL key ts ts resolves with reply <= 0 in KeyContentTimeSeries.vue:377. TS.DEL returns the count of deleted samples; 0 means no sample exists at exactly that timestamp in the closed range [ts, ts]. The command succeeded — the sample is simply absent, usually because it was already deleted or a compaction rule collapsed it.

Source

Thrown at src/components/contents/KeyContentTimeSeries.vue:377

        }).catch((e) => { this.$message.error(e.message); });
      }
    },
    deleteLine(row) {
      this.$confirm(
        this.$t('message.confirm_to_delete_row_data'),
        { type: 'warning' },
      ).then(() => {
        this.client.call('TS.DEL', this.redisKey, row.timestamp, row.timestamp).then((reply) => {
          if (reply > 0) {
            this.$message.success({
              message: this.$t('message.delete_success'),
              duration: 1000,
            });

            this.tsData.splice(this.tsData.indexOf(row), 1);
            this.total--;
          } else {
            this.$message.error({
              message: this.$t('message.delete_failed'),
              duration: 1000,
            });
          }
        }).catch((e) => { this.$message.error(e.message); });
      }).catch(() => {});
    },
  },
  mounted() {
    this.initShow();
  },
};
</script>

<style type="text/css">
  .key-content-series .ts-toolbar .el-form-item {
    margin-bottom: 10px;
  }

View on GitHub (pinned to c149855106)

Solutions

  1. Reload the key view; if the row disappeared, the earlier delete or compaction already handled it
  2. Open the series info dialog and check the compaction rules — source samples may not exist individually
  3. Delete from the refreshed page so row timestamps match stored samples
  4. If a specific sample must go, confirm its exact ts via TS.RANGE key ts ts first

Example fix

// before
this.client.call('TS.DEL', this.redisKey, row.timestamp, row.timestamp).then((reply) => {
  if (reply > 0) { /* success */ } else { this.$message.error(this.$t('message.delete_failed')); }
});

// after: verify existence first and refresh the stale row instead of erroring
this.client.call('TS.RANGE', this.redisKey, row.timestamp, row.timestamp, 'COUNT', 1).then((found) => {
  if (!found || !found.length) {
    this.tsData.splice(this.tsData.indexOf(row), 1);
    return this.$message.warning(this.$t('message.delete_failed'));
  }
  return this.client.call('TS.DEL', this.redisKey, row.timestamp, row.timestamp);
});
Defensive patterns

Strategy: validation

Validate before calling

// confirm the sample exists at exactly that ts before TS.DEL ts ts
const found = await this.client.call('TS.RANGE', this.redisKey, row.timestamp, row.timestamp, 'COUNT', 1);
if (!found || !found.length) {
  this.tsData.splice(this.tsData.indexOf(row), 1); // drop the stale row
  this.$message.warning(this.$t('message.delete_failed'));
  return;
}
await this.client.call('TS.DEL', this.redisKey, row.timestamp, row.timestamp);

Prevention

When it happens

Trigger: TS.DEL returns 0 when: the row is stale — another operator or the app itself already removed the sample; a compaction rule (TS.CREATERULE, shown in the key's info as 'rules') aggregated 1h-max style buckets so raw samples were dropped; retention expired the sample; the timestamp cell was edited to a ts that never existed.

Common situations: Deleting rows in a series with downsampling rules configured (source samples compacted away); double-delete from a stale page; editing the timestamp then deleting; clock-precision mismatches (sample stored at different ms).

Related errors


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