NDBT_Error.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* NDBT_Error.cpp                         */
  14. /* This program deals with error handling */
  15. #include <ndb_global.h>
  16. #include <NdbMain.h>
  17. #include <NdbOut.hpp>
  18. #include <NdbTest.hpp>
  19. #include <NDBT_Error.hpp>
  20. #include <NdbSleep.h>
  21. ErrorData::ErrorData()
  22. {
  23.   errorCountArray = new Uint32[6000];
  24.   resetErrorCounters();
  25.   key_error = false;
  26.   temporary_resource_error = true;
  27.   insufficient_space_error = false;
  28.   node_recovery_error = true;
  29.   overload_error = true;
  30.   timeout_error = true;
  31.   internal_error = true;
  32.   user_error = true;
  33.   application_error = false;
  34. }
  35. ErrorData::~ErrorData()
  36. {
  37.   delete [] errorCountArray;
  38. }
  39. //-------------------------------------------------------------------
  40. // Error Handling routines
  41. //-------------------------------------------------------------------
  42. int ErrorData::handleErrorCommon(const NdbError & error)
  43. {
  44.   int retValue = 1;
  45.   if (error.code > 6000) {
  46.     if (user_error == true) {
  47.       retValue = 0;
  48.     }//if
  49.     return retValue;
  50.   }//if
  51.   errorCountArray[error.code]++;
  52.   switch(error.classification){
  53.   case NdbError::NoDataFound:
  54.   case NdbError::ConstraintViolation:
  55.     if (key_error == true) {
  56.       retValue = 0;
  57.     }//if
  58.     break;
  59.   case NdbError::TemporaryResourceError:
  60.     if (temporary_resource_error == true) {
  61.       retValue = 0;
  62.     }//if
  63.     break;
  64.   case NdbError::InsufficientSpace:
  65.     if (insufficient_space_error == true) {
  66.       retValue = 0;
  67.     }//if
  68.     break;
  69.   case NdbError::NodeRecoveryError:
  70.     if (node_recovery_error == true) {
  71.       retValue = 0;
  72.     }//if
  73.     break;
  74.     
  75.   case NdbError::UnknownResultError:
  76.     if(error.code == 4012){
  77.       retValue = 0;
  78.     }
  79.     if(error.code == 4115){
  80.       retValue = 2;
  81.     }
  82.     if(error.code == 4007 && node_recovery_error == true){
  83.       retValue = 3;
  84.     }
  85.     break;
  86.   case NdbError::OverloadError:
  87.     if (overload_error == true) {
  88.       NdbSleep_MilliSleep(50);
  89.       retValue = 0;
  90.     }//if
  91.     break;
  92.   case NdbError::TimeoutExpired:
  93.     if (timeout_error == true) {
  94.       retValue = 0;
  95.     }//if
  96.     break;
  97.   case NdbError::InternalError:
  98.     if (internal_error == true) {
  99.       retValue = 0;
  100.     }//if
  101.     break;
  102.   case NdbError::ApplicationError:
  103.     if (application_error == true) {
  104.       retValue = 0;
  105.     }//if
  106.     break;
  107.   case NdbError::UserDefinedError:
  108.     if (user_error == true) {
  109.       retValue = 0;
  110.     }//if
  111.     break;
  112.   default:
  113.     break;
  114.   }//switch
  115.   if(error.status == NdbError::TemporaryError)
  116.     retValue = 0;
  117.   
  118.   return retValue;
  119. }//handleErrorCommon()
  120. void ErrorData::printErrorCounters(NdbOut & out) const
  121. {
  122.   int localLoop;
  123.   for (localLoop = 0; localLoop < 6000; localLoop++) {
  124.     int errCount = (int)errorCountArray[localLoop];
  125.     if (errCount > 0) {
  126.       out << "NDBT: ErrorCode = " << localLoop << " occurred ";
  127.       out << errCount << " times" << endl;
  128.     }//if
  129.   }//for
  130. }//printErrorCounters()
  131. void ErrorData::printSettings(NdbOut & out)
  132. {
  133.   out << "Key Errors are ";
  134.   if (key_error == false) {
  135.     out << "disallowed" << endl;
  136.   } else {
  137.     out << "allowed" << endl;
  138.   }//if
  139.   out << "Temporary Resource Errors are ";
  140.   if (temporary_resource_error == false) {
  141.     out << "disallowed" << endl;
  142.   } else {
  143.     out << "allowed" << endl;
  144.   }//if 
  145.   if (internal_error == true) {
  146.     out << "Insufficient Space Errors are ";
  147.   }
  148.   if (insufficient_space_error == false) {
  149.     out << "disallowed" << endl;
  150.   } else {
  151.     out << "allowed" << endl;
  152.   }//if
  153.   out << "Node Recovery Errors are ";
  154.   if (node_recovery_error == false) {
  155.     out << "disallowed" << endl;
  156.   } else {
  157.     out << "allowed" << endl;
  158.   }//if
  159.   out << "Overload Errors are ";
  160.   if (overload_error == false) {
  161.     out << "disallowed" << endl;
  162.   } else {
  163.     out << "allowed" << endl;
  164.   }//if
  165.   out << "Timeout Errors are ";
  166.   if (timeout_error == false) {
  167.     out << "disallowed" << endl;
  168.   } else {
  169.     out << "allowed" << endl;
  170.   }//if
  171.   out << "Internal NDB Errors are ";
  172.   if (internal_error == false) {
  173.     out << "disallowed" << endl;
  174.   } else {
  175.     out << "allowed" << endl;
  176.   }//if
  177.   out << "User logic reported Errors are ";
  178.   if (user_error == false) {
  179.     out << "disallowed" << endl;
  180.   } else {
  181.     out << "allowed" << endl;
  182.   }//if
  183.   out << "Application Errors are ";
  184.   if (application_error == false) {
  185.     out << "disallowed" << endl;
  186.   } else {
  187.     out << "allowed" << endl;
  188.   }//if
  189. }//printSettings
  190. void ErrorData::printCmdLineArgs(NdbOut & out)
  191. {
  192.   out << "   -key_err          Allow key errors" << endl;
  193.   out << "   -no_key_err       Disallow key errors (default)" << endl;
  194.   out << "   -temp_res_err     Allow temporary resource errors (default)";
  195.   out << endl;
  196.   out << "   -no_temp_res_err  Disallow temporary resource errors" << endl;
  197.   out << "   -ins_space_err    Allow insufficient space errors" << endl;
  198.   out << "   -no_ins_space_err Disallow insufficient space errors (default)";
  199.   out << endl;
  200.   out << "   -noderec_err      Allow Node Recovery errors (default)" << endl;
  201.   out << "   -no_noderec_err   Disallow Node Recovery errors" << endl;
  202.   out << "   -overload_err     Allow Overload errors (default)" << endl;
  203.   out << "   -no_overload_err  Disallow Overload errors" << endl;
  204.   out << "   -timeout_err      Allow Time-out errors (default)" << endl;
  205.   out << "   -no_timeout_err   Disallow Time-out errors" << endl;
  206.   out << "   -internal_err     Allow Internal NDB errors" << endl;
  207.   out << "   -no_internal_err  Disallow Internal NDB errors (default)";
  208.   out << "   -user_err         Allow user logic reported errors (default)";
  209.   out << endl;
  210.   out << "   -no_user_err      Disallow user logic reported errors";
  211.   out << endl;
  212. }//printCmdLineArgs()
  213. bool ErrorData::parseCmdLineArg(const char** argv, int & i)
  214. {
  215.   bool ret_Value = true;
  216.   if (strcmp(argv[i], "-key_err") == 0){
  217.     key_error = true;
  218.   } else if (strcmp(argv[i], "-no_key_err") == 0){
  219.     key_error = false;
  220.   } else if (strcmp(argv[i], "-temp_res_err") == 0){
  221.     temporary_resource_error = true;
  222.   } else if (strcmp(argv[i], "-no_temp_res_err") == 0){
  223.     temporary_resource_error = false;
  224.   } else if (strcmp(argv[i], "-ins_space_err") == 0){
  225.     insufficient_space_error = true;
  226.   } else if (strcmp(argv[i], "-no_ins_space_err") == 0){
  227.     insufficient_space_error = false;
  228.   } else if (strcmp(argv[i], "-noderec_err") == 0){
  229.     node_recovery_error = true;
  230.   } else if (strcmp(argv[i], "-no_noderec_err") == 0){
  231.     node_recovery_error = false;
  232.   } else if (strcmp(argv[i], "-overload_err") == 0){
  233.     overload_error = true;
  234.   } else if (strcmp(argv[i], "-no_overload_err") == 0){
  235.     overload_error = false;
  236.   } else if (strcmp(argv[i], "-timeout_err") == 0){
  237.     timeout_error = true;
  238.   } else if (strcmp(argv[i], "-no_timeout_err") == 0){
  239.     timeout_error = false;
  240.   } else if (strcmp(argv[i], "-internal_err") == 0){
  241.     internal_error = true;
  242.   } else if (strcmp(argv[i], "-no_internal_err") == 0){
  243.     internal_error = false;
  244.   } else if (strcmp(argv[i], "-user_err") == 0){
  245.     user_error = true;
  246.   } else if (strcmp(argv[i], "-no_user_err") == 0){
  247.     user_error = false;
  248.   } else {
  249.     ret_Value = false;
  250.   }//if
  251.   return ret_Value;
  252. }//bool parseCmdline
  253. void ErrorData::resetErrorCounters()
  254. {
  255.   for (int i = 0; i < 6000; i++){
  256.     errorCountArray[i] = 0 ;
  257.   }
  258. }