Changeset: c9e05f679b7a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c9e05f679b7a Modified Files: common/utils/msabaoth.c common/utils/msabaoth.h monetdb5/modules/mal/pcre.c tools/merovingian/ChangeLog.Feb2013 tools/merovingian/client/monetdb.1 tools/merovingian/client/monetdb.c Branch: default Log Message:
Merged from Feb2013 diffs (truncated from 409 to 300 lines): diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c --- a/common/utils/msabaoth.c +++ b/common/utils/msabaoth.c @@ -774,6 +774,7 @@ msab_getUplogInfo(sabuplog *ret, const s memset(ret, 0, sizeof(sabuplog)); ret->minuptime = -1; ret->lastcrash = -1; + ret->laststop = -1; snprintf(log, sizeof(log), "%s/%s", db->path, UPLOGFILE); if ((f = fopen(log, "r")) != NULL) { @@ -800,7 +801,7 @@ msab_getUplogInfo(sabuplog *ret, const s /* successful stop */ ret->stopcntr++; *p = '\0'; - stop = (time_t)atol(data); + ret->laststop = stop = (time_t)atol(data); p = data; i = (int) (stop - start); if (i > ret->maxuptime) @@ -895,13 +896,13 @@ msab_serialise(char **ret, const sabdb * "%s,%s,%d,%d,%s," "%d,%d,%d," "" LLFMT "," LLFMT "," LLFMT "," - "" LLFMT "," LLFMT "," + "" LLFMT "," LLFMT "," LLFMT "," "%d,%f,%f", db->dbname, db->uri ? db->uri : "", db->locked, (int)(db->state), scens, dbu.startcntr, dbu.stopcntr, dbu.crashcntr, (lng)dbu.avguptime, (lng)dbu.maxuptime, (lng)dbu.minuptime, - (lng)dbu.lastcrash, (lng)dbu.laststart, + (lng)dbu.lastcrash, (lng)dbu.laststart, (lng)dbu.laststop, dbu.crashavg1, dbu.crashavg10, dbu.crashavg30); *ret = strdup(buf); @@ -949,11 +950,12 @@ msab_deserialise(sabdb **ret, char *sdb) if (strcmp(lasts, "1") == 0) { /* Protocol 1 was used uptil Oct2012. Since Jul2012 a new state * SABdbStarting was introduced, but not exposed to the client - * in serialise. After Oct2012, the path component was removed + * in serialise. In Feb2013, the path component was removed * and replaced by an URI field. This meant dbname could no * longer be deduced from path, and hence sent separately. * Since the conns property became useless in the light of the - * added uri, it was dropped. + * added uri, it was dropped. On top of this, a laststop + * property was added to the uplog struct. * These four changes were effectuated in protocol 2. When * reading protocol 1, we use the path field to set dbname, but * ignore the path information (and set uri to "<unknown>". The @@ -1095,6 +1097,19 @@ msab_deserialise(sabdb **ret, char *sdb) *p++ = '\0'; u->laststart = (time_t)strtoll(lasts, (char **)NULL, 10); lasts = p; + if (protover != '1') { + if ((p = strchr(p, ',')) == NULL) { + free(u); + snprintf(buf, sizeof(buf), + "string does not contain laststop: %s", lasts); + return(strdup(buf)); + } + *p++ = '\0'; + u->laststop = (time_t)strtoll(lasts, (char **)NULL, 10); + lasts = p; + } else { + u->laststop = -1; + } if ((p = strchr(p, ',')) == NULL) { free(u); snprintf(buf, sizeof(buf), diff --git a/common/utils/msabaoth.h b/common/utils/msabaoth.h --- a/common/utils/msabaoth.h +++ b/common/utils/msabaoth.h @@ -55,6 +55,7 @@ typedef struct Ssabuplog { time_t minuptime; /* shortest uptime when not crashing */ time_t lastcrash; /* time of last crash, -1 if none */ time_t laststart; /* time of last start */ + time_t laststop; /* time of last stop, -1 if running */ int crashavg1; /* if there was a crash in the last start attempt */ double crashavg10; /* average of crashes in the last 10 start attempts */ double crashavg30; /* average of crashes in the last 30 start attempts */ diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -110,10 +110,10 @@ typedef struct RE { } RE; #ifndef HAVE_STRCASESTR -static char * +static const char * strcasestr (const char *haystack, const char *needle) { - char *p, *startn = 0, *np = 0; + const char *p, *np = 0, *startn = 0; for (p = haystack; *p; p++) { if (np) { diff --git a/tools/merovingian/ChangeLog.Feb2013 b/tools/merovingian/ChangeLog.Feb2013 --- a/tools/merovingian/ChangeLog.Feb2013 +++ b/tools/merovingian/ChangeLog.Feb2013 @@ -1,6 +1,10 @@ # ChangeLog file for sql/src/backends/monet5/merovingian # This file is updated with mchangelog +* Fri Nov 30 2012 Fabian Groffen <fab...@monetdb.org> +- monetdb status now uses a more condensed output, to cater for the uris + being shown, and prints how long a database is stopped + * Wed Nov 21 2012 Fabian Groffen <fab...@monetdb.org> - monetdb status now prints the connection uri for each database, when available. The connections and database path properties have diff --git a/tools/merovingian/client/monetdb.1 b/tools/merovingian/client/monetdb.1 --- a/tools/merovingian/client/monetdb.1 +++ b/tools/merovingian/client/monetdb.1 @@ -114,7 +114,15 @@ output. By default a condensed one-line used. This output resembles pretty much the output of various .B xxxstat programs, and is ideal for quickly gaining an overview of the system -state. +state. The output is divided in four columns, +.IR name ", " state ", " health " and " remarks . +The state column contains two characters that identify the state of the +database, based on Booting (starting up), Running, Stopped, Crashed and +Locked (under maintenance). This is followed by the uptime when +running. The health column contains the percentage of successful starts +and stops, followed by the average uptime. The remarks column can +contain arbitrary information about the database state, but usually +contains the URI the database can be connected to. .IP " \-c" The .I \-c diff --git a/tools/merovingian/client/monetdb.c b/tools/merovingian/client/monetdb.c --- a/tools/merovingian/client/monetdb.c +++ b/tools/merovingian/client/monetdb.c @@ -224,6 +224,7 @@ MEROgetStatus(sabdb **ret, char *databas printf("WARNING: failed to parse response from " "monetdbd: %s\n", e); free(e); + swpos--; continue; } if (swpos == swlen) @@ -251,7 +252,7 @@ MEROgetStatus(sabdb **ret, char *databas } static void -printStatus(sabdb *stats, int mode, int twidth) +printStatus(sabdb *stats, int mode, int dbwidth, int uriwidth) { sabuplog uplog; char *e; @@ -264,30 +265,34 @@ printStatus(sabdb *stats, int mode, int if (mode == 1) { /* short one-line (default) mode */ - char *state; + char state = '\0'; + char locked = '\0'; char uptime[12]; char avg[8]; char info[32]; char *dbname; + char *uri; switch (stats->state) { + case SABdbStarting: + state = 'B'; + break; case SABdbRunning: - state = "running"; + state = 'R'; break; case SABdbCrashed: - state = "crashed"; + state = 'C'; break; - case SABdbStarting: case SABdbInactive: - state = "stopped"; + state = 'S'; break; default: - state = "unknown"; + state = ' '; break; } /* override if locked for brevity */ if (stats->locked == 1) - state = "locked "; + locked = 'L'; info[0] = '\0'; if (stats->state == SABdbStarting) { @@ -303,25 +308,40 @@ printStatus(sabdb *stats, int mode, int strftime(info, sizeof(info), "crashed on %Y-%m-%d %H:%M:%S", t); } - if (stats->state != SABdbRunning) { - uptime[0] = '\0'; - } else { - secondsToString(uptime, time(NULL) - uplog.laststart, 3); + switch (stats->state) { + case SABdbRunning: + case SABdbStarting: + secondsToString(uptime, time(NULL) - uplog.laststart, 1); + break; + case SABdbInactive: + if (uplog.laststop != -1) { + secondsToString(uptime, time(NULL) - uplog.laststop, 1); + break; + } /* else fall through */ + default: + uptime[0] = '\0'; + break; } - /* cut too long database names */ - dbname = malloc(sizeof(char) * (twidth + 1)); - abbreviateString(dbname, stats->dbname, twidth); - /* dbname | state | uptime | health */ - secondsToString(avg, uplog.avguptime, 1); - printf("%-*s %s %12s", twidth, - dbname, state, uptime); + /* cut too long names */ + dbname = malloc(sizeof(char) * (dbwidth + 1)); + abbreviateString(dbname, stats->dbname, dbwidth); + uri = malloc(sizeof(char) * (uriwidth + 1)); + abbreviateString(uri, + info[0] != '\0' ? info : stats->uri ? stats->uri : "", + uriwidth); + /* dbname | state | health | uri/crash */ + printf("%-*s %c%c%3s", dbwidth, dbname, + locked ? locked : state, locked ? state : ' ', uptime); free(dbname); - if (uplog.startcntr) - printf(" %3d%%, %3s %s", - 100 - (uplog.crashcntr * 100 / uplog.startcntr), - avg, info[0] != '\0' ? info : stats->uri ? stats->uri : ""); - printf("\n"); + if (uplog.startcntr) { + secondsToString(avg, uplog.avguptime, 1); + printf(" %3d%% %3s", + 100 - (uplog.crashcntr * 100 / uplog.startcntr), avg); + } else { + printf(" "); + } + printf(" %-*s\n", uriwidth, uri); } else if (mode == 2) { /* long mode */ char *state; @@ -387,6 +407,13 @@ printStatus(sabdb *stats, int mode, int sprintf(up, "(unknown)"); } printf(" last start: %s\n", up); + if (uplog.laststop != -1) { + t = localtime(&uplog.laststop); + strftime(up, 32, "%Y-%m-%d %H:%M:%S", t); + } else { + sprintf(up, "(unknown)"); + } + printf(" last stop: %s\n", up); printf(" average of crashes in the last start attempt: %d\n", uplog.crashavg1); printf(" average of crashes in the last 10 start attempts: %.2f\n", @@ -629,9 +656,12 @@ command_status(int argc, char *argv[]) char *e; sabdb *stats; sabdb *orig; + sabdb *prev; + sabdb *neworig = NULL; int t; + int twidth = TERMWIDTH; int dbwidth = 0; - int twidth = TERMWIDTH; + int uriwidth = 0; if (argc == 0) { exit(2); @@ -708,29 +738,9 @@ command_status(int argc, char *argv[]) msab_freeStatus(&orig); orig = stats; } - /* calculate width, BUG: SABdbState selection is only done at - * printing */ - for (stats = orig; stats != NULL; stats = stats->next) { - if ((t = strlen(stats->dbname)) > dbwidth) - dbwidth = t; - } - if (mode == 1 && orig != NULL) { - /* print header for short mode, state -- last crash = 54 chars */ - twidth -= 54; - if (twidth < 6) - twidth = 6; - if (dbwidth < 14) - dbwidth = 14; - if (dbwidth < twidth) - twidth = dbwidth; - printf("%*sname%*s ", _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list