/**
   * Pretty-formatting for duration.
   *
   * @param ms Millisecond to format.
   * @return Formatted presentation.
   */
  private static String formatDuration(long ms) {
    assert ms >= 0;

    if (ms == 0) return "< 1 ms";

    SB sb = new SB();

    long dd = ms / 1440000; // 1440 mins = 60 mins * 24 hours

    if (dd > 0) sb.a(dd).a(dd == 1 ? " day " : " days ");

    ms %= 1440000;

    long hh = ms / 60000;

    if (hh > 0) sb.a(hh).a(hh == 1 ? " hour " : " hours ");

    long min = ms / 60000;

    if (min > 0) sb.a(min).a(min == 1 ? " min " : " mins ");

    ms %= 60000;

    if (ms > 0) sb.a(ms).a(" ms ");

    return sb.toString().trim();
  }
    /**
     * @param flags Flags.
     * @return String builder containing all flags.
     */
    static String toString(short flags) {
      SB sb = new SB();

      for (Mask m : MASKS) {
        if (m.ordinal() != 0) sb.a('|');

        sb.a(m.name().toLowerCase()).a('=').a(m.bit(flags));
      }

      return sb.toString();
    }
  /**
   * Builds ignite.sh attributes to set up SSH username and password and log directory for started
   * node.
   *
   * @param username SSH user name.
   * @param host Host.
   * @return {@code ignite.sh} script arguments.
   */
  private String buildRemoteLogArguments(String username, String host) {
    assert username != null;
    assert host != null;

    SB sb = new SB();

    sb.a(" -J-D")
        .a(IGNITE_SSH_HOST)
        .a("=\"")
        .a(host)
        .a("\"")
        .a(" -J-D")
        .a(IGNITE_SSH_USER_NAME)
        .a("=\"")
        .a(username)
        .a("\"");

    return sb.toString();
  }