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;
}