List:Commits« Previous MessageNext Message »
From:Rafal Somla Date:March 17 2008 9:21am
Subject:Re: bk commit into 6.0 tree (cbell:1.2589) BUG#34858
View as plain text  
Hi Chuck,

Sorry that I haven't reviewed it by Friday.

As I understand you propose a temporary solution to avoid violating the 
assertion. The solution is to change table->in_use to point at current_thd and 
thus make server code think that table operations are done from the thread which 
opened them.

I agree with Guilhem's opinion that this is not a good way to proceed. If we use 
hacks to go around assumptions made by the authors of the server code we are 
asking for troubles -- sooner or later the code is going to break.

But we also have a WL for changing the logging code completely, so I think we 
can accept this patch as an immediate solution for a showstopper. Perhaps you 
should put some comment at the begging of the code informing about its status. 
(Well, in an ideal world with infinite time resources we should wait for the WL 
to be implemented and not push any temporary fixes, but I'm afraid we can't 
afford doing that).

I have a suggestion. In many places in the code you temporarily disable and 
re-enable binlog. But I think that binlog should always be disabled during 
backup/restore operation. I mean disabled in the thread executing BACKUP/RESTORE 
-- other threads should binlog or not as decided in WL#4209.

Therefore I suggest to write the backup progress code with assumption that the 
binlog is disabled (this should be documented as a precondition) and modify the 
kernel code to disable binloging. In the new version of the kernel (WL#4212) 
this should be done inside Backup_restore_ctx::prepare() function.

Rafal

cbell@stripped wrote:
> Below is the list of changes that have just been committed into a local
> 6.0 repository of cbell.  When cbell does a push these changes
> will be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
> 
> ChangeSet@stripped, 2008-03-14 08:51:11-04:00, cbell@mysql_cab_desk. +3 -0
>   BUG#34858 Server crashes by backup tests 
>   
>   Patch fixes problems encountered when merging runtime code changes
>   into main for online backup.
> 
>   mysql-test/t/disabled.def@stripped, 2008-03-14 08:51:06-04:00, cbell@mysql_cab_desk.
> +0 -5
>     BUG#34858 Server crashes by backup tests 
>     
>     Reenabled disabled tests.
> 
>   sql/backup/backup_progress.cc@stripped, 2008-03-14 08:51:07-04:00,
> cbell@mysql_cab_desk. +37 -5
>     BUG#34858 Server crashes by backup tests 
>     
>     Patch adds code to turn off binlogging for progress table writes.
>     Patch fixes bug caused by changes to handler.cc WRT current thread
>     access for writes.
> 
>   sql/backup/be_snapshot.cc@stripped, 2008-03-14 08:51:08-04:00, cbell@mysql_cab_desk. +1
> -0
>     BUG#34858 Server crashes by backup tests 
>     
>     Added code to perform commit of consistent read to avoid another
>     problem introduced from changes to handler.cc.
> 
=======================
> diff -Nrup a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
> --- a/mysql-test/t/disabled.def	2008-03-10 08:58:17 -04:00
> +++ b/mysql-test/t/disabled.def	2008-03-14 08:51:06 -04:00
> @@ -35,8 +35,3 @@ backup_snapshot       :BUG#34235 pending
>  csv_alter_table      : Bug#33696 2008-01-21 pcrews no .result file - bug allows NULL
> columns in CSV tables
>  ctype_latin2_ch      : BUG #33791 2008-01-18 mats Wrong ORDER BY with
> latin2_czech_cs
>  
> -backup_errors        : Bug#34858 2008-Feb-28 Server crashes by backup tests
> -backup_fkey          : Bug#34858 2008-Feb-28 Server crashes by backup tests
> -backup_no_data       : Bug#34858 2008-Feb-28 Server crashes by backup tests
> -backup_no_engine     : Bug#34858 2008-Feb-28 Server crashes by backup tests
> -backup_objects       : Bug#34858 2008-Feb-28 Server crashes by backup tests
=======================
> diff -Nrup a/sql/backup/backup_progress.cc b/sql/backup/backup_progress.cc
> --- a/sql/backup/backup_progress.cc	2008-02-26 15:18:12 -05:00
> +++ b/sql/backup/backup_progress.cc	2008-03-14 08:51:07 -04:00
> @@ -276,6 +276,9 @@ int update_online_backup_int_field(ulong
>    table= locking_thd->tables_in_backup->table;
>    table->use_all_columns();
>  
> +  THD *t= table->in_use;
> +  table->in_use= current_thd;
> +
>    if (find_online_backup_row(table, backup_id))
>    {
>      ret= close_backup_progress_table(locking_thd);
> @@ -290,12 +293,17 @@ int update_online_backup_int_field(ulong
>    table->field[fld]->store(value, TRUE);
>    table->field[fld]->set_notnull();
>  
> +  tmp_disable_binlog(current_thd);
> +
>    /*
>      Update the row.
>    */
>    if ((ret= table->file->ha_update_row(table->record[1],
> table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    DBUG_RETURN(ret);
>  }
-----------------------
> @@ -336,6 +344,9 @@ int update_online_backup_datetime_field(
>    table= locking_thd->tables_in_backup->table;
>    table->use_all_columns();
>  
> +  THD *t= table->in_use;
> +  table->in_use= current_thd;
> +
>    if (find_online_backup_row(table, backup_id))
>    {
>      ret= close_backup_progress_table(locking_thd);
> @@ -356,12 +367,17 @@ int update_online_backup_datetime_field(
>      table->field[fld]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
>    }
>  
> +  tmp_disable_binlog(current_thd);
> +
>    /*
>      Update the row.
>    */
>    if ((ret= table->file->ha_update_row(table->record[1],
> table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    DBUG_RETURN(ret);
>  }
-----------------------
> @@ -470,16 +486,19 @@ ulonglong report_ob_init(int process_id,
>        goto end;
>      table->field[ET_FIELD_COMMAND]->set_notnull();
>    }
> -  table->in_use= t;
>  
>    table->next_number_field=table->found_next_number_field;
>  
> +  tmp_disable_binlog(current_thd);
> +
>    /*
>      Write the row.
>    */
>    if ((ret= table->file->ha_write_row(table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
>    /*
>      Get last insert id for row.
>    */
> @@ -488,6 +507,7 @@ ulonglong report_ob_init(int process_id,
>  
>  end:
>  
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    /*
>      Record progress update.
-----------------------
> @@ -557,7 +577,8 @@ int report_ob_binlog_info(ulonglong back
>        goto end;
>      table->field[ET_FIELD_BINLOG_FILE]->set_notnull();
>    }
> -  table->in_use= t;
> +
> +  tmp_disable_binlog(current_thd);
>  
>    /*
>      Update the row.
> @@ -565,8 +586,11 @@ int report_ob_binlog_info(ulonglong back
>    if ((ret= table->file->ha_update_row(table->record[1],
> table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
>  end:
>  
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    DBUG_RETURN(ret);
>  }
-----------------------
> @@ -753,7 +777,8 @@ int report_ob_engines(ulonglong backup_i
>        goto end;
>      table->field[ET_FIELD_ENGINES]->set_notnull();
>    }
> -  table->in_use= t;
> +
> +  tmp_disable_binlog(current_thd);
>  
>    /*
>      Update the row.
> @@ -761,8 +786,11 @@ int report_ob_engines(ulonglong backup_i
>    if ((ret= table->file->ha_update_row(table->record[1],
> table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
>  end:
>  
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    DBUG_RETURN(ret);
>  }
-----------------------
> @@ -872,7 +900,6 @@ int report_ob_progress(ulonglong backup_
>        goto end;
>      table->field[ET_FIELD_PROG_NOTES]->set_notnull();
>    }
> -  table->in_use= t;
>  
>    if (start)
>    {
> @@ -899,14 +926,19 @@ int report_ob_progress(ulonglong backup_
>    table->field[ET_FIELD_PROG_ERROR_NUM]->store(error_num, TRUE);
>    table->field[ET_FIELD_PROG_ERROR_NUM]->set_notnull();
>  
> +  tmp_disable_binlog(current_thd);
> +
>    /*
>      Write the row.
>    */
>    if ((ret= table->file->ha_write_row(table->record[0])))
>      table->file->print_error(ret, MYF(0));
>  
> +  reenable_binlog(current_thd);
> +
>  end:
>  
> +  table->in_use= t;
>    ret= close_backup_progress_table(locking_thd);
>    DBUG_RETURN(ret);
>  }
-----------------------
> @@ -951,10 +983,10 @@ ulonglong sum_progress_rows(ulonglong ba
>          (table->field[ET_FIELD_PROG_ERROR_NUM]->val_int() == 0) &&
>          ((ulonglong)table->field[ET_FIELD_BACKUP_ID_FK]->val_int() ==
> backup_id))
>        size+= table->field[ET_FIELD_PROG_SIZE]->val_int();
> -  table->in_use= t;
>  
>    hdl->ha_rnd_end();
>  
> +  table->in_use= t;
>    close_backup_progress_table(locking_thd);
>    DBUG_RETURN(size);
>  }
=======================
> diff -Nrup a/sql/backup/be_snapshot.cc b/sql/backup/be_snapshot.cc
> --- a/sql/backup/be_snapshot.cc	2007-11-29 23:22:05 -05:00
> +++ b/sql/backup/be_snapshot.cc	2008-03-14 08:51:08 -04:00
> @@ -121,6 +121,7 @@ result_t Backup::get_data(Buffer &buf)
>    if (locking_thd->lock_state == LOCK_SIGNAL)
>    {
>      locking_thd->lock_state= LOCK_DONE; // set lock done so destructor won't
> wait
> +    ha_autocommit_or_rollback(locking_thd->m_thd, 0);
>      end_active_trans(locking_thd->m_thd);
>      close_thread_tables(locking_thd->m_thd);
>    }
> 
> 
Thread
bk commit into 6.0 tree (cbell:1.2589) BUG#34858cbell14 Mar
  • Re: bk commit into 6.0 tree (cbell:1.2589) BUG#34858Guilhem Bichot14 Mar
  • Re: bk commit into 6.0 tree (cbell:1.2589) BUG#34858Rafal Somla17 Mar
    • RE: bk commit into 6.0 tree (cbell:1.2589) BUG#34858Chuck Bell17 Mar