redis/node-redis · error · Error

[Proxy] No node with no connections

Error message

[Proxy] No node with no connections

What it means

triggerMigrate requires a node with zero active connections when destination_type === 'new' (a hidden node to migrate slots onto). If every node has at least one connection, nodeWithoutConnections is undefined and this error throws. The source comment notes this also requires the cluster client NOT to use minimizeConnections, otherwise all nodes tend to have connections.

Source

Thrown at packages/test-utils/lib/fault-injector/proxied-fault-injector-cluster.ts:118

    const migratingResult = await this.proxyController.sendToClient(
      connections[sourceNode.id][0],
      sMigratingNotification
    );

    if (!migratingResult.success) {
      throw new Error(
        `[Proxy] Failed to send SMIGRATING notification: ${migratingResult.error}`
      );
    }

    // 2. Simulate maintenance delay
    await setTimeout(2_000);

    const isNewDestination = params.destination_type === "new";

    if (isNewDestination && !nodeWithoutConnections) {
      throw new Error(`[Proxy] No node with no connections`);
    }

    const destinationNode = isNewDestination
      ? nodeWithoutConnections!
      : nodes.at(-1)!; // Get the last node as the destination

    if (!destinationNode) {
      throw new Error(`[Proxy] No destination node`);
    }

    const sMigratedNotification = buildSMigratedNotification([
      {
        targetNode: destinationNode,
        slotRanges: slots,
      },
    ]);

    const migratedResult = await this.proxyController.sendToClient(

View on GitHub (pinned to 90fd0652bc)

Solutions

  1. Ensure at least one cluster node has no active client connections before requesting a 'new' destination (the test must leave a hidden node available)
  2. Use destination_type: 'existing' instead, which targets the last visible node and does not need a connectionless node
  3. Confirm the cluster client is not using minimizeConnections=false connectivity that touches every node

Example fix

// before — no hidden node available
await proxiedFi.triggerAction({
  type: 'migrate',
  parameters: { slot_migration: 'all', destination_type: 'new' }
});
// Error: [Proxy] No node with no connections

// after — use an existing destination instead
await proxiedFi.triggerAction({
  type: 'migrate',
  parameters: { slot_migration: 'all', destination_type: 'existing' }
});
Defensive patterns

Strategy: validation

Validate before calling

async function findConnectionlessNode(proxyController: ProxyController): Promise<ProxyNode | undefined> {
  const [nodes, connections] = await Promise.all([
    proxyController.getNodes(),
    proxyController.getConnections(),
  ]);
  const parsed = nodes.ids.map(parseNodeId);
  return parsed.find(n => {
    const c = connections[n.id];
    return !c || c.length === 0;
  });
}

Type guard

function canMigrateToNew(nodeWithoutConnections: ProxyNode | undefined): nodeWithoutConnections is ProxyNode {
  return nodeWithoutConnections !== undefined;
}

Try / catch

try {
  await proxiedFi.triggerAction({ type: 'migrate', parameters: { destination_type: 'new', slot_migration: 'all' } });
} catch (e) {
  if (e instanceof Error && /No node with no connections/.test(e.message)) {
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling triggerMigrate with destination_type: 'new' when the cluster client has opened connections to every node (e.g., minimizeConnections is false so the client eagerly connects to all masters), leaving no candidate hidden node.

Common situations: Cluster client configured with full connectivity to all nodes; a prior migration left connections on the previously-hidden node; test setup connected the client before triggering the migration.

Related errors


AI-assisted analysis of redis/node-redis@90fd0652bc (2026-08-11). Data as JSON: /api/errors/43735878ae18e007. Report an issue: GitHub.