[MDEV-6531] MySQL Bug #72809 - InnoDB Linux native aio setup missing barrier after setup Created: 2014-08-05  Updated: 2016-02-16  Resolved: 2016-02-16

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB
Fix Version/s: 10.0.24

Type: Task Priority: Major
Reporter: Sergey Vojtovich Assignee: Axel Schwenke
Resolution: Cannot Reproduce Votes: 0
Labels: None

Issue Links:
PartOf
is part of MDEV-6530 Examine and apply Power8 patches sugg... Closed

 Description   

The following patch is suggested by Stewart Smith:

memory barrier at end of setting up innodb aio
 
we need a memory barrier here as otherwise when IO threads start they
can get a stale view of the data structure.
 
It turns out that POWER8 is fast enough with large enough caches that
this can actually be a problem.
 
You can reproduce this by attempting to do a lot of writes shortly after
server startup - you'll hit a really odd assert.
 
Index: mysql-5.6.17/storage/innobase/os/os0file.cc
===================================================================
--- mysql-5.6.17.orig/storage/innobase/os/os0file.cc
+++ mysql-5.6.17/storage/innobase/os/os0file.cc
@@ -3782,7 +3782,7 @@ skip_native_aio:
                slot->ret = 0;
 #endif /* WIN_ASYNC_IO */
        }
-
+       __sync_synchronize();
        return(array);
 }



 Comments   
Comment by Sergey Vojtovich [ 2014-08-05 ]

Quoting Stewart:

Basically, as InnoDB sets up the data structures for aio during startup, it creates a mutex but doesn't take it, thus not issuing any memory barriers.

It turns out that a POWER8 seems to be fast enough and with enough caches that you can get into runtime inside InnoDB with InnoDB doing IO where one of the InnoDB IO threads will hit an assert due to reading stale data left over from setting up AIO rather than runtime.

This patch adds __sync_synchronize() to
innobase_init()/innobase_start_or_create_for_mysql()/os_aio_init()/os_aio_array_create()

But I/O threads are created later in
innobase_init()/innobase_start_or_create_for_mysql()

And pthread_create() is supposed to synchronize memory anyway:
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11

Comment by Sergey Vojtovich [ 2014-08-05 ]

Closing as can't repeat for now. We will reopen this issue if we will be able to reproduce anything similar.

Comment by Axel Schwenke [ 2014-08-05 ]

will try to reproduce

Comment by Axel Schwenke [ 2016-02-16 ]

could not reproduce
since this is a race condition this means not much

Generated at Thu Feb 08 07:12:38 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.