Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

nodetool pausehandoff

Pauses the delivery of hints to recovering nodes.


Terminal window
nodetool [connection_options] pausehandoff

See connection options for connection options.

nodetool pausehandoff temporarily stops the delivery of stored hints to their target nodes. Unlike disablehandoff, this command does not prevent new hints from being stored—it only pauses the replay of existing hints.

This is useful when hint delivery is causing performance issues on recovering nodes or when controlled hint replay timing is needed.

Pause vs Disable

  • pausehandoff: Stops hint delivery only. New hints continue to be stored.
  • disablehandoff: Stops both hint storage AND delivery.

When hint delivery is paused:

  1. New hints continue to be stored for unavailable replicas
  2. Existing hints are NOT delivered to recovered nodes
  3. Hints accumulate until delivery is resumed
  4. Hint expiration continues (hints may expire before delivery)
FeatureStatus
New hint storageContinues normally
GossipContinues normally
WritesContinue normally
Read repairsContinue normally
FeatureStatus
Hint deliveryPaused
Automatic consistency restorationSuspended
Hint replay to recovered nodesStopped

Terminal window
nodetool pausehandoff
Terminal window
nodetool pausehandoff
# Check hint delivery threads
nodetool tpstats | grep -i hint

When a recovering node is overwhelmed by hint replay:

Terminal window
# 1. Pause hint delivery
nodetool pausehandoff
# 2. Let the node stabilize
# Monitor: nodetool tpstats
# 3. Resume when ready
nodetool resumehandoff

When needing to control when hints are delivered:

Terminal window
# Pause during peak hours
nodetool pausehandoff
# Resume during maintenance window
# (later)
nodetool resumehandoff

When investigating hint-related performance issues:

Terminal window
# 1. Check hint delivery activity
nodetool tpstats | grep -i hint
# 2. Pause if hint delivery is causing issues
nodetool pausehandoff
# 3. Investigate
nodetool listpendinghints
# 4. Resume when resolved
nodetool resumehandoff

Prevent hint delivery to a node under maintenance:

Terminal window
# On coordinator nodes, pause hint delivery
nodetool pausehandoff
# Perform maintenance on target node
# ...
# Resume after maintenance
nodetool resumehandoff

AspectImpact
Hint deliveryStops immediately
Coordinator loadMay increase (hints accumulate)
Target node loadDecreases (no hint replay)
Disk usageHints continue accumulating
ScenarioWith DeliveryWith Paused Delivery
Node recoversHints replayed immediatelyHints queued, not delivered
Multiple writesConsistency restored quicklyConsistency delayed
Hint expirationNormalHints may expire before delivery

Hint Expiration Risk

While delivery is paused, hints continue to age. If paused too long, hints may expire (default: 3 hours) and be lost. Run repair to restore consistency if hints expire.


controlled_hint_delivery.sh
#!/bin/bash
echo "=== Controlled Hint Delivery ==="
# 1. Check current hint status
echo "1. Current pending hints:"
nodetool listpendinghints
# 2. Pause delivery
echo ""
echo "2. Pausing hint delivery..."
nodetool pausehandoff
# 3. Verify paused
echo ""
echo "3. Hint thread activity (should show no active delivery):"
nodetool tpstats | grep -i hint
# 4. Wait for user confirmation
echo ""
read -p "Press Enter to resume hint delivery..."
# 5. Resume delivery
echo ""
echo "5. Resuming hint delivery..."
nodetool resumehandoff
# 6. Monitor delivery
echo ""
echo "6. Monitoring hint delivery:"
watch -n 2 'nodetool tpstats | grep -i hint'

Terminal window
# Check pending hints periodically
watch -n 60 'nodetool listpendinghints'
Terminal window
# Track disk usage by hints (hints stored as files)
watch -n 60 'du -sh /var/lib/cassandra/hints/'
#!/bin/bash
# Monitor hint accumulation while paused
echo "=== Hint Status (Delivery Paused) ==="
# Pending hints
echo "Pending hints by target:"
nodetool listpendinghints
# Hints directory size
echo ""
echo "Hints directory size:"
du -sh /var/lib/cassandra/hints/
# Warn about expiration
echo ""
hint_window=$(grep "max_hint_window_in_ms" /etc/cassandra/cassandra.yaml 2>/dev/null | awk '{print $2}')
if [ -n "$hint_window" ]; then
hours=$((hint_window / 3600000))
echo "Hint window: ${hours} hours"
echo "WARNING: Hints older than ${hours} hours will expire!"
fi

Cause: Hints expire while delivery is paused

Mitigation:

Terminal window
# Track pause duration
echo "Paused at: $(date)" >> /var/log/cassandra/hint_pause.log
# Set a reminder to resume
echo "nodetool resumehandoff" | at now + 2 hours
# After resuming, check if hints expired and run repair if needed
nodetool resumehandoff
nodetool repair -pr

Cause: Hints accumulate while paused

Mitigation:

Terminal window
# Monitor disk usage
df -h /var/lib/cassandra
# If critical, may need to truncate hints
nodetool truncatehints
# Then run repair to restore consistency
nodetool repair -pr

Symptom: Recovered nodes remain inconsistent

Mitigation:

check_hint_delivery.sh
# Include in monitoring
#!/bin/bash
active=$(nodetool tpstats 2>/dev/null | grep "HintedHandoff" | awk '{print $2}')
pending=$(nodetool listpendinghints 2>/dev/null | tail -n +2 | awk '{sum+=$2} END {print sum}')
if [ "$pending" -gt 0 ] && [ "$active" -eq 0 ]; then
echo "WARNING: Hints pending but delivery may be paused!"
echo "Pending hints: $pending"
fi

pause_handoff_cluster.sh
#!/bin/bash
echo "Pausing hint delivery cluster-wide..."
# Get list of node IPs from local nodetool status
nodes=$(nodetool status | grep "^UN" | awk '{print $2}')
for node in $nodes; do
echo -n "$node: "
ssh "$node" 'nodetool pausehandoff 2>/dev/null && echo "paused" || echo "FAILED"'
done
echo ""
echo "Verification (hint thread activity):"
for node in $nodes; do
echo "=== $node ==="
ssh "$node" "nodetool tpstats 2>/dev/null | grep -i hint"
done
echo ""
echo "REMEMBER: Resume with 'nodetool resumehandoff' on all nodes"
resume_handoff_cluster.sh
#!/bin/bash
echo "Resuming hint delivery cluster-wide..."
# Get list of node IPs from local nodetool status
nodes=$(nodetool status | grep "^UN" | awk '{print $2}')
for node in $nodes; do
echo -n "$node: "
ssh "$node" 'nodetool resumehandoff 2>/dev/null && echo "resumed" || echo "FAILED"'
done
echo ""
echo "Hint delivery resumed on all nodes."

Terminal window
# Verify pause was successful
nodetool tpstats | grep -i hint
# If still active, retry
nodetool pausehandoff
# Check for multiple coordinators
# Each coordinator node needs to pause separately
Terminal window
# Check JMX connectivity
nodetool info
# Check logs for errors
tail -100 /var/log/cassandra/system.log | grep -i hint
Terminal window
# Check pending hints
nodetool listpendinghints
# Check hints directory size
du -sh /var/lib/cassandra/hints/
# If too many hints, consider:
# 1. Resume delivery to reduce backlog
# 2. Or truncate and repair if hints will expire anyway

Aspectpausehandoffdisablehandoff
New hint storageContinuesStops
Hint deliveryStopsStops
Coordinator disk impactContinues growingStops growing
Recovery without repairYes (resume)No (repair required)
Use caseTemporary reliefEmergency only
  • Recovering node is overwhelmed
  • Need temporary performance relief
  • Plan to resume delivery soon
  • Want to preserve hints for later delivery
  • Disk space emergency on coordinator
  • Node will be down longer than hint window
  • Need to completely stop hint-related activity

Pause Guidelines

  1. Prefer pause over disable - Pause preserves hints for later delivery
  2. Set time limits - Don't leave paused indefinitely (hints expire)
  3. Monitor accumulation - Watch hint count and disk usage while paused
  4. Document the reason - Log why and when you paused
  5. Plan for resume - Know when you'll resume delivery
  6. Consider hint window - Resume before hints start expiring

Pause Duration Limits

The default hint window is 3 hours. If delivery is paused longer than this, hints for down nodes will expire and be lost. Either:

  • Resume delivery before hints expire
  • Plan for repair after resuming
  • Adjust max_hint_window_in_ms if longer pause needed

CommandRelationship
resumehandoffResume hint delivery
enablehandoffEnable hint storage
disablehandoffDisable hint storage and delivery
statushandoffCheck handoff status
listpendinghintsList pending hints
truncatehintsRemove all hints