//the map function //see ftw(3) man page (dftw is basically identical) static int map(const char *fpath, const struct stat *sb, int tflag, void *kv) { off_t size; uid_t uid; switch (tflag) { case FTW_D: //fpath is a directory return 0; case FTW_DNR: //fpath is a directory which can't be read fprintf(stderr, "unreadable directory: %s\n", fpath); return 1; case FTW_NS: //the stat(2) call failed on fpath, which is not a symbolic link fprintf(stderr, "unstatable file: %s\n", fpath); return 1; default: { //(FTW_F) //ignore symlinks if (!S_ISLNK(sb->st_mode)) { size = sb->st_size; uid = sb->st_uid; //emit a {uid:size} key/value MR_kv_add(kv, (char*)&uid, sizeof(uid_t), (char*)&size, sizeof(off_t)); } return 0; } } }
void generate(int itask, void *kv, void *ptr) { RMAT *rmat = (RMAT *) ptr; int nlevels = rmat->nlevels; int order = rmat->order; int ngenerate = rmat->ngenerate; double a = rmat->a; double b = rmat->b; double c = rmat->c; double d = rmat->d; double fraction = rmat->fraction; int i,j,ilevel,delta,m; double a1,b1,c1,d1,total,rn; EDGE edge; for (m = 0; m < ngenerate; m++) { delta = order >> 1; a1 = a; b1 = b; c1 = c; d1 = d; i = j = 0; for (ilevel = 0; ilevel < nlevels; ilevel++) { rn = drand48(); if (rn < a1) { } else if (rn < a1+b1) { j += delta; } else if (rn < a1+b1+c1) { i += delta; } else { i += delta; j += delta; } delta /= 2; if (fraction > 0.0) { a1 += a1*fraction * (drand48() - 0.5); b1 += b1*fraction * (drand48() - 0.5); c1 += c1*fraction * (drand48() - 0.5); d1 += d1*fraction * (drand48() - 0.5); total = a1+b1+c1+d1; a1 /= total; b1 /= total; c1 /= total; d1 /= total; } } edge.vi = i; edge.vj = j; MR_kv_add(kv,(char *) &edge,sizeof(EDGE),NULL,0); } }
void histo(char *key, int keybytes, char *multivalue, int nvalues, int *valuebytes, void *kv, void *ptr) { MR_kv_add(kv,key,keybytes,(char *) &nvalues,sizeof(int)); }
void degree(char *key, int keybytes, char *multivalue, int nvalues, int *valuebytes, void *kv, void *ptr) { MR_kv_add(kv,(char *) &nvalues,sizeof(int),NULL,0); }
void nonzero(char *key, int keybytes, char *multivalue, int nvalues, int *valuebytes, void *kv, void *ptr) { EDGE *edge = (EDGE *) key; MR_kv_add(kv,(char *) &edge->vi,sizeof(VERTEX),NULL,0); }
void cull(char *key, int keybytes, char *multivalue, int nvalues, int *valuebytes, void *kv, void *ptr) { MR_kv_add(kv,key,keybytes,NULL,0); }