fix a couple cores related to deleting collections

in progress. support termlist dump with terms
containing colons.
This commit is contained in:
Matt Wells
2014-01-29 15:56:07 -08:00
parent 8aef2ba8a0
commit b40f393f4c
6 changed files with 40 additions and 19 deletions

@ -694,9 +694,7 @@ void Collectiondb::deleteSpiderColl ( SpiderColl *sc ) {
// if not currently being accessed nuke it now
if ( ! sc->m_msg5.m_waitingForList &&
! sc->m_msg5.m_waitingForMerge &&
! sc->m_msg5b.m_waitingForList &&
! sc->m_msg5b.m_waitingForMerge &&
! sc->m_msg1.m_mcast.m_inUse ) {
mdelete ( sc, sizeof(SpiderColl),"nukecr2");
delete ( sc );
@ -1492,9 +1490,7 @@ void CollectionRec::reset() {
// if not currently being accessed nuke it now
if ( ! sc->m_msg5.m_waitingForList &&
! sc->m_msg5.m_waitingForMerge &&
! sc->m_msg5b.m_waitingForList &&
! sc->m_msg5b.m_waitingForMerge &&
! sc->m_msg1.m_mcast.m_inUse ) {
mdelete ( sc, sizeof(SpiderColl),"nukecr2");
delete ( sc );

@ -22,7 +22,7 @@ long g_numCorrupt = 0;
Msg5::Msg5() {
m_waitingForList = false;
m_waitingForMerge = false;
//m_waitingForMerge = false;
m_numListPtrs = 0;
m_mergeLists = true;
reset();
@ -34,7 +34,7 @@ Msg5::~Msg5() {
// frees m_treeList
void Msg5::reset() {
if ( m_waitingForList || m_waitingForMerge ) {
if ( m_waitingForList ) { // || m_waitingForMerge ) {
log("disk: Trying to reset a class waiting for a reply.");
// might being doing an urgent exit (mainShutdown(1)) or
// g_process.shutdown(), so do not core here
@ -46,7 +46,6 @@ void Msg5::reset() {
m_prevCount = 0;
//m_prevKey.setMin();
KEYMIN(m_prevKey,MAX_KEY_BYTES);// m_ks); m_ks is invalid
m_waitingForList = false;
// free lists if m_mergeLists was false
for ( long i = 0 ; ! m_mergeLists && i < m_numListPtrs ; i++ )
m_listPtrs[i]->freeList();
@ -204,6 +203,13 @@ bool Msg5::getList ( char rdbId ,
// remember stuff
m_rdbId = rdbId;
m_coll = coll;
m_collnum = g_collectiondb.getCollnum ( coll );
if ( m_collnum < 0 ) {
g_errno = ENOCOLLREC;
return true;
}
m_list = list;
//m_startKey = startKey;
//m_endKey = endKey;
@ -467,7 +473,12 @@ bool Msg5::getList ( char rdbId ,
// timing debug
//log("Msg5:getting list startKey.n1=%lu",m_startKey.n1);
// start the read loop - hopefully, will only loop once
return readList ( );
if ( ! readList ( ) ) return true;
// tell Spider.cpp not to nuke us until we get back!!!
m_waitingForList = true;
// we blocked!!! must call m_callback
return false;
}
// . returns false if blocked, true otherwise
// . sets g_errno on error
@ -726,7 +737,7 @@ bool Msg5::readList ( ) {
if ( m_treeList.m_ks != m_ks ) { char *xx = NULL; *xx = 0; }
// we are waiting for the list
m_waitingForList = true;
//m_waitingForList = true;
// clear just in case
g_errno = 0;
@ -916,6 +927,8 @@ void gotListWrapper ( void *state ) {
if ( THIS->m_calledCallback ) { char *xx=NULL;*xx=0; }
// set it now
THIS->m_calledCallback = 1;
// we are no longer waiting for the list
THIS->m_waitingForList = false;
// when completely done call the callback
THIS->m_callback ( THIS->m_state , THIS->m_list , THIS );
}
@ -932,7 +945,7 @@ static void *mergeListsWrapper_r ( void *state , ThreadEntry *t ) ;
bool Msg5::gotList ( ) {
// we are no longer waiting for the list
m_waitingForList = false;
//m_waitingForList = false;
// debug msg
//log("msg5 got lists from msg3 (msg5=%lu)",(long)this);
@ -1385,7 +1398,7 @@ bool Msg5::gotList2 ( ) {
// skip it for now
//goto skipThread;
m_waitingForMerge = true;
//m_waitingForMerge = true;
// . if size is big, make a thread
// . let's always make niceness 0 since it wasn't being very
@ -1397,7 +1410,7 @@ bool Msg5::gotList2 ( ) {
mergeListsWrapper_r ) )
return false;
m_waitingForMerge = false;
//m_waitingForMerge = false;
// thread creation failed
if ( g_conf.m_useThreads && ! g_threads.m_disabled )
@ -1454,6 +1467,8 @@ void threadDoneWrapper ( void *state , ThreadEntry *t ) {
if ( THIS->needsRecall() && ! THIS->readList() ) return;
// sanity check
if ( THIS->m_calledCallback ) { char *xx=NULL;*xx=0; }
// we are no longer waiting for the list
THIS->m_waitingForList = false;
// set it now
THIS->m_calledCallback = 3;
// when completely done call the callback
@ -1729,7 +1744,7 @@ void Msg5::mergeLists_r ( ) {
// . we are left with an empty list
bool Msg5::doneMerging ( ) {
m_waitingForMerge = false;
//m_waitingForMerge = false;
// get base, returns NULL and sets g_errno to ENOCOLLREC on error
RdbBase *base; if (!(base=getRdbBase(m_rdbId,m_coll))) return true;
@ -2032,6 +2047,8 @@ void gotRemoteListWrapper( void *state ) { // , RdbList *list ) {
if ( ! THIS->gotRemoteList() ) return;
// sanity check
if ( THIS->m_calledCallback ) { char *xx=NULL;*xx=0; }
// we are no longer waiting for the list
THIS->m_waitingForList = false;
// set it now
THIS->m_calledCallback = 4;
// if it doesn't block call the callback, g_errno may be set

3
Msg5.h

@ -293,7 +293,8 @@ class Msg5 {
bool m_mergeLists;
char m_waitingForList;
char m_waitingForMerge;
//char m_waitingForMerge;
collnum_t m_collnum;
// actually part of a different algo than m_waitingForList!
unsigned long long m_waitingKey;

@ -18231,7 +18231,8 @@ void handleRequest3fLoop ( void *weArg ) {
long oldRound;
if ( we->m_collnum >= 0 && ! cx ) {
cx = g_collectiondb.getRec ( we->m_collnum );
oldRound = cx->m_spiderRoundNum;
// i guess coll might gotten deleted! so check cx
if ( cx ) oldRound = cx->m_spiderRoundNum;
}
// . this returns false if blocked, returns true and sets

@ -2479,7 +2479,6 @@ static void gotSpiderdbListWrapper2( void *state , RdbList *list,Msg5 *msg5) {
// the SpiderColl will have been preserved in that case but its
// m_deleteMyself flag will have been set.
if ( THIS->m_deleteMyself &&
! THIS->m_msg5b.m_waitingForMerge &&
! THIS->m_msg5b.m_waitingForList &&
! THIS->m_msg1.m_mcast.m_inUse ) {
mdelete ( THIS , sizeof(SpiderColl),"postdel1");
@ -2930,9 +2929,7 @@ static void doledWrapper ( void *state ) {
// did collection get nuked while we were waiting for msg1 reply?
if ( THIS->m_deleteMyself &&
! THIS->m_msg5.m_waitingForMerge &&
! THIS->m_msg5.m_waitingForList &&
! THIS->m_msg5b.m_waitingForMerge &&
! THIS->m_msg5b.m_waitingForList ) {
mdelete ( THIS , sizeof(SpiderColl),"postdel1");
delete ( THIS );
@ -3024,7 +3021,6 @@ bool SpiderColl::evalIpLoop ( ) {
// the SpiderColl will have been preserved in that case but its
// m_deleteMyself flag will have been set.
if ( m_deleteMyself &&
! m_msg5b.m_waitingForMerge &&
! m_msg5b.m_waitingForList &&
! m_msg1.m_mcast.m_inUse ) {
mdelete ( this , sizeof(SpiderColl),"postdel1");

@ -2362,7 +2362,17 @@ int main ( int argc , char *argv[] ) {
if ( cmdarg+6 < argc ) {
char *targ = argv[cmdarg+6];
if ( is_alpha_a(targ[0]) ) {
char *colon = strstr(targ,":");
long long prefix64 = 0LL;
if ( colon ) {
*colon = '\0';
prefix64 = hash64n(targ);
targ = colon + 1;
}
// hash the term itself
termId = hash64n(targ);
// hash prefix with termhash
termId = hash64(termId,prefix64);
termId &= TERMID_MASK;
}
else {