test_delayed_insert.pl
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #!/my/gnu/bin/perl -w
  2. # This is a test for INSERT DELAYED
  3. #
  4. $opt_loop_count=10000; # Change this to make test harder/easier
  5. ##################### Standard benchmark inits ##############################
  6. use DBI;
  7. use Getopt::Long;
  8. use Benchmark;
  9. package main;
  10. $opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert=
  11.   $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0;
  12. $opt_host=""; $opt_db="test";
  13. GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in","skip-delete",
  14. "verbose","fast-insert","lock-tables","debug","fast","force") || die "Aborted";
  15. $opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$opt_force=undef;  # Ignore warnings from these
  16. print "Testing 8 multiple connections to a server with 1 insert, 2 delayed insert,";
  17. print "1 update, 1 delete and 3 select connections.n";
  18. $firsttable  = "bench_f1";
  19. $secondtable = "bench_f2";
  20. ####  
  21. ####  Start timeing and start test
  22. ####
  23. $start_time=new Benchmark;
  24. if (!$opt_skip_create)
  25. {
  26.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  27.   $Mysql::QUIET = 1;
  28.   $dbh->do("drop table if exists $firsttable,$secondtable");
  29.   $Mysql::QUIET = 0;
  30.   print "Creating tables $firsttable and $secondtable in database $opt_dbn";
  31.   $dbh->do("create table $firsttable (id int(6) not null, info varchar(32), marker char(1), primary key(id))") or die $DBI::errstr;
  32.   $dbh->do("create table $secondtable (id int(6) not null, row int(3) not null,value double, primary key(id,row))") or die $DBI::errstr;
  33.   
  34.   $dbh->disconnect;
  35. }
  36. $|= 1; # Autoflush
  37. ####
  38. #### Start the tests
  39. ####
  40. test_1() if (($pid=fork()) == 0); $work{$pid}="insert";
  41. test_delayed_1() if (($pid=fork()) == 0); $work{$pid}="delayed_insert1";
  42. test_delayed_2() if (($pid=fork()) == 0); $work{$pid}="delayed_insert2";
  43. test_2() if (($pid=fork()) == 0); $work{$pid}="update";
  44. test_3() if (($pid=fork()) == 0); $work{$pid}="select1";
  45. test_4() if (($pid=fork()) == 0); $work{$pid}="select2";
  46. test_5() if (($pid=fork()) == 0); $work{$pid}="select3";
  47. test_del() if (($pid=fork()) == 0); $work{$pid}="delete";
  48. $errors=0;
  49. while (($pid=wait()) != -1)
  50. {
  51.   $ret=$?/256;
  52.   print "thread '" . $work{$pid} . "' finnished with exit code $retn";
  53.   $errors++ if ($ret != 0);
  54. }
  55. if (!$opt_skip_delete && !$errors)
  56. {
  57.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  58.   $dbh->do("drop table $firsttable");
  59.   $dbh->do("drop table $secondtable");
  60. }
  61. print ($errors ? "Test failedn" :"Test okn");
  62. $end_time=new Benchmark;
  63. print "Total time: " .
  64.   timestr(timediff($end_time, $start_time),"noc") . "n";
  65. exit(0);
  66. #
  67. # Insert records in the two tables
  68. sub test_1
  69. {
  70.   my ($dbh,$tmpvar,$rows,$found,$i);
  71.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  72.   $tmpvar=1;
  73.   $rows=$found=0;
  74.   for ($i=0 ; $i < $opt_loop_count; $i++)
  75.   {
  76.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  77.     $dbh->do("insert into $firsttable values ($i,'This is entry $i','')") || die "Got error on insert: $DBI::errstrn";
  78.     $row_count=($i % 7)+1;
  79.     $rows+=1+$row_count;
  80.     for ($j=0 ; $j < $row_count; $j++)
  81.     {
  82.       $dbh->do("insert into $secondtable values ($i,$j,0)") || die "Got error on insert: $DBI::errstrn";
  83.     }
  84.   }
  85.   $dbh->disconnect;
  86.   print "Test_1: Inserted $rows rowsn";
  87.   exit(0);
  88. }
  89. sub test_delayed_1
  90. {
  91.   my ($dbh,$tmpvar,$rows,$found,$i,$id);
  92.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  93.   $tmpvar=1;
  94.   $rows=$found=0;
  95.   for ($i=0 ; $i < $opt_loop_count; $i++)
  96.   {
  97.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  98.     $id=$i+$opt_loop_count;
  99.     $dbh->do("insert delayed into $firsttable values ($id,'This is entry $id','')") || die "Got error on insert: $DBI::errstrn";
  100.     $row_count=($i % 7)+1;
  101.     $rows+=1+$row_count;
  102.     for ($j=0 ; $j < $row_count; $j++)
  103.     {
  104.       $dbh->do("insert into $secondtable values ($id,$j,0)") || die "Got error on insert: $DBI::errstrn";
  105.     }
  106.     if (($tmpvar % 100) == 0)
  107.     {
  108.       $dbh->do("select max(info) from $firsttable") || die "Got error on select max(info): $DBI::errstrn";
  109.       $dbh->do("select max(value) from $secondtable") || die "Got error on select max(info): $DBI::errstrn";      
  110.       $found+=2;
  111.     }
  112.   }
  113.   $dbh->disconnect;
  114.   print "Test_1: Inserted delayed $rows rows, found $found rowsn";
  115.   exit(0);
  116. }
  117. sub test_delayed_2
  118. {
  119.   my ($dbh,$tmpvar,$rows,$found,$i,$id);
  120.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  121.   $tmpvar=1;
  122.   $rows=$found=0;
  123.   for ($i=0 ; $i < $opt_loop_count; $i++)
  124.   {
  125.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  126.     $id=$i+$opt_loop_count*2;
  127.     $dbh->do("insert delayed into $firsttable values ($id,'This is entry $id','')") || die "Got error on insert: $DBI::errstrn";
  128.     $row_count=($i % 7)+1;
  129.     $rows+=1+$row_count;
  130.     for ($j=0 ; $j < $row_count; $j++)
  131.     {
  132.       $dbh->do("insert delayed into $secondtable values ($id,$j,0)") || die "Got error on insert: $DBI::errstrn";
  133.     }
  134.     if (($tmpvar % 100) == 0)
  135.     {
  136.       $dbh->do("select max(info) from $firsttable") || die "Got error on select max(info): $DBI::errstrn";
  137.       $dbh->do("select max(value) from $secondtable") || die "Got error on select max(info): $DBI::errstrn";      
  138.       $found+=2;
  139.     }
  140.   }
  141.   $dbh->disconnect;
  142.   print "Test_1: Inserted delayed $rows rows, found $found rowsn";
  143.   exit(0);
  144. }
  145. #
  146. # Update records in both tables
  147. #
  148. sub test_2
  149. {
  150.   my ($dbh,$id,$tmpvar,$rows,$found,$i,$max_id,$tmp,$sth,$count);
  151.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  152.   $tmpvar=111111;
  153.   $rows=$found=$max_id=$id=0;
  154.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  155.   {
  156.     $tmp=(($tmpvar + 63) + $i)*3;
  157.     $tmp=$tmp-int($tmp/100000)*100000; 
  158.     $tmpvar^= $tmp;
  159.     $tmp=$tmpvar - int($tmpvar/10)*10;
  160.     if ($max_id*$tmp == 0)
  161.     {
  162.       $max_id=0;
  163.       $sth=$dbh->prepare("select max(id) from $firsttable where marker=''");
  164.       $sth->execute() || die "Got error select max: $DBI::errstrn";
  165.       if ((@row = $sth->fetchrow_array()) && defined($row[0]))
  166.       {
  167. $found++;
  168. $max_id=$id=$row[0];
  169.       }
  170.     }
  171.     else
  172.     {
  173.       $id= $tmpvar % ($max_id-1)+1;
  174.     }
  175.     if ($id)
  176.     {
  177.       ($count=$dbh->do("update $firsttable set marker='x' where id=$id")) || die "Got error update $firsttable: $DBI::errstrn";
  178.       $rows+=$count;
  179.       if ($count > 0)
  180.       {
  181. $count=$dbh->do("update $secondtable set value=$i where id=$id") || die "Got error update $firsttable: $DBI::errstrn";
  182. $rows+=$count;
  183.       }
  184.     }
  185.   }
  186.   $dbh->disconnect;
  187.   print "Test_2: Found $found rows, Updated $rows rowsn";
  188.   exit(0);
  189. }
  190. #
  191. # select records
  192. #
  193. sub test_3
  194. {
  195.   my ($dbh,$id,$tmpvar,$rows,$i,$count);
  196.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  197.   $tmpvar=222222;
  198.   $rows=0;
  199.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  200.   {
  201.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  202.     $id=$tmpvar % $opt_loop_count;
  203.     $count=$dbh->do("select id from $firsttable where id=$id") || die "Got error on select from $firsttable: $DBI::errstrn";
  204.     $rows+=$count;
  205.   }
  206.   $dbh->disconnect;
  207.   print "Test_3: Found $rows rowsn";
  208.   exit(0);
  209. }
  210. #
  211. # Note that this uses row=1 and in some cases won't find any matching
  212. # records
  213. #
  214. sub test_4
  215. {
  216.   my ($dbh,$id,$tmpvar,$rows,$i,$count);
  217.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  218.   $tmpvar=333333;
  219.   $rows=0;
  220.   for ($i=0 ; $i < $opt_loop_count; $i++)
  221.   {
  222.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  223.     $id=$tmpvar % $opt_loop_count;
  224.     $count=$dbh->do("select id from $secondtable where id=$id") || die "Got error on select from $secondtable: $DBI::errstrn";
  225.     $rows+=$count;
  226.   }
  227.   $dbh->disconnect;
  228.   print "Test_4: Found $rows rowsn";
  229.   exit(0);
  230. }
  231. sub test_5
  232. {
  233.   my ($dbh,$id,$tmpvar,$rows,$i,$max_id,$count,$sth);
  234.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  235.   $tmpvar=444444;
  236.   $rows=$max_id=0;
  237.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  238.   {
  239.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  240.     if ($max_id == 0 || ($tmpvar % 10 == 0))
  241.     {
  242.       $sth=$dbh->prepare("select max(id) from $firsttable");
  243.       $sth->execute() || die "Got error select max: $DBI::errstrn";
  244.       if ((@row = $sth->fetchrow_array()) && defined($row[0]))
  245.       {
  246. $max_id=$id=$row[0];
  247.       }
  248.       else
  249.       {
  250. $id=0;
  251.       }
  252.       $sth->finish;
  253.     }
  254.     else
  255.     {
  256.       $id= $tmpvar % $max_id;
  257.     }
  258.     $count=$dbh->do("select value from $firsttable,$secondtable where $firsttable.id=$id and $secondtable.id=$firsttable.id") || die "Got error on select from $secondtable: $DBI::errstrn";
  259.     $rows+=$count;
  260.   }
  261.   $dbh->disconnect;
  262.   print "Test_5: Found $rows rowsn";
  263.   exit(0);
  264. }
  265. #
  266. # Delete the smallest row
  267. #
  268. sub test_del
  269. {
  270.   my ($dbh,$min_id,$i,$sth,$rows);
  271.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host") || die $DBI::errstr;
  272.   $rows=0;
  273.   for ($i=0 ; $i < $opt_loop_count/3; $i++)
  274.   {
  275.     $sth=$dbh->prepare("select min(id) from $firsttable");
  276.     $sth->execute() || die "Got error on select from $firsttable: $DBI::errstrn";
  277.     if ((@row = $sth->fetchrow_array()) && defined($row[0]))
  278.     {
  279.       $min_id=$row[0];
  280.     }
  281.     $sth->finish;
  282.     $dbh->do("delete from $firsttable where id = $min_id") || die "Got error on DELETE from $firsttable: $DBI::errstrn";
  283.     $rows++;
  284.   }
  285.   $dbh->disconnect;
  286.   print "Test_del: Deleted $rows rowsn";
  287.   exit(0);
  288. }