Commit 5f795609 authored by mats@mysql.com's avatar mats@mysql.com

WL#3023 (RBR: Use locks in a statment-like manner):

  Interface changes pushed early.
  Separation of public and implementation interface for external_lock()
  in preparation for implementation.
parent 802c94dd
...@@ -3014,40 +3014,48 @@ template int binlog_log_row<Update_rows_log_event>(TABLE *, const byte *, const ...@@ -3014,40 +3014,48 @@ template int binlog_log_row<Update_rows_log_event>(TABLE *, const byte *, const
#endif /* HAVE_ROW_BASED_REPLICATION */ #endif /* HAVE_ROW_BASED_REPLICATION */
int handler::ha_external_lock(THD *thd, int lock_type)
{
int error;
if (unlikely(error= external_lock(thd, lock_type)))
return error;
return 0;
}
int handler::ha_write_row(byte *buf) int handler::ha_write_row(byte *buf)
{ {
int error; int error;
if (likely(!(error= write_row(buf)))) if (unlikely(error= write_row(buf)))
{ return error;
#ifdef HAVE_ROW_BASED_REPLICATION #ifdef HAVE_ROW_BASED_REPLICATION
error= binlog_log_row<Write_rows_log_event>(table, 0, buf); if (unlikely(error= binlog_log_row<Write_rows_log_event>(table, 0, buf)))
#endif
}
return error; return error;
#endif
return 0;
} }
int handler::ha_update_row(const byte *old_data, byte *new_data) int handler::ha_update_row(const byte *old_data, byte *new_data)
{ {
int error; int error;
if (likely(!(error= update_row(old_data, new_data)))) if (unlikely(error= update_row(old_data, new_data)))
{ return error;
#ifdef HAVE_ROW_BASED_REPLICATION #ifdef HAVE_ROW_BASED_REPLICATION
error= binlog_log_row<Update_rows_log_event>(table, old_data, new_data); if (unlikely(error= binlog_log_row<Update_rows_log_event>(table, old_data, new_data)))
#endif
}
return error; return error;
#endif
return 0;
} }
int handler::ha_delete_row(const byte *buf) int handler::ha_delete_row(const byte *buf)
{ {
int error; int error;
if (likely(!(error= delete_row(buf)))) if (unlikely(error= delete_row(buf)))
{ return error;
#ifdef HAVE_ROW_BASED_REPLICATION #ifdef HAVE_ROW_BASED_REPLICATION
error= binlog_log_row<Delete_rows_log_event>(table, buf, 0); if (unlikely(error= binlog_log_row<Delete_rows_log_event>(table, buf, 0)))
#endif
}
return error; return error;
#endif
return 0;
} }
......
...@@ -1237,6 +1237,7 @@ class handler :public Sql_alloc ...@@ -1237,6 +1237,7 @@ class handler :public Sql_alloc
interface, see the (private) functions write_row(), update_row(), interface, see the (private) functions write_row(), update_row(),
and delete_row() below. and delete_row() below.
*/ */
int ha_external_lock(THD *thd, int lock_type);
int ha_write_row(byte * buf); int ha_write_row(byte * buf);
int ha_update_row(const byte * old_data, byte * new_data); int ha_update_row(const byte * old_data, byte * new_data);
int ha_delete_row(const byte * buf); int ha_delete_row(const byte * buf);
...@@ -1378,7 +1379,6 @@ class handler :public Sql_alloc ...@@ -1378,7 +1379,6 @@ class handler :public Sql_alloc
{ return 0; } { return 0; }
virtual int extra_opt(enum ha_extra_function operation, ulong cache_size) virtual int extra_opt(enum ha_extra_function operation, ulong cache_size)
{ return extra(operation); } { return extra(operation); }
virtual int external_lock(THD *thd, int lock_type) { return 0; }
/* /*
In an UPDATE or DELETE, if the row under the cursor was locked by another In an UPDATE or DELETE, if the row under the cursor was locked by another
transaction, and the engine used an optimistic read of the last transaction, and the engine used an optimistic read of the last
...@@ -1626,6 +1626,12 @@ class handler :public Sql_alloc ...@@ -1626,6 +1626,12 @@ class handler :public Sql_alloc
overridden by the storage engine class. To call these methods, use overridden by the storage engine class. To call these methods, use
the corresponding 'ha_*' method above. the corresponding 'ha_*' method above.
*/ */
virtual int external_lock(THD *thd __attribute__((unused)),
int lock_type __attribute__((unused)))
{
return 0;
}
virtual int write_row(byte *buf __attribute__((unused))) virtual int write_row(byte *buf __attribute__((unused)))
{ {
return HA_ERR_WRONG_COMMAND; return HA_ERR_WRONG_COMMAND;
......
...@@ -229,12 +229,12 @@ static int lock_external(THD *thd, TABLE **tables, uint count) ...@@ -229,12 +229,12 @@ static int lock_external(THD *thd, TABLE **tables, uint count)
((*tables)->reginfo.lock_type >= TL_READ && ((*tables)->reginfo.lock_type >= TL_READ &&
(*tables)->reginfo.lock_type <= TL_READ_NO_INSERT)) (*tables)->reginfo.lock_type <= TL_READ_NO_INSERT))
lock_type=F_RDLCK; lock_type=F_RDLCK;
if ((error=(*tables)->file->external_lock(thd,lock_type))) if ((error=(*tables)->file->ha_external_lock(thd,lock_type)))
{ {
print_lock_error(error, (*tables)->file->table_type()); print_lock_error(error, (*tables)->file->table_type());
for (; i-- ; tables--) for (; i-- ; tables--)
{ {
(*tables)->file->external_lock(thd, F_UNLCK); (*tables)->file->ha_external_lock(thd, F_UNLCK);
(*tables)->current_lock=F_UNLCK; (*tables)->current_lock=F_UNLCK;
} }
DBUG_RETURN(error); DBUG_RETURN(error);
...@@ -562,7 +562,7 @@ static int unlock_external(THD *thd, TABLE **table,uint count) ...@@ -562,7 +562,7 @@ static int unlock_external(THD *thd, TABLE **table,uint count)
if ((*table)->current_lock != F_UNLCK) if ((*table)->current_lock != F_UNLCK)
{ {
(*table)->current_lock = F_UNLCK; (*table)->current_lock = F_UNLCK;
if ((error=(*table)->file->external_lock(thd, F_UNLCK))) if ((error=(*table)->file->ha_external_lock(thd, F_UNLCK)))
{ {
error_code=error; error_code=error;
print_lock_error(error_code, (*table)->file->table_type()); print_lock_error(error_code, (*table)->file->table_type());
......
...@@ -844,7 +844,7 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT() ...@@ -844,7 +844,7 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()
DBUG_PRINT("info", ("Freeing separate handler %p (free=%d)", file, DBUG_PRINT("info", ("Freeing separate handler %p (free=%d)", file,
free_file)); free_file));
file->ha_reset(); file->ha_reset();
file->external_lock(current_thd, F_UNLCK); file->ha_external_lock(current_thd, F_UNLCK);
file->close(); file->close();
delete file; delete file;
} }
...@@ -1008,14 +1008,14 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler) ...@@ -1008,14 +1008,14 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
/* Caller will free the memory */ /* Caller will free the memory */
goto failure; goto failure;
} }
if (file->external_lock(thd, F_RDLCK)) if (file->ha_external_lock(thd, F_RDLCK))
goto failure; goto failure;
if (file->extra(HA_EXTRA_KEYREAD) || if (file->extra(HA_EXTRA_KEYREAD) ||
file->ha_retrieve_all_pk() || file->ha_retrieve_all_pk() ||
init() || reset()) init() || reset())
{ {
file->external_lock(thd, F_UNLCK); file->ha_external_lock(thd, F_UNLCK);
file->close(); file->close();
goto failure; goto failure;
} }
......
...@@ -5254,7 +5254,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -5254,7 +5254,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
if (!(copy= new Copy_field[to->s->fields])) if (!(copy= new Copy_field[to->s->fields]))
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
if (to->file->external_lock(thd, F_WRLCK)) if (to->file->ha_external_lock(thd, F_WRLCK))
DBUG_RETURN(-1); DBUG_RETURN(-1);
/* We can abort alter table for any table type */ /* We can abort alter table for any table type */
...@@ -5394,7 +5394,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -5394,7 +5394,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
free_io_cache(from); free_io_cache(from);
*copied= found_count; *copied= found_count;
*deleted=delete_count; *deleted=delete_count;
if (to->file->external_lock(thd,F_UNLCK)) if (to->file->ha_external_lock(thd,F_UNLCK))
error=1; error=1;
DBUG_RETURN(error > 0 ? -1 : 0); DBUG_RETURN(error > 0 ? -1 : 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment