Friday, 11 April 2025

RPO

Filled under:

 var patroniSwitchoverAutomation = {

  checkReplicationLag: function(replicaList, clusterName, maxWaitTime = 30) {

    var lagCleared = true;

    var waitInterval = 10000; // 10 seconds

    var attempts = 0;


    while (attempts < maxWaitTime) {

      lagCleared = true;


      for (var i = 0; i < replicaList.length; i++) {

        var ip = replicaList[i];

        var cmd = "/usr/local/bin/patronictl -d etcd://127.0.0.1:2379 list " + clusterName + " | grep " + ip;

        var stdout = js_lib.prevStateOut(); // to get previous command state if needed

        var result = system.exec(cmd); // assumes Amelia has `system.exec()` equivalent


        if (!result || result.exitCode !== 0) {

          console.log("Error executing command for IP: " + ip);

          lagCleared = false;

          break;

        }


        var lagLine = result.stdout.trim();

        var lag = lagLine.split(/\s+/).pop(); // get last column


        console.log("Lag for replica " + ip + " is: " + lag);

        if (parseInt(lag) > 0) {

          lagCleared = false;

          break;

        }

      }


      if (lagCleared) {

        console.log("All replicas are in sync. Proceeding...");

        break;

      } else {

        console.log("Replica(s) still lagging. Waiting 10 seconds...");

        attempts++;

        system.sleep(waitInterval); // if Amelia has sleep

      }

    }


    if (!lagCleared) {

      throw new Error("Timeout: Lag not cleared in replicas after " + maxWaitTime + " attempts.");

    }

  },


  performSwitchover: function(clusterName, leaderName) {

    var cmd = "/usr/local/bin/patronictl switchover --force -d etcd://127.0.0.1:2379 --cluster " + clusterName + " --leader " + leaderName;

    var result = system.exec(cmd);

    if (result.exitCode !== 0) {

      throw new Error("Switchover failed: " + result.stderr);

    }

    console.log("Switchover completed successfully: " + result.stdout);

  }

};


0 comments:

Post a Comment