forked from Mirrors/privacore-open-source-search-engine
fix a couple cores related to deleting collections
in progress. support termlist dump with terms containing colons.
This commit is contained in:
@ -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 );
|
||||
|
35
Msg5.cpp
35
Msg5.cpp
@ -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
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");
|
||||
|
10
main.cpp
10
main.cpp
@ -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 {
|
||||
|
Reference in New Issue
Block a user