Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-742

LP:803649 - Xa recovery failed on client disconnection

    Details

    • Type: Bug
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects Version/s: 10.0.2, 5.5.31, 5.1.67, 5.2.14, 5.3.12, 10.1, 10.0, 5.5
    • Fix Version/s: 10.1
    • Component/s: OTHER

      Description

      Dispite prepare phase have been rich you will get nothing when doing a xa recover if the client get disconnected befor commit

      In the following php script an error is generated to force the COMMIT to failed cf:XA COMMITEE and close the connection.

       
      <?php
      
      $dt = date_create();
      $xid = date_timestamp_get($dt);
      echo "xid : ".$xid;
      
      $logger1 = new mysqli('localhost', 'root', 'xxxxx', 'test');
      if (mysqli_connect_error()) {
          die('Erreur de connexion (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
      }
      $potest = new mysqli('192.168.45.166', 'test', 'xxxxxxx', 'test');
      if (mysqli_connect_error()) {
          $logger1->close();
          die('Erreur de connexion (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
      }
      
      echo 'SuccËs logger1 ' . $logger1->host_info . "\n";
      echo 'SuccËs potest ' . $potest->host_info . "\n";
      
      
      ##################################
      $queryXA = 'XA START "'.$xid.'"';
      
      $queryRes = $logger1->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      $queryRes = $potest->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide potest: ' . $potest->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      ##################################
      
      
      ##################################
      $queryXA = 'INSERT INTO mthoxa(xamtho_tc) values ("'.$xid.'")';
      $queryRes = $logger1->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      
      $queryRes = $potest->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      ##################################
      
      
      ##################################
      $queryXA = 'XA END "'.$xid.'"';
      
      $queryRes = $logger1->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      $queryRes = $potest->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide potest: ' . $potest->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      ##################################
      
      
      ##################################
      $queryXA = 'XA PREPARE "'.$xid.'"';
      $queryRes = $logger1->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      
      $queryRes = $potest->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide potest: ' . $potest->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      
      ##################################
      
      
      ##################################
      $queryXA = 'XA COMMIT "'.$xid.'"';
      $queryRes = $logger1->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide logger1: ' . $logger1->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          $logger1->close();
          $potest->close();
          die($message);
      }
      
      $queryXA = 'XA COMMITEE "'.$xid.'"';
      $queryRes = $potest->query($queryXA);
      if (!$queryRes) {
          $message  = 'RequÍte invalide potest: ' . $potest->error . "\n";
          $message .= 'RequÍte complËte : ' . $queryXA;
          
          $queryXA = 'XA RECOVER';
          $queryRes = $potest->query($queryXA);
          while ($r=$queryRes->fetch_assoc())
          	print_r($r);
          
          
          $logger1->close();
          $potest->close();
          die($message);
      }
      ##################################
      
      $logger1->close();
      $potest->close();
      
      echo "Finish !\n"
      
      ?>
      

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

              Hide
              ratzpo Rasmus Johansson added a comment -

              Launchpad bug id: 803649

              Show
              ratzpo Rasmus Johansson added a comment - Launchpad bug id: 803649
              Hide
              elenst Elena Stepanova added a comment - - edited

              Also reproducible on all MySQL versions (ancient bug http://bugs.mysql.com/bug.php?id=12161)

              MTR test case
              
              --source include/have_innodb.inc
              
              --enable_connect_log
              create table t1 (i int) engine=InnoDB;
              
              --source include/count_sessions.inc
              
              --connect (con1,localhost,root,,)
              xa start 'xid';
              insert into t1 values (1);
              xa end 'xid';
              xa prepare 'xid';
              xa recover;
              --disconnect con1
              
              --connection default
              --source include/wait_until_count_sessions.inc
              
              xa recover;
              
              drop table t1;
              
              Show
              elenst Elena Stepanova added a comment - - edited Also reproducible on all MySQL versions (ancient bug http://bugs.mysql.com/bug.php?id=12161 ) MTR test case --source include/have_innodb.inc --enable_connect_log create table t1 (i int) engine=InnoDB; --source include/count_sessions.inc --connect (con1,localhost,root,,) xa start 'xid'; insert into t1 values (1); xa end 'xid'; xa prepare 'xid'; xa recover; --disconnect con1 --connection default --source include/wait_until_count_sessions.inc xa recover; drop table t1;

                People

                • Assignee:
                  Unassigned
                  Reporter:
                  stephanevaroqui Stephane VAROQUI
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  1 Start watching this issue

                  Dates

                  • Created:
                    Updated: