All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jsimpledb.cli.cmd.RaftFallbackStatusCommand Maven / Gradle / Ivy

There is a newer version: 3.6.1
Show newest version

/*
 * Copyright (C) 2015 Archie L. Cobbs. All rights reserved.
 */

package org.jsimpledb.cli.cmd;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.jsimpledb.SessionMode;
import org.jsimpledb.cli.CliSession;
import org.jsimpledb.kv.raft.fallback.FallbackKVDatabase;
import org.jsimpledb.kv.raft.fallback.FallbackTarget;
import org.jsimpledb.util.ParseContext;

@Command(modes = { SessionMode.KEY_VALUE, SessionMode.CORE_API, SessionMode.JSIMPLEDB })
public class RaftFallbackStatusCommand extends AbstractCommand {

    public RaftFallbackStatusCommand() {
        super("raft-fallback-status");
    }

    @Override
    public String getHelpSummary() {
        return "Displays the status of the Raft fallback database";
    }

    @Override
    public CliSession.Action getAction(CliSession session, ParseContext ctx, boolean complete, Map params) {
        return new CliSession.Action() {
            @Override
            public void run(CliSession session) throws Exception {
                if (!(session.getKVDatabase() instanceof FallbackKVDatabase))
                    throw new Exception("key/value store is not Raft fallback");
                RaftFallbackStatusCommand.this.displayStatus(session.getWriter(), (FallbackKVDatabase)session.getKVDatabase());
            }
        };
    }

    private void displayStatus(PrintWriter writer, FallbackKVDatabase db) {

    // TODO show configuration here...

        final List targets = db.getFallbackTargets();
        final Date lastStandaloneActiveTime = db.getLastStandaloneActiveTime();

        // Show configuration
        writer.println();
        writer.println("Configuration");
        writer.println("=============");
        writer.println();
        writer.println(String.format("%15s: %s", "Standalone KV", db.getStandaloneTarget()));
        writer.println(String.format("%15s: %s", "State file", db.getStateFile()));
        writer.println();
        writer.println("Raft Targets");
        writer.println("============");
        writer.println();
        writer.println(String.format("  %5s %-10s %-10s %-9s %-11s %-20.20s %-20.20s %s",
          "Index", "Check Int.", "Tx Timeout", "Min Avail", "Min Unavail", "Merge", "Rejoin", "Description"));
        writer.println(String.format("  %5s %-10s %-10s %-9s %-11s %-20.20s %-20.20s %s",
          "-----", "----------", "----------", "---------", "-----------", "-----", "------", "-----------"));
        for (int i = 0; i < targets.size(); i++) {
            final FallbackTarget target = targets.get(i);
            writer.println(String.format("  %5s %10s %10s %9s %11s %-20.20s %-20.20s %.38s",
              i, target.getCheckInterval() + "ms", target.getTransactionTimeout() + "ms",
              target.getMinAvailableTime() + "ms", target.getMinUnavailableTime() + "ms",
              this.objString(target.getUnavailableMergeStrategy()), this.objString(target.getRejoinMergeStrategy()),
              target));
        }

        // Show status
        writer.println();
        writer.println("Fallback Status");
        writer.println("===============");
        writer.println();
        writer.println(String.format("  %5s %-6s %-9s %-20s %s", "Index", "Active", "Available", "Last Change", "Last Active"));
        writer.println(String.format("  %5s %-6s %-9s %-20s %s", "-----", "------", "---------", "-----------", "-----------"));
        for (int i = -1; i < targets.size(); i++) {
            final FallbackTarget target = i >= 0 ? targets.get(i) : null;
            final boolean active = i == db.getCurrentTargetIndex();
            final boolean available = target == null || target.isAvailable();
            writer.println(String.format("  %3d   %3s    %6s    %-20s %s",
              i, active ? "*" : "", available ? "Yes" : "No ",
              this.date(target != null ? target.getLastChangeTime() : null),
              active ? "Now" : this.date(target != null ? target.getLastActiveTime() : null)));
        }
        writer.println();
    }

    private String date(Date date) {
        if (date == null)
            return "N/A";
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    }

    // Strip package name from default toString() output: "foo.bar.Jam@1234" -> "Jam@1234"
    private String objString(Object obj) {
        return String.valueOf(obj).replaceAll("^(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\.)*"
          + "(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*@)", "$2");
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy