1 #include "addPrefetchEnhance.h"
4 extern int numprefetchsites; // Number of prefetch sites
5 extern pfcstats_t *evalPrefetch; //Global array that keeps track of operation mode (ON/OFF) for each prefetch site
6 extern objstr_t *prefetchcache; //Global Prefetch cache
7 extern pthread_mutex_t prefetchcache_mutex; //Mutex to lock Prefetch Cache
8 extern unsigned int myIpAddr;
10 /* This function creates and initializes the
11 * evalPrefetch global array */
12 pfcstats_t *initPrefetchStats() {
14 if((ptr = calloc(numprefetchsites, sizeof(pfcstats_t))) == NULL) {
15 printf("%s() Calloc error in %s at line %d\n", __func__, __FILE__, __LINE__);
19 /* Enable prefetching at the beginning */
20 for(i=0; i<numprefetchsites; i++) {
23 ptr[i].retrycount = RETRYINTERVAL; //N
24 ptr[i].uselesscount = SHUTDOWNINTERVAL; //M
29 int getRetryCount(int siteid) {
30 return evalPrefetch[siteid].retrycount;
33 int getUselessCount(int siteid) {
34 return evalPrefetch[siteid].uselesscount;
37 char getOperationMode(int siteid) {
38 return evalPrefetch[siteid].operMode;
41 /* This function updates counters and mode of operation of a
42 * prefetch site during runtime. When the prefetch call at a site
43 * generates oids that are found/not found in the prefetch cache,
44 * we take action accordingly */
45 void handleDynPrefetching(int numLocal, int ntuples, int siteid) {
46 if(numLocal < ntuples) {
47 /* prefetch not found locally(miss in cache) */
48 evalPrefetch[siteid].operMode = 1;
49 evalPrefetch[siteid].uselesscount = SHUTDOWNINTERVAL;
51 if(getOperationMode(siteid) != 0) {
52 evalPrefetch[siteid].uselesscount--;
53 if(evalPrefetch[siteid].uselesscount <= 0) {
54 evalPrefetch[siteid].operMode = 0;
60 /* This function clears from prefetch cache those
61 * entries that caused a transaction abort */
62 void cleanPCache(thread_data_array_t *tdata) {
63 transrecord_t *rec = tdata->rec;
64 unsigned int size = rec->lookupTable->size;
65 chashlistnode_t *ptr = rec->lookupTable->table;
67 for(i = 0; i < size; i++) {
68 chashlistnode_t *curr = &ptr[i]; //for each entry in the cache lookupTable
72 objheader_t *header1, *header2;
73 if((header1 = mhashSearch(curr->key)) == NULL && ((header2 = prehashSearch(curr->key)) != NULL)) {
74 /* Not found in local machine's object store and found in prefetch cache */
75 /* Remove from prefetch cache */
76 prehashRemove(curr->key);
83 /* This function updates the prefetch cache with
84 * entires from the transaction cache when a
86 * Return -1 on error else returns 0 */
87 int updatePrefetchCache(thread_data_array_t* tdata) {
91 if((retval = copyToCache(tdata->buffer->f.numread, (unsigned int *)(tdata->buffer->objread), tdata, oidType)) != 0) {
92 printf("%s(): Error in copying objects read at %s, %d\n", __func__, __FILE__, __LINE__);
96 if((retval = copyToCache(tdata->buffer->f.nummod, tdata->buffer->oidmod, tdata, oidType)) != 0) {
97 printf("%s(): Error in copying objects read at %s, %d\n", __func__, __FILE__, __LINE__);
103 int copyToCache(int numoid, unsigned int *oidarray, thread_data_array_t *tdata, char oidType) {
105 for (i = 0; i < numoid; i++) {
108 char * objread = (char *) oidarray;
109 oid = *((unsigned int *)(objread+(sizeof(unsigned int)+
110 sizeof(unsigned short))*i));
114 pthread_mutex_lock(&prefetchcache_mutex);
115 objheader_t * header;
116 if((header = (objheader_t *) chashSearch(tdata->rec->lookupTable, oid)) == NULL) {
117 printf("%s() obj %x is no longer in transaction cache at %s , %d\n", __func__, oid,__FILE__, __LINE__);
121 //copy into prefetch cache
123 GETSIZE(size, header);
124 objheader_t * newAddr;
125 if((newAddr = prefetchobjstrAlloc(size + sizeof(objheader_t))) == NULL) {
126 printf("%s(): Error in getting memory from prefetch cache at %s, %d\n", __func__,
128 pthread_mutex_unlock(&prefetchcache_mutex);
131 pthread_mutex_unlock(&prefetchcache_mutex);
132 memcpy(newAddr, header, size+sizeof(objheader_t));
133 //Increment version for every modified object
135 newAddr->version += 1;
136 newAddr->notifylist = NULL;
138 //make an entry in prefetch lookup hashtable
140 if((oldptr = prehashSearch(oid)) != NULL) {
142 prehashInsert(oid, newAddr);
144 prehashInsert(oid, newAddr);