← Back to team overview

maria-developers team mailing list archive

Re: [Commits] 922f970: MDEV-12882 - Assertion failed in MDL_context::upgrade_shared_lock

 

Hi, Sergey!

On Jun 22, Sergey Vojtovich wrote:
> revision-id: 922f9700a7fb084e3f7d6cff56e27e24fc603ed7 (mariadb-10.2.6-58-g922f970)
> parent(s): 62021f391a42c5577190aa43cb8ad91e56235b46
> committer: Sergey Vojtovich
> timestamp: 2017-06-22 17:35:36 +0400
> message:
> 
> MDEV-12882 - Assertion failed in MDL_context::upgrade_shared_lock
> 
> Relaxed assertion (in MySQL it was removed).
> For "LOCK TABLES t1 WRITE CONCURRENT, t1 READ" upgrade lock to weakest
> existing suitable lock, which is MDL_SHARED_NO_READ_WRITE.
> 
> diff --git a/mysql-test/t/mdl.test b/mysql-test/t/mdl.test
> new file mode 100644
> index 0000000..5a74ae5
> --- /dev/null
> +++ b/mysql-test/t/mdl.test
> @@ -0,0 +1,15 @@

Hm. I'd totally expect main.mdl test to exist for years :)

> diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
> index 412cd1d..7c910e8 100644
> --- a/sql/sql_parse.cc
> +++ b/sql/sql_parse.cc
> @@ -2787,6 +2787,7 @@ static bool lock_tables_open_and_lock_tables(THD *thd, TABLE_LIST *tables)
>                 ! table->prelocking_placeholder &&
>                 table->table->file->lock_count() == 0)
>        {
> +        enum enum_mdl_type lock_type;
>          /*
>            In case when LOCK TABLE ... READ LOCAL was issued for table with
>            storage engine which doesn't support READ LOCAL option and doesn't
> @@ -2799,9 +2800,12 @@ static bool lock_tables_open_and_lock_tables(THD *thd, TABLE_LIST *tables)
>          deadlock_handler.init();
>          thd->push_internal_handler(&deadlock_handler);
>  
> +        lock_type= table->table->mdl_ticket->get_type() == MDL_SHARED_WRITE ?
> +                   MDL_SHARED_NO_READ_WRITE : MDL_SHARED_READ_ONLY;
> +
>          bool result= thd->mdl_context.upgrade_shared_lock(
>                                          table->table->mdl_ticket,
> -                                        MDL_SHARED_READ_ONLY,
> +                                        lock_type,
>                                          thd->variables.lock_wait_timeout);

This only works if you lock WRITE, then READ. If you do it the other way
around, you'll get an error. Isn't it inconsistent?

Regards,
Sergei
Chief Architect MariaDB
and security@xxxxxxxxxxx


Follow ups