Skip to content
LinkState
Go back

Partial rollback created a half-upgraded fabric

Introduction to Blameless Reviews

Definition and Purpose

A blameless review is a structured, evidence‑based examination of an operational event that focuses on what happened, why it happened, and how the system can be made more resilient—without assigning fault to individuals. In network change automation, the review captures the full lifecycle of a change: intent, design, pre‑checks, execution, verification, rollback, and post‑change validation. Its purpose is to surface latent weaknesses in tooling, processes, and safeguards so that future changes are safer and more predictable.

Importance in Post‑Rollback Analysis

When a rollback succeeds on some devices but stalls on others, the network ends up in a split operational state—neither the old configuration nor the new one is fully understood or enforced. This condition can produce subtle forwarding anomalies that are difficult to trace, mask underlying bugs, and erode confidence in automation. A blameless review of such an incident provides:


Understanding the Rollback Scenario

Successful Rollback on Some Devices

A scheduled ACL refresh was pushed to 240 edge routers via an Ansible playbook using NETCONF <edit-config> with a confirmed commit (timeout 120 s). After validating the new ACL, a trigger initiated a rollback to the previous ACL version. On 162 devices the rollback completed within the confirmation window, the devices reverted to the pre‑change configuration, and post‑rollback verification (ACL hit‑count checks and traffic‑flow validation) passed.

Key observations

Stalled Rollback on Other Devices

On the remaining 78 devices the rollback did not finish. Symptoms included:

Root‑cause hints from device logs

Split Operational State and Its Implications

SubsetConfiguration StateTraffic ImpactDetection
Successful rollback (162)Running = baseline ACLNo impactVerification passed
Stalled rollback (78)Running = baseline ACL plus stray new‑ACL fragments; Candidate = new ACLIntermittent drops, ACL‑log spikesSNMP error counters ↑, syslog “%ACL-4-ACL_LOOKUP_FAIL”
Untouched devices (0)N/AN/AN/A

Because safeguards (e.g., route‑health checks, BGP session monitoring) only looked at aggregate metrics (overall loss < 0.1 %), they failed to flag the per‑device ACL corruption. The split state meant that old safeguards (baseline ACL assumptions) were violated on a subset of devices, while new safeguards (designed for the post‑change ACL) were not fully active, leaving a gap in both detection and mitigation.


Identifying Key Factors for Blameless Review

Technical Factors

Device and Network Configuration

Rollback Mechanism and Tools

Safeguards and Monitoring Systems

Organizational Factors

Communication and Coordination

Change Management Processes

Training and Expertise


Conducting the Blameless Review

Gathering Information and Data

Log Analysis and Error Messages

Network and Device Performance Metrics

User and Administrator Feedback

Analyzing the Data and Identifying Patterns

Correlating Success and Failure Factors

Identifying Bottlenecks and Single Points of Failure

Assessing Safeguard Effectiveness


Troubleshooting the Rollback Issues

Debugging Techniques and Tools

Using CLI Commands for Troubleshooting

# Verify the state of the candidate vs running datastore
show configuration commit pending          # lists uncommitted changes
show configuration | match access-list   # current running ACL
show configuration datastore candidate | match access-list  # candidate ACL

# Check NETCONF session status
show netconf sessions detail | include <session-id>

# Force a discard of the candidate datastore (if supported)
netconf console --host <device> --username admin --password <pwd> \
    --rpc '<discard-changes/>'

# Validate ACL syntax after manual fix
show ip access-list <name> | include remark

These commands allow an operator to confirm whether a device is stuck in a confirmed‑commit state, view the divergent configurations, and manually issue a discard or commit to resolve the stalemate.

Analyzing Network Traffic and Device Logs

Code Examples for Automated Rollback and Monitoring

Scripting Rollback Processes (Ansible + NETCONF)

---
- name: Rollback ACL with safety checks
  hosts: edge_routers
  gather_facts: false
  vars:
    acl_baseline: "{{ lookup('file', 'acls/baseline.cfg') }}"
    confirm_timeout: 120
  tasks:
    - name: Ensure no pending commit
      iosxr_netconf:
        host: "{{ inventory_hostname }}"
        username: "{{ netconf_user }}"
        password: "{{ netconf_pass }}"
        rpc: "<get><configuration><commit><pending/></commit></configuration></get>"
      register: pending
      failed_when: pending.xml is search('<pending>')   # abort if pending changes exist

    - name: Load baseline configuration (candidate)
      iosxr_netconf:
        host: "{{ inventory_hostname }}"
        username: "{{ netconf_user }}"
        password: "{{ netconf_pass }}"
        config: "{{ acl_baseline }}"
        format: text
        operation: replace   # replace candidate datastore

    - name: Issue confirmed commit
      iosxr_netconf:
        host: "{{ inventory_hostname }}"
        username: "{{ netconf_user }}"
        password: "{{ netconf_pass }}"
        rpc: "<commit><confirmed><timeout>{{ confirm_timeout }}</timeout></confirmed></commit>"
      register: commit_result
      # Additional verification tasks would follow here

This playbook adds a pre‑check for pending changes, loads the baseline into the candidate datastore, and issues a confirmed commit with a configurable timeout.

Enhanced Verification Gate (Python‑like pseudocode)

def verify_acl_consistency(device):
    running = device.running_config.get('access-list')
    candidate = device.candidate_config.get('access-list')
    if running != candidate:
        raise Alarm("ACL mismatch between running and candidate datastores on %s" % device.hostname)
    # Optional: compute hash and compare to baseline
    if hash(running) != BASELINE_HASH:
        raise Alarm("Running ACL does not match baseline on %s" % device.hostname)

This gate checks both datastores, preventing the false‑positive scenario observed in the incident.


End of review.


Share this post on:

Previous Post
Did the counter reset, wrap, or the box reboot
Next Post
Heartbeat tuning without drowning downstream storage