added 'verify writes' switch to track down data corruption
This commit is contained in:
parent
d6d5d10a15
commit
d92b153090
@ -11297,7 +11297,7 @@ void Parms::init ( ) {
|
||||
m->m_type = TYPE_BOOL;
|
||||
m->m_def = "0";
|
||||
m->m_group = 0;
|
||||
m->m_flags = PF_HIDDEN | PF_NOSAVE;
|
||||
m->m_flags = 0;//PF_HIDDEN | PF_NOSAVE;
|
||||
m->m_page = PAGE_MASTER;
|
||||
m->m_obj = OBJ_CONF;
|
||||
m++;
|
||||
|
27
RdbDump.cpp
27
RdbDump.cpp
@ -405,12 +405,15 @@ bool RdbDump::dumpTree ( bool recall ) {
|
||||
m_totalNegDumped += m_numNegRecs;
|
||||
// . check the list we got from the tree for problems
|
||||
// . ensures keys are ordered from lowest to highest as well
|
||||
#ifdef GBSANITYCHECK
|
||||
log("dump: verifying list before dumping");
|
||||
m_list->checkList_r ( false , // removeNegRecs?
|
||||
false , // sleep on problem?
|
||||
m_rdb->m_rdbId );
|
||||
#endif
|
||||
//#ifdef GBSANITYCHECK
|
||||
if ( g_conf.m_verifyWrites ) {
|
||||
char *s = "none";
|
||||
if ( m_rdb ) s = getDbnameFromId(m_rdb->m_rdbId);
|
||||
log("dump: verifying list before dumping (rdb=%s)",s);
|
||||
m_list->checkList_r ( false , // removeNegRecs?
|
||||
false , // sleep on problem?
|
||||
m_rdb->m_rdbId );
|
||||
}
|
||||
// if list is empty, we're done!
|
||||
if ( status && m_list->isEmpty() ) {
|
||||
// consider that a rollover?
|
||||
@ -486,15 +489,15 @@ bool RdbDump::dumpList ( RdbList *list , int32_t niceness , bool recall ) {
|
||||
if ( m_list->isEmpty() ) return true;
|
||||
// we're now in dump mode again
|
||||
m_isDumping = true;
|
||||
#ifdef GBSANITYCHECK
|
||||
//#ifdef GBSANITYCHECK
|
||||
// don't check list if we're dumping an unordered list from tree!
|
||||
if ( m_orderedDump ) {
|
||||
if ( g_conf.m_verifyWrites && m_orderedDump ) {
|
||||
m_list->checkList_r ( false /*removedNegRecs?*/ );
|
||||
// print list stats
|
||||
log("dump: sk=%s ",KEYSTR(m_list->m_startKey,m_ks));
|
||||
log("dump: ek=%s ",KEYSTR(m_list->m_endKey,m_ks));
|
||||
}
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
// before calling RdbMap::addList(), always reset list ptr
|
||||
// since we no longer call this in RdbMap::addList() so we don't
|
||||
@ -525,8 +528,10 @@ bool RdbDump::dumpList ( RdbList *list , int32_t niceness , bool recall ) {
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_ks==18 ) {
|
||||
m_list->checkList_r(false,false,RDB_POSDB);
|
||||
if ( g_conf.m_verifyWrites ) {
|
||||
char rdbId = 0;
|
||||
if ( m_rdb ) rdbId = m_rdb->m_rdbId;
|
||||
m_list->checkList_r(false,false,rdbId);//RDB_POSDB);
|
||||
m_list->resetListPtr();
|
||||
}
|
||||
|
||||
|
47
RdbList.cpp
47
RdbList.cpp
@ -693,9 +693,9 @@ bool RdbList::checkList_r ( bool removeNegRecs , bool sleepOnProblem ,
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( m_useHalfKeys && m_ks == 12 ) // m_ks != 18 && m_ks != 24 )
|
||||
return checkIndexList_r ( removeNegRecs ,
|
||||
sleepOnProblem );
|
||||
// if ( m_useHalfKeys && m_ks == 12 ) // m_ks != 18 && m_ks != 24 )
|
||||
// return checkIndexList_r ( removeNegRecs ,
|
||||
// sleepOnProblem );
|
||||
|
||||
//log("m_list=%"INT32"",(int32_t)m_list);
|
||||
//key_t oldk;
|
||||
@ -721,6 +721,10 @@ bool RdbList::checkList_r ( bool removeNegRecs , bool sleepOnProblem ,
|
||||
if ( KEYCMP(acceptable,KEYMIN(),m_ks)==0 )
|
||||
KEYSET ( acceptable , m_endKey , m_ks );
|
||||
char k[MAX_KEY_BYTES];
|
||||
|
||||
static int32_t th = 0;
|
||||
if ( ! th ) th = hash64Lower_a ( "roottitles" , 10 );
|
||||
|
||||
while ( ! isExhausted() ) {
|
||||
//key_t k = getCurrentKey();
|
||||
getCurrentKey( k );
|
||||
@ -734,6 +738,43 @@ bool RdbList::checkList_r ( bool removeNegRecs , bool sleepOnProblem ,
|
||||
*(int32_t *)data > 100000000 ) ) {
|
||||
char *xx = NULL; *xx = 0; }
|
||||
}
|
||||
// tagrec?
|
||||
if ( rdbId == RDB_TAGDB && ! KEYNEG(k) ) {
|
||||
//TagRec *gr = (TagRec *)getCurrentRec();
|
||||
//Tag *tag = gr->getFirstTag ( );
|
||||
//for ( ; tag ; tag = gr->getNextTag ( tag ) ) {
|
||||
Tag *tag = (Tag *)getCurrentRec();
|
||||
if ( tag->m_type == th ) {
|
||||
char *tdata = tag->getTagData();
|
||||
int32_t tsize = tag->getTagDataSize();
|
||||
// core if tag val is not \0 terminated
|
||||
if ( tsize > 0 && tdata[tsize-1]!='\0' ) {
|
||||
log("db: bad root title tag");
|
||||
char *xx=NULL;*xx=0; }
|
||||
}
|
||||
}
|
||||
if ( rdbId == RDB_SPIDERDB && ! KEYNEG(k) &&
|
||||
getCurrentDataSize() > 0 ) {
|
||||
//char *data = getCurrentData();
|
||||
char *rec = getCurrentRec();
|
||||
// bad url in spider request?
|
||||
if ( g_spiderdb.isSpiderRequest ( (key128_t *)rec ) ){
|
||||
SpiderRequest *sr = (SpiderRequest *)rec;
|
||||
if ( strncmp(sr->m_url,"http",4) != 0 ) {
|
||||
log("db: spider req url");
|
||||
char *xx=NULL;*xx=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
// title bad uncompress size?
|
||||
if ( rdbId == RDB_TITLEDB && ! KEYNEG(k) ) {
|
||||
char *rec = getCurrentRec();
|
||||
int32_t usize = *(int32_t *)(rec+12+4);
|
||||
if ( usize <= 0 ) {
|
||||
log("db: bad titlerec uncompress size");
|
||||
char *xx=NULL;*xx=0;
|
||||
}
|
||||
}
|
||||
// debug msg
|
||||
// pause if it's google
|
||||
//if ((((k.n0) >> 1) & 0x0000003fffffffffLL) == 70166155664)
|
||||
|
14
RdbTree.cpp
14
RdbTree.cpp
@ -2495,6 +2495,20 @@ bool RdbTree::fastSave_r() {
|
||||
return log("db: Could not open %s for writing: %s.",
|
||||
s,mstrerror(errno));
|
||||
}
|
||||
|
||||
redo:
|
||||
// verify the tree
|
||||
if ( g_conf.m_verifyWrites ) {
|
||||
log("db: verify writes is enabled, checking tree before "
|
||||
"saving.");
|
||||
if ( ! checkTree( false , true ) ) {
|
||||
log("db: fixing tree and re-checking");
|
||||
fixTree ( );
|
||||
goto redo;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// clear our own errno
|
||||
errno = 0;
|
||||
// . save the header
|
||||
|
Loading…
x
Reference in New Issue
Block a user