⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_testcode.c

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    if ( (nactual = write(fd, buf, RF_MIN(BUFSIZE, filesize - offset))) < 0) {      perror("File write error"); exit(1);    }    offset += nactual;  }  close(fd);  RF_Free(buf, BUFSIZE);    printf("File %s (%d bytes) successfully transferred to file system\n",fname,offset);}static char rw_type;static int terminate_random_read_test = 0, do_sequential = 0;void RandomReadTest(raidPtr, listp)  RF_Raid_t           *raidPtr;  RF_ShutdownList_t  **listp;{  int nthreads, i, status, rc;  RF_GRpair_t *grp, *fgrp;  RF_Thread_t *tthreads;  RF_Thread_t fthread;  char cbuf[50];  grp = rf_GetGrpair(listp);  if (grp == NULL) {    RF_PANIC();  }  grp->raidPtr = raidPtr;  fgrp = rf_GetGrpair(listp);  if (fgrp == NULL) {    RF_PANIC();  }  fgrp->raidPtr = raidPtr;  fprintf(stderr,"How many parallel threads? [0 is ok] ");  gets(cbuf);  nthreads = atoi(cbuf);  fprintf(stderr,"Reads or Writes [r/w]? ");  gets(cbuf);  rw_type = *cbuf;  fprintf(stderr,"Degraded mode: none, constant, constant double degraded,async, async+init recon [n/c/2/a/r]? ");  gets(cbuf);  rf_testcode_degr_mode_type = *cbuf;  fprintf(stderr,"Random or sequential I/Os? [r/s] ");  gets(cbuf);  if (*cbuf == 's') do_sequential = 1;  /* ios_per_thread is don't-care when rf_testcode_degr_mode_type == 'r' */  if (rf_testcode_degr_mode_type != 'r') {    fprintf(stderr,"How many I/Os per thread? ");    gets(cbuf);    ios_per_thread = atoi(cbuf);  }   RF_CallocAndAdd(tthreads, nthreads, sizeof(RF_Thread_t), (RF_Thread_t *), raidPtr->cleanupList);#if RF_DEMO > 0  if (rf_demoMode)    rf_startup_iops_demo(rf_demoMeterVpos, raidPtr->numCol, raidPtr->Layout.numDataCol+raidPtr->Layout.numParityCol);#endif /* RF_DEMO > 0 */  if (rf_testcode_degr_mode_type == 'c')    rf_FailDisk(raidPtr, 0, 0, 0);  if (rf_testcode_degr_mode_type == '2')     {      rf_FailDisk(raidPtr, 0, 0, 0);      rf_FailDisk(raidPtr, 0, 2, 0);    }  for (i=0; i<nthreads; i++) {    if (RF_CREATE_THREAD(tthreads[i], RRTest, grp)) {      RF_ERRORMSG1("Unable to create test thread number %d\n",i);      punt(1);    }    RF_THREADGROUP_STARTED(&grp->group);  }  RF_THREADGROUP_WAIT_START(&grp->group);  if (rf_testcode_degr_mode_type == 'a' || rf_testcode_degr_mode_type == 'r') {    if (RF_CREATE_THREAD(fthread, DiskFailingThread, fgrp)) {      RF_ERRORMSG("Unable to create disk failing thread\n");      punt(1);    }    RF_THREADGROUP_STARTED(&fgrp->group);    RF_THREADGROUP_WAIT_START(&fgrp->group);    RF_THREADGROUP_WAIT_STOP(&fgrp->group);    if (rf_testcode_degr_mode_type == 'r')      terminate_random_read_test = 1;  }  RF_THREADGROUP_WAIT_STOP(&grp->group);#if RF_DEMO > 0  if (rf_demoMode)    rf_finish_iops_demo();#endif /* RF_DEMO > 0 */}static void RRTest(arg)  RF_ThreadArg_t  arg;{  RF_GRpair_t *grp = (RF_GRpair_t *)arg;  RF_Raid_t *raidPtr = grp->raidPtr;  int numsect, ionum, tid;  int numbytes;  RF_RaidAddr_t offset;  long tot_resp_time_us = 0;  long *rbuf;  RF_Etimer_t etime;  struct timeval starttime, endtime, elpsd;  float elpsd_time;  unsigned long rv;  RF_DECLARE_RANDOM;  rf_assign_threadid();  rf_get_threadid(tid);  RF_THREADGROUP_RUNNING(&grp->group);  printf("[%d] starting\n",tid);  gettimeofday(&starttime, NULL);  RF_INIT_RANDOM(starttime.tv_sec + tid);  rv = RF_RANDOM();  numsect = (rf_accSizeKB) ? rf_accSizeKB*2 : (rv % (rf_maxRandomSizeKB*2)) +1;       /* must access at least one sector */  numbytes = numsect << raidPtr->logBytesPerSector;  RF_Malloc(rbuf, numbytes, (long *));  gettimeofday(&starttime, NULL);  for (ionum=0; (rf_testcode_degr_mode_type == 'r') || (ionum<ios_per_thread); ionum++) {    /*    rv = RF_RANDOM();    delay_ms = rv % 300;    RF_DELAY_THREAD( 0, delay_ms );    */    if (do_sequential) offset = (ionum * numsect) % (raidPtr->totalSectors - numsect);    else {      rv = RF_RANDOM();      offset = rv % (raidPtr->totalSectors-numsect);      offset /= numsect; offset *= numsect;    }    RF_ETIMER_START(etime);    rf_DoAccess(raidPtr, rw_type, NULL, offset, numsect, (caddr_t)rbuf,        NULL, NULL, NULL, RF_DAG_FLAGS_NONE,NULL,NULL,NULL);    RF_ETIMER_STOP(etime);    RF_ETIMER_EVAL(etime);    tot_resp_time_us += RF_ETIMER_VAL_US(etime);#if RF_DEMO > 0    if (rf_demoMode)      rf_update_user_stats(RF_ETIMER_VAL_MS(etime));#endif /* RF_DEMO > 0 */    if (terminate_random_read_test) break;  }  gettimeofday(&endtime, NULL);  RF_TIMEVAL_DIFF(&starttime, &endtime, &elpsd);  elpsd_time = (float) elpsd.tv_sec + ((float) elpsd.tv_usec)/1000000;  RF_Free(rbuf, numbytes);#if RF_DEMO > 0  if (!rf_demoMode)#endif /* RF_DEMO > 0 */  {    printf("[%d] %d %d KB reads in %0.2f secs, avg resp time %0.2f ms\n",      tid, ionum, rf_accSizeKB, elpsd_time, RF_DB0_CHECK( ((float) tot_resp_time_us)/1000.0, ionum));  }  RF_THREADGROUP_DONE(&grp->group);}static unsigned char *writemap = NULL;       /* used to determine what data should be in the array after recon */static int terminate_recon_test = 0;         /* used to cause termination */RF_DECLARE_STATIC_MUTEX(writemap_mutex)      /* used to protect writemap modifications */static int painful_test = 0;                 /* causes full-array verifies after each write */static long *painful_test_buf = NULL;/* run a bunch of I/Os against the array.  If "writemap" is non-null, it means we're * doing a test where we want to verify that all the data in the array is correct after * the test completes, and so we maintain the writemap during the run.  If demoMode is * on, we suppress some of the more severe correctness checks. */static void RealLoopTest(RF_ThreadArg_t arg){  RF_GRpair_t *grp = (RF_GRpair_t *)arg;  RF_Raid_t *raidPtr = grp->raidPtr;  RF_RaidLayout_t *layoutPtr = &(raidPtr->Layout);  long *wbuf, *rbuf, *sbuf;  RF_SectorNum_t secno;  RF_RaidAddr_t offset, t;  int numsect, i, j, numbytes, ionum, tid, resptime, mustWait, rv;  RF_DagHeader_t *rdag, *wdag;  RF_AccessStripeMapHeader_t *rasm, *wasm;  RF_AccessStripeMap_t *p;  int bytesPerSect = (1<<raidPtr->logBytesPerSector);  int longsPerSect = bytesPerSect/sizeof(long), status;  unsigned long rval;  RF_Etimer_t wtimer, rtimer;  struct timeval tstart, tend, diff;  unsigned long iocount, tot_wtime=0, tot_rtime=0, tot_size=0;  RF_StripeNum_t lastStripeID;  RF_MCPair_t *mcpair;  RF_DECLARE_RANDOM;  rf_assign_threadid();  rf_get_threadid(tid);  RF_THREADGROUP_RUNNING(&grp->group);  mcpair = rf_AllocMCPair();  RF_INIT_RANDOM( (different_seeds) ? tid+5 : 1 );  if (rf_accessDebug)    printf("[%d] starting\n",tid);  /* when doing recon-mode test, run until we're told to stop */  gettimeofday(&tstart, NULL);  iocount = 0;  for (ionum=0; writemap || iocount<ios_per_thread; ) {    if (terminate_recon_test)      break;    if (rf_accSizeKB) {      numsect = (rf_accSizeKB * 1024) >> raidPtr->logBytesPerSector;    }    else {      rv = RF_RANDOM();      rv %= ((rf_maxRandomSizeKB*1024)>>raidPtr->logBytesPerSector);      numsect = rv + 1;    }    rv = RF_RANDOM();    offset = rv % (raidPtr->totalSectors-numsect);    if (rf_alignAccesses) {offset /= numsect; offset *= numsect;}    numbytes = numsect << raidPtr->logBytesPerSector;    RF_Malloc(rbuf, numbytes, (long *));    RF_Malloc(sbuf, numbytes, (long *));#if RF_DEMO > 0    if (!rf_demoMode)#endif /* RF_DEMO > 0 */    {      RF_Malloc(wbuf, numbytes, (long *));    }    /* acquire locks on the stripes we're going to write */    wasm = rf_MapAccess(raidPtr, offset, numsect, (caddr_t)wbuf, RF_DONT_REMAP);    lastStripeID = -1;    for (p=wasm->stripeMap; p; p=p->next) {      RF_ASSERT(p->stripeID > lastStripeID);                      /* locks must be acquired hierarchically */      lastStripeID = p->stripeID;      RF_LOCK_MUTEX(mcpair->mutex);      mcpair->flag = 0;      RF_INIT_LOCK_REQ_DESC(p->lockReqDesc, RF_IO_TYPE_WRITE, rf_MCPairWakeupFunc, mcpair, p, layoutPtr->dataSectorsPerStripe);      mustWait = rf_AcquireStripeLock(lockTable, p->stripeID, &p->lockReqDesc);      if (mustWait) {        while (!mcpair->flag) {          RF_WAIT_COND(mcpair->cond, mcpair->mutex);        }      }      RF_UNLOCK_MUTEX(mcpair->mutex);    }    if (!writemap) {      for (i=0; i<numbytes/sizeof(long); i++) {        unsigned long lrv;        lrv = RF_RANDOM();#if RF_DEMO > 0        sbuf[i] = (rf_demoMode) ? i*i : lrv;#else /* RF_DEMO > 0 */        sbuf[i] = lrv;#endif /* RF_DEMO > 0 */      }    } else {      for (secno = offset; secno<offset+numsect; secno++) {	RF_LOCK_MUTEX(writemap_mutex);        rv = RF_RANDOM();	writemap[secno] = (unsigned char) (rv & 0xFF);   /* pick a random char */	RF_UNLOCK_MUTEX(writemap_mutex);	rval = (unsigned long) writemap[secno];                /* convert it to a long */	for (j=0; j < longsPerSect; j++) {                     /* fill the data buffer with rval,rval^2,rval^4,... */	  sbuf[(secno-offset)*longsPerSect+j] = rval;	  rval *= rval;	}      }    }#if RF_DEMO > 0    if (!rf_demoMode)#endif /* RF_DEMO > 0 */    {      bcopy((char *)sbuf, (char *)wbuf, numbytes);    }        /* verify that parity is correct in all stripes to be accessed */#if RF_DEMO > 0    if (rf_demoMode || rf_demoSuppressReconInitVerify)      rf_disableParityVerify = RF_TRUE;#endif /* RF_DEMO > 0 */#if 1    if (layoutPtr->map->faultsTolerated == 0)      rf_disableParityVerify = RF_TRUE;    if ((rf_testcode_degr_mode_type != 'n') && (rf_testcode_degr_mode_type != 'r'))      rf_disableParityVerify = RF_TRUE;#endif    if (!rf_disableParityVerify) {      status = rf_VerifyParity(raidPtr, wasm->stripeMap, RF_DO_CORRECT_PARITY, RF_DAG_FLAGS_NONE);      if (status)        PrintParityVerifyString(status);    }        RF_ETIMER_START(wtimer);#if RF_DEMO > 0    rf_DoAccess(raidPtr, RF_IO_TYPE_WRITE,NULL, offset, numsect, (caddr_t)((rf_demoMode) ? sbuf : wbuf), NULL, &wdag, &wasm, RF_DAG_RETURN_DAG,NULL,NULL,NULL);    if (rf_looptestShowWrites) {      char *wwbuf = (char *)((rf_demoMode) ? sbuf : wbuf);      printf("write off=%lx buf=%lx  %02x %02x %02x %02x %02x    psid=%ld\n",        offset, wwbuf, wwbuf[0]&0xff, wwbuf[1]&0xff, wwbuf[2]&0xff,        wwbuf[3]&0xff, wwbuf[4]&0xff, wasm->stripeMap->stripeID);    }#else /* RF_DEMO > 0 */    rf_DoAccess(raidPtr, RF_IO_TYPE_WRITE,NULL, offset, numsect, (caddr_t)wbuf, NULL, &wdag, &wasm, RF_DAG_RETURN_DAG,NULL,NULL,NULL);    if (rf_looptestShowWrites) {      printf("write off=%lx buf=%lx  %02x %02x %02x %02x %02x    psid=%ld\n",        offset, wbuf, wbuf[0]&0xff, wbuf[1]&0xff, wbuf[2]&0xff,        wbuf[3]&0xff, wbuf[4]&0xff, wasm->stripeMap->stripeID);    }#endif /* RF_DEMO > 0 */    RF_ETIMER_STOP(wtimer);    RF_ETIMER_EVAL(wtimer);    resptime = RF_ETIMER_VAL_MS(wtimer);    tot_wtime += resptime;#if RF_DEMO > 0    if (rf_demoMode)      rf_update_user_stats(resptime);#endif /* RF_DEMO > 0 */        bzero((char *)rbuf, numbytes);    RF_ETIMER_START(rtimer);    rf_DoAccess(raidPtr, RF_IO_TYPE_READ,NULL, offset, numsect, (caddr_t)rbuf, NULL, &rdag, &rasm, RF_DAG_RETURN_ASM|RF_DAG_RETURN_DAG, NULL, NULL, NULL);    if (rasm == NULL)      {	rasm = rf_MapAccess(raidPtr, offset, numsect, (caddr_t)rbuf, RF_DONT_REMAP);      }    RF_ETIMER_STOP(rtimer);    RF_ETIMER_EVAL(rtimer);    resptime = RF_ETIMER_VAL_MS(rtimer);    tot_rtime += resptime;#if RF_DEMO > 0    if (rf_demoMode)      rf_update_user_stats(resptime);#endif /* RF_DEMO > 0 */        tot_size += numsect;    iocount++;        /* hold off on collecting stats until disk has failed */    if ((rf_testcode_degr_mode_type == 'r'          || rf_testcode_degr_mode_type == 'a'          || rf_testcode_degr_mode_type == 'd')        && (!disk_has_failed))    {      iocount = tot_wtime = tot_rtime = tot_size = 0;    }    for (i=0; i<numbytes/sizeof(long); i++) {#if RF_DEMO > 0      if (rbuf[i] != sbuf[i] && !rf_demoSMM && !(rf_testcode_degr_mode_type == 'r' && rf_demoSuppressReconInitVerify))#else /* RF_DEMO > 0 */      if (rbuf[i] != sbuf[i] && !(rf_testcode_degr_mode_type == 'r'))#endif /* RF_DEMO > 0 */      {	printf("[%d] MISCOMPARE! raidAddr %ld numSect %d: longword %d is 0x%x should be 0x%x\n",tid,	       offset,numsect,i, (unsigned long) rbuf[i], (unsigned long) sbuf[i]);	PrintAccessInfo(raidPtr, offset, numsect, wasm, wdag, rasm, rdag);	exit(1);      }    }    if (painful_test) if (VerifyAllData(raidPtr, painful_test_buf)) {      PrintAccessInfo(raidPtr, offset, numsect, wasm, wdag, rasm, rdag);      exit(1);    }    /* verify that parity is _still_ correct in all stripes to be accessed */    if (!rf_disableParityVerify) {      status = rf_VerifyParity(raidPtr, rasm->stripeMap, RF_DONT_CORRECT_PARITY, RF_DAG_FLAGS_NONE);      if (status == RF_PARITY_COULD_NOT_VERIFY) {        PrintParityVerifyString(status);      }      else {        if (status) {          PrintParityVerifyString(status);          RF_PANIC();        }      }    }    else {#if RF_DEMO > 0      if (layoutPtr->map->faultsTolerated && !rf_demoMode)#else /* RF_DEMO > 0 */      if (layoutPtr->map->faultsTolerated)#endif /* RF_DEMO > 0 */      {        for (i=0,p = wasm->stripeMap; p; p = p->next,i++) {          if (p->numDataFailed + p->numParityFailed == 1) {            /* not currently implemented:  a stub right now */            if (rf_VerifyDegrModeWrite(raidPtr, wasm)) {              printf("Degr mode write (ASM %d in following list) failed to verify\n", i);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -