]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb_stat.c
mdb_stat -ff[f]: show contiguous page spans.
[openldap] / libraries / liblmdb / mdb_stat.c
index 13a24f9cbdde5da2c08868eecef25fc80cb33a86..dd0735f24265588c729d8296b5360199cb5e6387 100644 (file)
@@ -1,6 +1,6 @@
 /* mdb_stat.c - memory-mapped database status tool */
 /*
- * Copyright 2011 Howard Chu, Symas Corp.
+ * Copyright 2011-2013 Howard Chu, Symas Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,7 +31,7 @@ static void prstat(MDB_stat *ms)
 
 static void usage(char *prog)
 {
-       fprintf(stderr, "usage: %s dbpath [-e] [-f[f]] [-n] [-a|-s subdb]\n", prog);
+       fprintf(stderr, "usage: %s dbpath [-e] [-f[f[f]]] [-n] [-a|-s subdb]\n", prog);
        exit(EXIT_FAILURE);
 }
 
@@ -142,12 +142,28 @@ int main(int argc, char *argv[])
                        iptr = data.mv_data;
                        pages += *iptr;
                        if (freinfo > 1) {
-                               size_t i, j;
+                               char *bad = "";
+                               size_t pg, prev;
+                               ssize_t i, j, span = 0;
                                j = *iptr++;
-                               printf("    Transaction %zu, %zu pages\n",
-                                       *(size_t *)key.mv_data, j);
-                               for (i=0; i<j; i++)
-                                       printf("      %zu\n", iptr[i]);
+                               for (i = j, prev = 1; --i >= 0; ) {
+                                       pg = iptr[i];
+                                       if (pg <= prev)
+                                               bad = " [bad sequence]";
+                                       prev = pg;
+                                       pg += span;
+                                       for (; i >= span && iptr[i-span] == pg; span++, pg++) ;
+                               }
+                               printf("    Transaction %zu, %zd pages, maxspan %zd%s\n",
+                                       *(size_t *)key.mv_data, j, span, bad);
+                               if (freinfo > 2) {
+                                       for (--j; j >= 0; ) {
+                                               pg = iptr[j];
+                                               for (span=1; --j >= 0 && iptr[j] == pg+span; span++) ;
+                                               printf(span>1 ? "     %9zu[%zd]\n" : "     %9zu\n",
+                                                       pg, span);
+                                       }
+                               }
                        }
                }
                mdb_cursor_close(cursor);