Re[8]: mmap асинхронная запись
От: valuea  
Дата: 01.08.14 11:09
Оценка:
Здравствуйте, VVB16, Вы писали:
VVB>Конкретно в случае FreeBSD msync вообще не приводит к записи на диск с любыми ключами.
VVB>Только fsync заставит ОС сбросить все страницы на диск и только с его помощью можно обеспечить последовательность записи в данном случае.
Я конечно могу ошибаться, но вот что вижу
boolean_t vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size, boolean_t syncio, boolean_t invalidate) {
...
if (syncio && !invalidate && offset == 0 &&
OFF_TO_IDX(size) == object->size) {
/*
* If syncing the whole mapping of the file,
* it is faster to schedule all the writes in
* async mode, also allowing the clustering,
* and then wait for i/o to complete.
*/
flags = 0;
fsync_after = TRUE;
} else {
flags = (syncio || invalidate) ? OBJPC_SYNC : 0;
flags |= invalidate ? (OBJPC_SYNC | OBJPC_INVAL) : 0;
fsync_after = FALSE;
}
VM_OBJECT_WLOCK(object);
res = vm_object_page_clean(object, offset, offset + size,
flags);
VM_OBJECT_WUNLOCK(object);
if (fsync_after)
error = VOP_FSYNC(vp, MNT_WAIT, curthread);
VOP_UNLOCK(vp, 0);
vn_finished_write(mp);

Где VOP_FSYNC как раз и есть
int VOP_FSYNC(struct vnode *vp, int waitfor, struct thread *td);
DESCRIPTION
     This call flushes any dirty file system buffers for the file.  It is used
     to    implement the sync(2) and fsync(2) system calls.

А также writes in async mode, and then wait for i/o to complete.

VVB>На самом деле ситуация такая — если нужны гарантии на выполнение транзакции, надо ждать ее завершения. Если не ждать — нет гарантий.

Ну я подразумеваю все-таки немного разные ситуации:
1. Гарантия консистентности данных
2. Гарантия актуальный ответа вызывающей системе о состоянии данных в результате выполнения транзакции
То есть вызывающая система получает ответ об успешном завершении транзакции, хотя изменения в рамках данной тарнзакции могут быть и не сохранены. Данная гарантия теряется в угоду производительности, но гарантия консистентности данных все-же сохраняется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.