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

📄 hugotransactions.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    check = pTrans->execute(Commit);       if( check == -1) {      const NdbError err = pTrans->getNdbError();            switch(err.status){      case NdbError::TemporaryError:	ERR(err);	closeTransaction(pNdb);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;	break;      case NdbError::PermanentError:	if (allowConstraintViolation == true){	  switch (err.classification){	  case NdbError::ConstraintViolation:	    // Tuple did not exist, OK but should be reported	    g_info << r << ": " << err.code << " " << err.message << endl;	    continue;	    break;	  default:	    	    break;	  }	}	ERR(err);	closeTransaction(pNdb);	return NDBT_FAILED;	break;	      default:	ERR(err);	closeTransaction(pNdb);	return NDBT_FAILED;      }    }    else {      deleted += batch;    }    closeTransaction(pNdb);        r += batch; // Read next record  }  g_info << "|- " << deleted << " records deleted" << endl;  return NDBT_OK;}int HugoTransactions::lockRecords(Ndb* pNdb, 			      int records,			      int percentToLock,			      int lockTime){  // Place a lock on percentToLock% of the records in the Db  // Keep the locks for lockTime ms, commit operation  // and lock som other records  int                  r = 0;  int                  retryAttempt = 0;  const int            retryMax = 100;  int                  check, a, b;  NdbOperation	       *pOp;  NdbOperation::LockMode lm = NdbOperation::LM_Exclusive;  // Calculate how many records to lock in each batch  if (percentToLock <= 0)    percentToLock = 1;  double percentVal = (double)percentToLock / 100;  int lockBatch = (int)(records * percentVal);  if (lockBatch <= 0)    lockBatch = 1;  allocRows(lockBatch);    while (r < records){    if(r + lockBatch > records)      lockBatch = records - r;        g_info << "|- Locking " << lockBatch << " records..." << endl;    if (retryAttempt >= retryMax){      g_info << "ERROR: has retried this operation " << retryAttempt 	     << " times, failing!" << endl;      return NDBT_FAILED;    }    pTrans = pNdb->startTransaction();    if (pTrans == NULL) {      const NdbError err = pNdb->getNdbError();      if (err.status == NdbError::TemporaryError){	ERR(err);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      ERR(err);      return NDBT_FAILED;    }    if(pkReadRecord(pNdb, r, lockBatch, lm) != NDBT_OK)    {      ERR(pTrans->getNdbError());      closeTransaction(pNdb);      return NDBT_FAILED;    }        // NoCommit lockTime times with 100 millis interval    int sleepInterval = 50;    int lockCount = lockTime / sleepInterval;    int commitCount = 0;    do {      check = pTrans->execute(NoCommit);         if( check == -1) {	const NdbError err = pTrans->getNdbError();		if (err.status == NdbError::TemporaryError){	  ERR(err);	  closeTransaction(pNdb);	  NdbSleep_MilliSleep(50);	  retryAttempt++;	  continue;	}	ERR(err);	closeTransaction(pNdb);	return NDBT_FAILED;      }      for (int b=0; (b<lockBatch) && (r+b<records); b++){ 	if (calc.verifyRowValues(rows[b]) != 0){	  closeTransaction(pNdb);	  return NDBT_FAILED;	}      }      commitCount++;      NdbSleep_MilliSleep(sleepInterval);    } while (commitCount < lockCount);        // Really commit the trans, puuh!    check = pTrans->execute(Commit);       if( check == -1) {      const NdbError err = pTrans->getNdbError();            if (err.status == NdbError::TemporaryError){	ERR(err);	closeTransaction(pNdb);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      ERR(err);      closeTransaction(pNdb);      return NDBT_FAILED;    }    else{      for (int b=0; (b<lockBatch) && (r<records); b++){ 	if (calc.verifyRowValues(rows[b]) != 0){	  closeTransaction(pNdb);	  return NDBT_FAILED;	}	r++; // Read next record      }    }        closeTransaction(pNdb);      }  deallocRows();  g_info << "|- Record locking completed" << endl;  return NDBT_OK;}int HugoTransactions::indexReadRecords(Ndb* pNdb, 				   const char * idxName,				   int records,				   int batch){  int                  reads = 0;  int                  r = 0;  int                  retryAttempt = 0;  const int            retryMax = 100;  int                  check, a;  NdbOperation *pOp;  NdbIndexScanOperation *sOp;  const NdbDictionary::Index* pIndex    = pNdb->getDictionary()->getIndex(idxName, tab.getName());    const bool ordered = (pIndex->getType()==NdbDictionary::Index::OrderedIndex);  if (batch == 0) {    g_info << "ERROR: Argument batch == 0 in indexReadRecords(). "	   << "Not allowed." << endl;    return NDBT_FAILED;  }    if (ordered) {    batch = 1;  }  allocRows(batch);    while (r < records){    if (retryAttempt >= retryMax){      g_info << "ERROR: has retried this operation " << retryAttempt 	     << " times, failing!" << endl;      return NDBT_FAILED;    }    pTrans = pNdb->startTransaction();    if (pTrans == NULL) {      const NdbError err = pNdb->getNdbError();            if (err.status == NdbError::TemporaryError){	ERR(err);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      ERR(err);      return NDBT_FAILED;    }        for(int b=0; (b<batch) && (r+b < records); b++){      if(!ordered){	pOp = pTrans->getNdbIndexOperation(idxName, tab.getName());		if (pOp == NULL) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}	check = pOp->readTuple();      } else {	pOp = sOp = pTrans->getNdbIndexScanOperation(idxName, tab.getName());	if (sOp == NULL) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}	check = sOp->readTuples();      }            if( check == -1 ) {	ERR(pTrans->getNdbError());	closeTransaction(pNdb);	return NDBT_FAILED;      }            // Define primary keys      for(a = 0; a<tab.getNoOfColumns(); a++){	if (tab.getColumn(a)->getPrimaryKey() == true){	  if(equalForAttr(pOp, a, r+b) != 0){	    ERR(pTrans->getNdbError());	    closeTransaction(pNdb);	    return NDBT_FAILED;	  }	}      }            // Define attributes to read        for(a = 0; a<tab.getNoOfColumns(); a++){	if((rows[b]->attributeStore(a) = 	    pOp->getValue(tab.getColumn(a)->getName())) == 0) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}      }    }    check = pTrans->execute(Commit);       check = (check == -1 ? -1 : !ordered ? check : sOp->nextResult(true));    if( check == -1 ) {      const NdbError err = pTrans->getNdbError();            if (err.status == NdbError::TemporaryError){	ERR(err);	closeTransaction(pNdb);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      switch(err.code){      case 626: // Tuple did not exist	  g_info << r << ": " << err.code << " " << err.message << endl;	  r++;	  break;	        default:	ERR(err);	closeTransaction(pNdb);	return NDBT_FAILED;      }    } else{      for (int b=0; (b<batch) && (r+b<records); b++){ 	if (calc.verifyRowValues(rows[b]) != 0){	  closeTransaction(pNdb);	  return NDBT_FAILED;	}	reads++;	r++;      }      if(ordered && sOp->nextResult(true) == 0){	ndbout << "Error when comparing records "	       << " - index op next_result to many" << endl;	closeTransaction(pNdb);	return NDBT_FAILED;      }    }    closeTransaction(pNdb);  }  deallocRows();  g_info << reads << " records read" << endl;  return NDBT_OK;}int HugoTransactions::indexUpdateRecords(Ndb* pNdb, 				     const char * idxName,				     int records,				     int batch){  int updated = 0;  int                  r = 0;  int                  retryAttempt = 0;  const int            retryMax = 100;  int                  check, a, b;  NdbOperation *pOp;  NdbScanOperation * sOp;  const NdbDictionary::Index* pIndex    = pNdb->getDictionary()->getIndex(idxName, tab.getName());    const bool ordered = (pIndex->getType()==NdbDictionary::Index::OrderedIndex);  if (ordered){    batch = 1;  }  allocRows(batch);    while (r < records){    if (retryAttempt >= retryMax){      g_info << "ERROR: has retried this operation " << retryAttempt 	     << " times, failing!" << endl;      return NDBT_FAILED;    }        pTrans = pNdb->startTransaction();    if (pTrans == NULL) {      const NdbError err = pNdb->getNdbError();            if (err.status == NdbError::TemporaryError){	ERR(err);	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      ERR(err);      return NDBT_FAILED;    }    for(b = 0; b<batch && (b+r)<records; b++){      if(!ordered){	pOp = pTrans->getNdbIndexOperation(idxName, tab.getName());		if (pOp == NULL) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}		check = pOp->readTupleExclusive();	if( check == -1 ) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}      } else {	pOp = sOp = pTrans->getNdbIndexScanOperation(idxName, tab.getName());	if (pOp == NULL) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}		check = 0;	sOp->readTuplesExclusive();      }	            // Define primary keys      for(a = 0; a<tab.getNoOfColumns(); a++){	if (tab.getColumn(a)->getPrimaryKey() == true){	  if(equalForAttr(pOp, a, r+b) != 0){	    ERR(pTrans->getNdbError());	    closeTransaction(pNdb);	    return NDBT_FAILED;	  }	}      }            // Define attributes to read        for(a = 0; a<tab.getNoOfColumns(); a++){	if((rows[b]->attributeStore(a) = 	    pOp->getValue(tab.getColumn(a)->getName())) == 0) {	  ERR(pTrans->getNdbError());	  closeTransaction(pNdb);	  return NDBT_FAILED;	}      }    }         check = pTrans->execute(NoCommit);       check = (check == -1 ? -1 : !ordered ? check : sOp->nextResult(true));    if( check == -1 ) {      const NdbError err = pTrans->getNdbError();      ERR(err);      closeTransaction(pNdb);            if (err.status == NdbError::TemporaryError){	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      return NDBT_FAILED;    }    if(ordered && check != 0){      g_err << check << " - Row: " << r << " not found!!" << endl;      closeTransaction(pNdb);      return NDBT_FAILED;        }        for(b = 0; b<batch && (b+r)<records; b++){      if (calc.verifyRowValues(rows[b]) != 0){	closeTransaction(pNdb);	return NDBT_FAILED;      }            int updates = calc.getUpdatesValue(rows[b]) + 1;            NdbOperation* pUpdOp;      if(!ordered){	pUpdOp = pTrans->getNdbIndexOperation(idxName, tab.getName());	check = (pUpdOp == 0 ? -1 : pUpdOp->updateTuple());      } else {	pUpdOp = sOp->updateCurrentTuple();      }      if (pUpdOp == NULL) {	ERR(pTrans->getNdbError());	closeTransaction(pNdb);	return NDBT_FAILED;      }            if( check == -1 ) {	ERR(pTrans->getNdbError());	closeTransaction(pNdb);	return NDBT_FAILED;      }            if(!ordered){	for(a = 0; a<tab.getNoOfColumns(); a++){	  if (tab.getColumn(a)->getPrimaryKey() == true){	    if(equalForAttr(pUpdOp, a, r+b) != 0){	      ERR(pTrans->getNdbError());	      closeTransaction(pNdb);	      return NDBT_FAILED;	    }	  }	}      }            for(a = 0; a<tab.getNoOfColumns(); a++){	if (tab.getColumn(a)->getPrimaryKey() == false){	  if(setValueForAttr(pUpdOp, a, r+b, updates ) != 0){	    ERR(pTrans->getNdbError());	    closeTransaction(pNdb);	    return NDBT_FAILED;	  }	}      }    }        check = pTrans->execute(Commit);       if( check == -1 ) {      const NdbError err = pTrans->getNdbError();      ERR(err);      closeTransaction(pNdb);            if (err.status == NdbError::TemporaryError){	NdbSleep_MilliSleep(50);	retryAttempt++;	continue;      }      ndbout << "r = " << r << endl;      return NDBT_FAILED;    } else {      updated += batch;    }        closeTransaction(pNdb);        r+= batch; // Read next record  }    g_info << "|- " << updated << " records updated" << endl;  return NDBT_OK;}template class Vector<NDBT_ResultRow*>;

⌨️ 快捷键说明

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