Comment 3 for bug 1526105

Revision history for this message
Agustín (agustin-gallego) wrote : Re: pt-online-schema-change does not check maximum name length when creating tables

After inspecting the code (sub swap_tables) I see that the title is wrong, since there is a length check in the table name:

if ( length($table_name) > 64 ) {
            my $truncated_table_name = substr($table_name, 0, 64);
            PTDEBUG && _d($table_name, 'is > 64 chars, truncating to',
                          $truncated_table_name);
            $table_name = $truncated_table_name;
         }

I'm not sure I understand the underlying problem yet, but we hardcode the number of tries to 10:

   my $name_tries = 10; # don't try forever
...
      while ( $name_tries-- ) {
...
      }

      # This shouldn't happen.
      # Here and in the attempt to find a new table name we probably ought to
      # use --tries (and maybe a Retry object?)
      die ts("Failed to find a unique old table name after "
         . "serveral attempts.\n");
   }

And then, for some reason, the "Try X of 10" instead of showing 1, 2, 3, etc, is always showing 1.

# cat /tmp/pt-osc_t1.out.err | grep "Try code did not succeed" | wc -l
10

# cat /tmp/pt-osc_t1_2.out.err | grep "Try"
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '_t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`_t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '__t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`__t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '___t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`___t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '____t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`____t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '_____t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`_____t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '______t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`______t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '_______t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`_______t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '________t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`________t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '_________t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`_________t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3751 24763 Try code failed: DBD::mysql::db do failed: Table '__________t1_old' already exists [for Statement "RENAME TABLE `test`.`t1` TO `test`.`__________t1_old`, `test`.`__t1_new` TO `test`.`t1`"] at /usr/bin/pt-online-schema-change line 10134.
# Retry:3767 24763 Try code did not succeed
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded
# Retry:3745 24763 Try 1 of 10
# Retry:3762 24763 Try code succeeded