From: drh Date: Wed, 17 Apr 2019 12:29:45 +0000 (+0000) Subject: In the "pgidx" command of the showdb utility, try to identify orphaned pages X-Git-Tag: version-3.29.0~201 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8083ef029f8a298462aa461bebc6a1c1190504f7;p=thirdparty%2Fsqlite.git In the "pgidx" command of the showdb utility, try to identify orphaned pages and show when pages have been zeroed out. FossilOrigin-Name: eed701ef919c70d891727250be6a1b626aeb894c562d221e319ae6d74fc71d3d --- diff --git a/manifest b/manifest index 1e190dc5d1..bae2f7cb9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\simprovement\son\sthe\svariable-length\sinteger\sdecoder:\nsqlite3GetVarint(). -D 2019-04-17T12:07:08.215 +C In\sthe\s"pgidx"\scommand\sof\sthe\sshowdb\sutility,\stry\sto\sidentify\sorphaned\spages\nand\sshow\swhen\spages\shave\sbeen\szeroed\sout. +D 2019-04-17T12:29:45.915 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1768,7 +1768,7 @@ F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c af978d1437562776fa4d94bf0cb772314c464e71ef24134a6e2301564ae60bc2 +F tool/showdb.c b4cd49d8f4df86349a6b41993a3eb5651e18a3f9903b4fbb70d18b66c8a358ca F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 @@ -1818,7 +1818,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7ac500fb5abfe1ad60f2ffdcc8fbe5ccc1c641bbeed53f00940e9ff78788e53d -R abb269365d71bef546a529ae44e4c54c +P 5df2bf62fcd4dfdaa195062dddbd5ce5420bc239b2649ac8f547e0db34e7f0bb +R f4eb9f2a8e78f2d407da5d6c15776852 U drh -Z 80d8752f4698aa123849b705cd651c27 +Z 369a3d8533a731558ce8e524f18f4b7d diff --git a/manifest.uuid b/manifest.uuid index a698b6544c..9dae86999e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5df2bf62fcd4dfdaa195062dddbd5ce5420bc239b2649ac8f547e0db34e7f0bb \ No newline at end of file +eed701ef919c70d891727250be6a1b626aeb894c562d221e319ae6d74fc71d3d \ No newline at end of file diff --git a/tool/showdb.c b/tool/showdb.c index cb6ddabca6..a3301392ab 100644 --- a/tool/showdb.c +++ b/tool/showdb.c @@ -835,9 +835,20 @@ static void page_usage_cell( } } +/* +** True if the memory is all zeros +*/ +static int allZero(unsigned char *a, int n){ + while( n && (a++)[0]==0 ){ n--; } + return n==0; +} + /* -** Describe the usages of a b-tree page +** Describe the usages of a b-tree page. +** +** If parent==0, then this is the root of a btree. If parent<0 then +** this is an orphan page. */ static void page_usage_btree( int pgno, /* Page to describe */ @@ -854,16 +865,32 @@ static void page_usage_btree( if( pgno<=0 || pgno>g.mxPage ) return; a = fileRead((pgno-1)*g.pagesize, g.pagesize); switch( a[hdr] ){ + case 0: { + if( allZero(a, g.pagesize) ){ + zType = "zeroed page"; + }else if( parent<0 ){ + return; + }else{ + zType = "corrupt node"; + } + break; + } case 2: zType = "interior node of index"; break; case 5: zType = "interior node of table"; break; case 10: zType = "leaf of index"; break; case 13: zType = "leaf of table"; break; + default: { + if( parent<0 ) return; + zType = "corrupt node"; + } } - if( parent ){ + if( parent>0 ){ page_usage_msg(pgno, "%s [%s], child %d of page %d", zType, zName, idx, parent); - }else{ + }else if( parent==0 ){ page_usage_msg(pgno, "root %s [%s]", zType, zName); + }else{ + page_usage_msg(pgno, "orphaned %s", zType); } nCell = a[hdr+3]*256 + a[hdr+4]; if( a[hdr]==2 || a[hdr]==5 ){ @@ -988,6 +1015,7 @@ static void page_usage_report(const char *zPrg, const char *zDbName){ /* Print the report and free memory used */ for(i=1; i<=g.mxPage; i++){ + if( zPageUse[i]==0 ) page_usage_btree(i, -1, 0, 0); printf("%5d: %s\n", i, zPageUse[i] ? zPageUse[i] : "???"); sqlite3_free(zPageUse[i]); }