// check every second to see if merges are done bool waitForMergeToFinish ( ) { // if registered static bool s_registered = false; if ( s_registered ) { g_loop.unregisterSleepCallback ( NULL , sleepCallback ); s_registered = false; } CollectionRec *cr = g_collectiondb.getRec("qatest123"); if ( ! cr ) { qatest(); return true; } // tight merge the rdb that was dumped long i; for ( i = 0 ; i < RDB_END ; i++ ) { Rdb *rdb = getRdbFromId ( i ); if ( ! rdb ) continue; RdbBase *base = rdb->getBase ( cr->m_collnum ); if ( ! base ) continue; // . force a tight merge as soon as dump completes // . the dump should already be going if ( base->m_nextMergeForced ) return false; // still waiting on this merge break; } // if not still waiting return true if ( i >= RDB_END ) return true; // sleep for 1 second g_loop.registerSleepCallback ( 1000 , // 1000 ms NULL , // state sleepCallback , 0 ); // niceness s_registered = true; return false; }
// once we have triggered the dump this will cause all rdbs to tightmerge void doneDumping ( void *state , TcpSocket *sock ) { CollectionRec *cr = g_collectiondb.getRec("qatest123"); if ( ! cr ) { qatest(); return; } // tight merge the rdb that was dumped for ( long i = 0 ; i < RDB_END ; i++ ) { Rdb *rdb = getRdbFromId ( i ); if ( ! rdb ) continue; RdbBase *base = rdb->getBase ( cr->m_collnum ); if ( ! base ) continue; // . force a tight merge as soon as dump completes // . the dump should already be going base->m_nextMergeForced = true; } // wait for tight merges to complete now qatest(); }
void Syncdb::syncStart_r ( bool amThread ) { // turn this off g_process.m_suspendAutoSave = true; char cmd[1024]; // get synchost best ip char *ips = iptoa ( g_hostdb.getAliveIp ( g_hostdb.m_syncHost ) ); // his dir char *dir = g_hostdb.m_syncHost->m_dir; // use Host *me = g_hostdb.m_myHost; // ours char *mydir = me->m_dir; // generic long err; // loop over every rdb and every data and map file in each rdb for ( long i = 0 ; i < RDB_END ; i++ ) { // skip SYNCDB if ( i == RDB_SYNCDB ) continue; // get that rdb Rdb *rdb = getRdbFromId ( i ); // skip if none if ( ! rdb ) continue; // get coll for ( long j = 0 ; j < rdb->getNumBases() ; j++ ) { // get that base RdbBase *base = rdb->getBase(j);//m_bases[j]; if ( ! base ) continue; // get coll char *coll = base->m_coll; // and num long collnum = base->m_collnum; // make the dir sprintf ( cmd , "ssh %s 'mkdir %scoll.%s.%li'", ips,dir,coll,collnum); // excecute log ( LOG_INFO, "sync: %s", cmd ); //int err = my_system_r ( cmd, 3600*24 ); //if ( err != 0 ) goto hadError; // copy the files for ( long k = 0 ; k < base->m_numFiles ; k++ ) { // sleep while dumping. we are in a thread. if ( base->isDumping() ) sleep ( 1 ); // get map RdbMap *map = base->m_maps[k]; // copy the map file sprintf ( cmd , "rcp %s %s:%scoll.%s.%li/'", map->getFilename(),ips,dir,coll,collnum); log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; // get the file BigFile *f = base->m_files[k]; // loop over each little part file for ( long m = 0 ; m < f->m_numParts ; m++ ) { // get part file File *p = f->m_files[m]; // copy that sprintf ( cmd , "rcp %s %s:%scoll.%s.%li/'", p->m_filename,ips,dir,coll,collnum); // excecute log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; } } } } // make the dirs sprintf ( cmd , "ssh %s '" "mkdir %s/dict/ ;" "mkdir %s/dict/en/ ;" "mkdir %s/ucdata/ ;" "mkdir %s/.antiword/ ;" "'" , ips, dir, dir, dir, dir ); // excecute log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; // loop over the files in Process.cpp for ( long i = 0 ; i < 99999 ; i++ ) { // null means end if ( ! g_files[i] ) break; sprintf ( cmd , "rcp %s%s %s:%s", mydir,g_files[i],ips,dir); // excecute log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; } // new guy is NOT in sync sprintf ( cmd , "ssh %s 'echo 0 > %sinsync.dat", ips,dir); // excecute log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; // saved files sprintf ( cmd , "rcp %s*-saved.dat %s:%sinsync.dat", mydir,ips,dir); // excecute log ( LOG_INFO, "sync: %s", cmd ); if ( ( err = my_system_r ( cmd, 3600*24 ) ) ) goto hadError; // completed! return; hadError: log ( "sync: Call to system(\"%s\") had error %s.",cmd,strerror(err)); g_hostdb.m_syncHost->m_doingSync = 0; g_hostdb.m_syncHost = NULL; return; }