// main() // int main(int argc, char **argv) { uint64_t acc=0; uint64_t readBlocks=0; // read size ib blocks uint64_t readSize=0; // read size ib bytes uint64_t readBufferSz=0; const uint64_t blockSize=8192; char* alignedbuff=0; boost::scoped_array<char> realbuff; const unsigned pageSize = 4096; //getpagesize(); WriteEngine::FileOp fFileOp; BRM::OID_t oid; char fname[256]; struct timespec tm; struct timespec tm2; struct timespec tm3; struct timespec starttm; struct timespec endtm; struct timespec tottm; bool odirect=true; int fd = 0; char response='Y'; if (argc <= 1) { cerr << "usage: testread <oid> <buffer size in blocks>" << endl; return -1; } oid=atoi(argv[1]); if (oid <=0) exit(-1); if (argc >=2) { readBlocks = atoi(argv[2]); if (readBlocks <= 0) readBlocks = 8; } if (argc >=4) { odirect=false; } readSize=readBlocks*blockSize; readBufferSz=readSize+pageSize; realbuff.reset(new char[readBufferSz]); if (realbuff.get() == 0) { cerr << "thr_popper: Can't allocate space for a whole extent in memory" << endl; return 0; } if (fFileOp.getFileName(oid, fname) != WriteEngine::NO_ERROR) { fname[0]=0; throw std::runtime_error("fileOp.getFileName failed"); } else { cout << "Reading oid: " << oid << " od: " << odirect << " file: " << fname << endl; } #if __LP64__ alignedbuff=(char*)((((ptrdiff_t)realbuff.get() >> 12) << 12) + pageSize); #else alignedbuff=(char*)(((((ptrdiff_t)realbuff.get() >> 12) << 12) & 0xffffffff) + pageSize); #endif erydbassert(((ptrdiff_t)alignedbuff - (ptrdiff_t)realbuff.get()) < (ptrdiff_t)pageSize); erydbassert(((ptrdiff_t)alignedbuff % pageSize) == 0); if (odirect) fd=open(fname, O_RDONLY|O_DIRECT|O_LARGEFILE|O_NOATIME); else fd=open(fname, O_RDONLY|O_LARGEFILE|O_NOATIME); if (fd<0) { cerr << "Open failed" << endl; perror("open"); throw runtime_error("Error opening file"); } while (toupper(response) != 'N') { uint64_t i=1; uint64_t rCnt=0; clock_gettime(CLOCK_REALTIME, &starttm); while (i!=0) { //clock_gettime(CLOCK_REALTIME, &tm); i = pread(fd, alignedbuff, readSize, acc); //clock_gettime(CLOCK_REALTIME, &tm2); erydbassert(i==0||i==readSize); erydbassert(i%pageSize==0); erydbassert(acc%pageSize==0); if (i < 0 && errno == EINTR) { timespec_sub(tm, tm2, tm3); cout << "* " << i << " " << right << setw(2) << setfill(' ') << tm3.tv_sec << "." << right << setw(9) << setfill('0') << tm3.tv_nsec << endl; continue; } else if (i < 0) { timespec_sub(tm, tm2, tm3); cout << "* i: " << i << " sz: " << readSize << " acc: " << acc << right << setw(2) << setfill(' ') << tm3.tv_sec << " " << right << tm3.tv_nsec << endl; perror("pread"); //make loop exit i=0; } acc += i; if (i>0) rCnt++; //timespec_sub(tm, tm2, tm3); //cout // << i << " " // << right << setw(2) << setfill(' ') << tm3.tv_sec << " " // << right << tm3.tv_nsec // << endl; } // while(acc... clock_gettime(CLOCK_REALTIME, &endtm); timespec_sub(starttm, endtm, tottm); cout << "Total reads: " << rCnt << " sz: " << acc/(1024*1024) << "MB" << " tm: " << tottm.tv_sec << "secs " << tottm.tv_nsec << "ns" << endl; cout << "Repeat the last scan[Y,N]?" << endl; cin >> response; acc=0; } // while response... close(fd); return 0; } //main
void operator() () { WriteEngine::FileOp fFileOp; char frealbuff[freadBufferSz]; memset(frealbuff, 0, freadBufferSz); if (frealbuff==0) { cerr << "thr_popper: Can't allocate space for a whole extent in memory" << endl; return; } if (fFileOp.getFileName(foid, fname) != WriteEngine::NO_ERROR) { fname[0]=0; throw std::runtime_error("fileOp.getFileName failed"); } else { cout << "Reading oid: " << foid << " od: " << fodirect << " file: " << fname << endl; } #if __LP64__ falignedbuff=(char*)((((ptrdiff_t)frealbuff >> 12) << 12) + fpageSize); #else falignedbuff=(char*)(((((ptrdiff_t)frealbuff >> 12) << 12) & 0xffffffff) + fpageSize); #endif idbassert(((ptrdiff_t)falignedbuff - (ptrdiff_t)frealbuff) < (ptrdiff_t)fpageSize); idbassert(((ptrdiff_t)falignedbuff % fpageSize) == 0); if (fodirect) fd=open(fname, O_RDONLY|O_DIRECT|O_LARGEFILE|O_NOATIME); else fd=open(fname, O_RDONLY|O_LARGEFILE|O_NOATIME); if (fd<0) { cerr << "Open failed" << endl; perror("open"); throw runtime_error("Error opening file"); } uint64_t i=1; uint64_t rCnt=0; clock_gettime(CLOCK_REALTIME, &fstarttm); while (i>0) { clock_gettime(CLOCK_REALTIME, &ftm); i = pread(fd, falignedbuff, freadSize, facc); clock_gettime(CLOCK_REALTIME, &ftm2); idbassert(i==0||i==freadSize); idbassert(i%fpageSize==0); idbassert(facc%fpageSize==0); if (i < 0 && errno == EINTR) { timespec_sub(ftm, ftm2, ftm3); cout << "* " << i << " " << right << setw(2) << setfill(' ') << ftm3.tv_sec << "." << right << setw(9) << setfill('0') << ftm3.tv_nsec << endl; continue; } else if (i < 0) { timespec_sub(ftm, ftm2, ftm3); cout << "* i: " << i << " sz: " << freadSize << " acc: " << facc << right << setw(2) << setfill(' ') << ftm3.tv_sec << " " << right << ftm3.tv_nsec << endl; perror("pread"); } facc += i; if (i>0) rCnt++; /** timespec_sub(ftm, ftm2, ftm3); cout << rCnt << " " << facc/(1024*1024) << right << setw(2) << setfill(' ') << ftm3.tv_sec << "." << right << ftm3.tv_nsec << " i: " << i/(1024*1024) << endl; **/ } // while(acc... clock_gettime(CLOCK_REALTIME, &fendtm); timespec_sub(fstarttm, fendtm, ftottm); cout << "Total reads: " << rCnt << " sz: " << facc/(1024*1024) << "MB" << " tm: " << ftottm.tv_sec << "secs " << ftottm.tv_nsec << "ns" << endl; facc=0; close(fd); } // operator()