joce Architecte / Développeur principal "BugHunter" | c'est justement dans le cadre de mysql que je m'y interesse
Code :
- void close_temporary_tables(THD *thd)
- {
- TABLE *table,*next;
- char *query, *end;
- uint query_buf_size;
- bool found_user_tables = 0;
- if (!thd->temporary_tables)
- return;
- LINT_INIT(end);
- query_buf_size= 50; // Enough for DROP ... TABLE IF EXISTS
- for (table=thd->temporary_tables ; table ; table=table->next)
- /*
- We are going to add 4 ` around the db/table names, so 1 does not look
- enough; indeed it is enough, because table->key_length is greater (by 8,
- because of server_id and thread_id) than db||table.
- */
- query_buf_size+= table->key_length+1;
- if ((query = alloc_root(thd->mem_root, query_buf_size)))
- // Better add "if exists", in case a RESET MASTER has been done
- end=strmov(query, "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS " );
- for (table=thd->temporary_tables ; table ; table=next)
- {
- if (query) // we might be out of memory, but this is not fatal
- {
- // skip temporary tables not created directly by the user
- if (table->real_name[0] != '#')
- found_user_tables = 1;
- /*
- Here we assume table_cache_key always starts
- with \0 terminated db name
- */
- end = strxmov(end,"`",table->table_cache_key,"`.`",
- table->real_name,"`,", NullS);
- }
- next=table->next;
- close_temporary(table);
- }
- if (query && found_user_tables && mysql_bin_log.is_open())
- {
- /* The -1 is to remove last ',' */
- thd->clear_error();
- Query_log_event qinfo(thd, query, (ulong)(end-query)-1, 0, FALSE);
- /*
- Imagine the thread had created a temp table, then was doing a SELECT, and
- the SELECT was killed. Then it's not clever to mark the statement above as
- "killed", because it's not really a statement updating data, and there
- are 99.99% chances it will succeed on slave.
- If a real update (one updating a persistent table) was killed on the
- master, then this real update will be logged with error_code=killed,
- rightfully causing the slave to stop.
- */
- qinfo.error_code= 0;
- mysql_bin_log.write(&qinfo);
- }
- thd->temporary_tables=0;
- }
|
apparement cette fonction crash dans certains cas, quand un thread se termine et qu'on doit fermer les temp table rattachée à la connexion (et donc marquer DROP /*!40005 TEMPORARY */ TABLE IF EXISTS ... dans le binlog).
Me demande si c'est un problème d'estimation de la taille de query_buf_size ou un autre problème
Ce qui est bizarre c'est que si dans le thread y a des users temp table et des temp table "internes", il va quand même écrire dans le binlog le DROP TABLE sur la table interne
C'est louche Message édité par joce le 29-03-2005 à 03:10:53
|