class RdbCache *getDiskPageCache ( char rdbId ) { RdbCache *rpc = NULL; int64_t *maxSizePtr = NULL; int64_t maxMem; int64_t maxRecs; char *dbname; if ( rdbId == RDB_POSDB ) { rpc = &g_rdbCaches[0]; maxSizePtr = &g_conf.m_posdbFileCacheSize; maxMem = *maxSizePtr; maxRecs = maxMem / 5000; dbname = "posdbcache"; } if ( rdbId == RDB_TAGDB ) { rpc = &g_rdbCaches[1]; maxSizePtr = &g_conf.m_tagdbFileCacheSize; maxMem = *maxSizePtr; maxRecs = maxMem / 200; dbname = "tagdbcache"; } if ( rdbId == RDB_CLUSTERDB ) { rpc = &g_rdbCaches[2]; maxSizePtr = &g_conf.m_clusterdbFileCacheSize; maxMem = *maxSizePtr; maxRecs = maxMem / 32; dbname = "clustcache"; } if ( rdbId == RDB_TITLEDB ) { rpc = &g_rdbCaches[3]; maxSizePtr = &g_conf.m_titledbFileCacheSize; maxMem = *maxSizePtr; maxRecs = maxMem / 3000; dbname = "titdbcache"; } if ( rdbId == RDB_SPIDERDB ) { rpc = &g_rdbCaches[4]; maxSizePtr = &g_conf.m_spiderdbFileCacheSize; maxMem = *maxSizePtr; maxRecs = maxMem / 3000; dbname = "spdbcache"; } if ( ! rpc ) return NULL; if ( maxMem < 0 ) maxMem = 0; // did size change? if not, return it if ( rpc->m_maxMem == maxMem ) return rpc; // re-init or init for the first time here if ( ! rpc->init ( maxMem , -1 , // fixedDataSize. -1 since we are lists false , // support lists? maxRecs , false , // use half keys? dbname , false , // loadfromdisk sizeof(key192_t), // cache key size 0 , // data key size -1 ) ) // numptrsmax return NULL; return rpc; }
// . sets m_errno to g_errno if not already set void Msg51::gotClusterRec(Slot *slot) { // count it m_numReplies++; // free up slot->m_inUse = false; RdbList *list = slot->m_msg0.m_list; // update m_errno if we had an error if ( ! m_errno ) m_errno = g_errno; if ( g_errno ) // print error log(LOG_DEBUG, "query: Had error getting cluster info got docId=d: " "%s.",mstrerror(g_errno)); // this doubles as a ptr to a cluster rec int32_t ci = slot->m_ci; // get docid int64_t docId = m_docIds[ci]; // assume error! m_clusterLevels[ci] = CR_ERROR_CLUSTERDB; // bail on error if ( g_errno || list->getListSize() < 12 ) { //log(LOG_DEBUG, // "build: clusterdb rec for d=%" PRId64" dptr=%" PRIu32" " // "not found. where is it?", docId, (int32_t)ci); g_errno = 0; return; } // . steal rec from this multicast // . point to cluster rec, a int32_t key96_t *rec = &m_clusterRecs[ci]; // store the cluster rec itself *rec = *(key96_t *)(list->getList()); // debug note log(LOG_DEBUG, "build: had clusterdb SUCCESS for d=%" PRId64" dptr=%" PRIu32" " "rec.n1=%" PRIx32",%016" PRIx64" sitehash26=0x%" PRIx32".", (int64_t)docId, (int32_t)ci, rec->n1,rec->n0, g_clusterdb.getSiteHash26((char *)rec)); // check for docid mismatch int64_t docId2 = g_clusterdb.getDocId ( rec ); if ( docId != docId2 ) { logf(LOG_DEBUG,"query: docid mismatch in clusterdb."); return; } // it is legit, set to CR_OK m_clusterLevels[ci] = CR_OK; // . init the quick cache // . use 100k if ( ! s_cacheInit && s_clusterdbQuickCache.init(200*1024 , // maxMem sizeof(key96_t) , // fixedDataSize (clusterdb rec) false , // support lists 10000 , // max recs false , // use half keys? "clusterdbQuickCache" , false , // load from disk? sizeof(key96_t) , // cache key size sizeof(key96_t) )) // cache key size // only init once if successful s_cacheInit = true; // debug msg //logf(LOG_DEBUG,"query: msg51 addRec k.n0=%" PRIu64" rec.n0=%" PRIu64,docId, // rec->n0); // . add the record to our quick cache as a int64_t // . ignore any error if ( s_cacheInit ) s_clusterdbQuickCache.addRecord(m_collnum, (key96_t)docId, // docid is key (char *)rec, sizeof(key96_t), // recSize 0); // clear it in case the cache set it, we don't care g_errno = 0; }