int updatePrefetchCache(trans_req_data_t *tdata) {
int retval;
char oidType;
- oidType = 'R';
- if(tdata->f.numread > 0) {
- if((retval = copyToCache(tdata->f.numread, (unsigned int *)(tdata->objread), oidType)) != 0) {
- printf("%s(): Error in copying objects read at %s, %d\n", __func__, __FILE__, __LINE__);
- return -1;
- }
- }
+ /* TODO commit it for now because objects read
+ * are already copied to cache during remote reading */
+ //oidType = 'R';
+ //if(tdata->f.numread > 0) {
+ // if((retval = copyToCache(tdata->f.numread, (unsigned int *)(tdata->objread), oidType)) != 0) {
+ // printf("%s(): Error in copying objects read at %s, %d\n", __func__, __FILE__, __LINE__);
+ // return -1;
+ // }
+ //}
if(tdata->f.nummod > 0) {
oidType = 'M';
if((retval = copyToCache(tdata->f.nummod, tdata->oidmod, oidType)) != 0) {
#include "clookup.h"
+#define NUMCLIST 250
+typedef struct clist {
+ struct chashlistnode array[NUMCLIST];
+ int num;
+ struct clist *next;
+} cliststruct_t;
+
__thread chashlistnode_t *c_table;
__thread unsigned int c_size;
__thread unsigned int c_mask;
__thread unsigned int c_numelements;
__thread unsigned int c_threshold;
__thread double c_loadfactor;
+__thread cliststruct_t *c_structs;
void t_chashCreate(unsigned int size, double loadfactor) {
chashtable_t *ctable;
c_size = size;
c_threshold=size*loadfactor;
c_mask = (size << 1)-1;
+ c_structs=calloc(1,sizeof(cliststruct_t));
c_numelements = 0; // Initial number of elements in the hash
}
void t_chashInsert(unsigned int key, void *val) {
chashlistnode_t *ptr;
-
if(c_numelements > (c_threshold)) {
//Resize
unsigned int newsize = c_size << 1;
ptr->key=key;
ptr->val=val;
} else { // Insert in the beginning of linked list
- chashlistnode_t * node = calloc(1, sizeof(chashlistnode_t));
+ chashlistnode_t * node;
+ if (c_structs->num<NUMCLIST) {
+ node=&c_structs->array[c_structs->num];
+ c_structs->num++;
+ } else {
+ //get new list
+ cliststruct_t *tcl=calloc(1,sizeof(cliststruct_t));
+ tcl->next=c_structs;
+ c_structs=tcl;
+ node=&tcl->array[0];
+ tcl->num=1;
+ }
node->key = key;
node->val = val;
node->next = ptr->next;
if ((key=curr->key) == 0) { //Exit inner loop if there the first element is 0
break; //key = val =0 for element if not present within the hash table
}
- next = curr->next;
index = (key & mask) >>1;
tmp=&node[index];
+ next = curr->next;
// Insert into the new table
if(tmp->key == 0) {
- tmp->key = curr->key;
+ tmp->key = key;
tmp->val = curr->val;
- if (!isfirst) {
- free(curr);
- }
}/*
NOTE: Add this case if you change this...
This case currently never happens because of the way things rehash....
//Delete the entire hash table
void t_chashDelete() {
- int i;
- chashlistnode_t *ptr = c_table;
-
- for(i=0 ; i<c_size ; i++) {
- chashlistnode_t * curr = ptr[i].next;
- while(curr!=NULL) {
- chashlistnode_t * next = curr->next;
- free(curr);
- curr=next;
- }
+ cliststruct_t *ptr=c_structs;
+ while(ptr!=NULL) {
+ cliststruct_t *next=ptr->next;
+ free(ptr);
+ ptr=next;
}
- free(ptr);
+ free(c_table);
c_table=NULL;
+ c_structs=NULL;
}
#include <signal.h>
#include "plookup.h"
#include "dsmdebug.h"
+#include "readstruct.h"
#ifdef ABORTREADERS
#include <setjmp.h>
#endif
typedef struct objheader {
threadlist_t *notifylist;
unsigned short version;
- unsigned short rcount;
- char isBackup;
+ //unsigned short rcount;
+ short isBackup;
} objheader_t;
#define OID(x) \
extern int nchashSearch;
extern int nmhashSearch;
extern int nprehashSearch;
+extern int ndirtyCacheObj;
extern int nRemoteSend;
extern int nSoftAbort;
extern int bytesSent;
fprintf(fp, "nchashSearch = %d\n", nchashSearch);
fprintf(fp, "nmhashSearch = %d\n", nmhashSearch);
fprintf(fp, "nprehashSearch = %d\n", nprehashSearch);
+ fprintf(fp, "ndirtyCacheObj = %d\n", ndirtyCacheObj);
fprintf(fp, "nRemoteReadSend = %d\n", nRemoteSend);
fprintf(fp, "nSoftAbort = %d\n", nSoftAbort);
fprintf(fp, "bytesSent = %d\n", bytesSent);
*/
void transStatsHandler(int sig, siginfo_t* info, void *context) {
-#ifdef RECOVERYSTATS
- fflush(stdout);
-#endif
-
#ifdef TRANSSTATS
printf("****** Transaction Stats ******\n");
printf("myIpAddr = %x\n", myIpAddr);
printf("nchashSearch = %d\n", nchashSearch);
printf("nmhashSearch = %d\n", nmhashSearch);
printf("nprehashSearch = %d\n", nprehashSearch);
+ printf("ndirtyCacheObj = %d\n", ndirtyCacheObj);
printf("nRemoteReadSend = %d\n", nRemoteSend);
printf("nSoftAbort = %d\n", nSoftAbort);
printf("bytesSent = %d\n", bytesSent);
printf("sendRemoteReq= %d\n", sendRemoteReq);
printf("getResponse= %d\n", getResponse);
printf("**********************************\n");
+ fflush(stdout);
+ exit(0);
+#endif
+
+#ifdef RECOVERYSTATS
+ fflush(stdout);
exit(0);
#endif
}
void handle() {
-#ifdef TRANSSTATS
+#if defined(TRANSSTATS) || defined(RECOVERYSTATS)
struct sigaction siga;
siga.sa_handler = NULL;
siga.sa_flags = SA_SIGINFO;