Я наблюдаю странное поведение, и мне интересно, не связано ли это с гонкой.
Странное поведение MySQL получает EEXIST
при попытке создать временный файл. MySQL повторно использует имена временных файлов по умолчанию, и поскольку он выбирает имена по порядку из пула имен, имя #sql_<pid>_0.<ext>
всегда выбирается первым, если он еще не используется (последний 0 указывает положение имени в пуле).
Я знаю, что NFS имитирует разъединение из-за требования сохранить блоки в открытом файле. Когда вы отключаете файл на томе NFS, клиент вместо этого переименовывает файл, а затем, когда процессы на клиенте закрывают его, наконец, отключают.
Но что, если я отключу файл, а затем второй поток попытается воссоздать файл с тем же именем в течение миллисекунды или около того после разрыва связи?
Возможно ли, что переименование является асинхронным и может быть отложено настолько, что второй поток получит ошибку EEXIST, даже если мой поток считает, что он успешно завершил свой вызов unlink ()?