0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
impl Drop for FileDesc {
fn drop(&mut self) {
// Note that errors are ignored when closing a file descriptor. The
// reason for this is that if an error occurs we don't actually know if
// the file descriptor was closed or not, and if we retried (for
// something like EINTR), we might close another valid file descriptor
// opened after we closed ours.
let _ = unsafe { libc::close(self.fd) };
}
}
https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/fd.rs#L294
Похуй на ошибки возврата, да? Ведь из деструктора вернуть код ошибки нельзя, а исключения... А, это ж Раст, хуй с ними с исключениями короче.
Для ШЫНДОШЫ такая же хуйня, но тут они даже камент написать постыдились: https://github.com/rust-lang/rust/blob/master/library/std/src/sys/windows/handle.rs#L54
Вручную скинуть буфер на диск - тоже нечем, потому что функция, которой я пользовался в сишке, тут бесполезна:
https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/fs.rs#L861
https://github.com/rust-lang/rust/blob/master/library/std/src/sys/windows/fs.rs#L438
Короче, мне тут продакшон код надо писать за зарплату, а я не знаю, как вернуть юзеру информацию о неудачном закрытии. Что делать-тоа?!
Запостил: TarasB,
09 Февраля 2021
OCETuHCKuu_nemyx 09.02.2021 21:54 # +5
bormand 09.02.2021 22:10 # 0
Сделать явный close(), commit() или что там по смыслу подходит твоему коду и всегда вызывать его в конце успешной ветки. Там ты сможешь вернуть ошибку если что-то недофлашилось. А если дело до деструктора дойдёт -- забить хер на ошибку.
Х.з. как ещё это решить.
З.Ы. С возвращением!
TarasB 09.02.2021 22:14 # 0
bormand 09.02.2021 22:18 # +2
Fike 09.02.2021 23:11 # 0
https://mydbanotebook.org/post/fsync/
https://postgrespro.com/list/thread-id/2379543
а виновато конечно ядро, а не ебанарии, отказывающиеся мерджить поддержку int64 в 2021
bormand 09.02.2021 23:28 # 0
А разве нет? Там вроде глубже проблема, что рандомная прога или даже само ядро может случайно триггернуть флаш страничек твоего файла и обосраться, а потом fsync молча скажет, что всё заебись.
Fike 10.02.2021 00:26 # 0
bormand 10.02.2021 09:08 # 0
1) Открываем файл, пишем туда, успешно закрываем обычным close()
2) Через какое-то время ядро в фоне флашит буфера на диск, получает ошибку записи и забивает на неё
3) Открываем файл, пишем туда, делаем fsync() и close()
4) fsync() успешен, файл в середине запорот, профит!
Т.е. вроде бы и косяк постгри, что файл заново переоткрыли. А с другой стороны возникает вопрос -- а не возникнет ли такая ситуация и без переоткрытия?
bormand 10.02.2021 09:46 # 0
Ну т.е. к примеру:
1) Открываем файл, пишем туда, держим его открытым ещё час-другой
2) Через какое-то время ядро флашит буфера на диск, получает ошибку записи
3) Зовём fsync()
Есть ли гарантия, что fsync() зарепортит нам ошибку из пункта 2?
bormand 10.02.2021 09:49 # 0
Т.е. эту часть всё-таки пофиксили и такая гарантия есть. Если ядро свежее 2017 года.
Fike 10.02.2021 16:50 # +1
ну мы же говорим про постгрес
там реально люди в каком-то 99 живут
BJlADuMuPCKuu_nemxy 10.02.2021 16:51 # 0
JloJle4Ka 10.02.2021 17:38 # 0
zhigolo 14.02.2021 15:09 # 0
чем вызвал неодобрительный взгляд училки. Она меня еще и передразнила.
bormand 10.02.2021 17:58 # 0
Да нихуя... Проблема, которую в ядре 4.13 фиксили, стреляла и для процессов и для тредов и даже в однопоточной хуйне. Если джва хендла работали с разными кусками одного и того же файла, то они могли зафлашить чужой кусок и обработать его ошибку. Теперь ошибку от write-back кеша получают все заинтересованные, а не только первый.
Постгресовая бага в общем-то тоже от тредов/процессов не зависит. Если ты файл закрыл, то потом переоткрывать его и флашить уже поздно. Ядро трекает ошибки только для открытых хендлов, на заброшенные ему похуй.
bormand 10.02.2021 18:16 # 0
Desktop 10.02.2021 18:32 # +1
праально
vistefan 10.02.2021 19:25 # 0
bormand 10.02.2021 21:14 # 0
vistefan 11.02.2021 01:20 # 0
bormand 15.02.2021 00:58 # 0
MAKAKA 15.02.2021 01:00 # 0
привет
Fike 10.02.2021 18:37 # 0
bormand 10.02.2021 21:25 # 0
А работать с одним файлом через несколько хендлов в разных потоках/процессах -- вполне норм для СУБД, имхо. В прыщах же один хендл не получится юзать для параллельных записей.
MAKAKA 15.02.2021 01:03 # 0
bormand 15.02.2021 01:05 # 0
MAKAKA 15.02.2021 01:06 # 0
а , всё
у меня тут это
тред не читай
@
сразу отвечай
случился
bormand 15.02.2021 01:07 # 0
MAKAKA 15.02.2021 01:10 # 0
if the file offset is modified by
using lseek(2) on one of the file descriptors, the offset is also
changed for the other.
guest6 15.02.2021 01:20 # 0
Есть мнение, что писать в один и тот же файл из двух разных процессов не очень хорошо.
Хотя конечно в СУБД ты можешь поделить между ними странички
Fike 15.02.2021 01:49 # 0
но емнип постгрес как раз всё делит на постраничные файлы...
guest6 15.02.2021 02:12 # 0
По сути это файловая система внутри файла (ну вроде тосты отдельно хранятся).
Потому я и сказал, что для СУБД это ОК. А в целом странно.
Кстати, некоторые субд (оракл, MS-SQL) умеют срать на сырые партиции вообще. Странно, что постгря так не умеет.
bormand 15.02.2021 08:36 # 0
Да чуваки решили сэкономить на разработке. Типа в ядре должен быть хороший кеш-менеджер, зачем свой писать. Поэтому абузят файлуху в хвост и в гриву.
Так то отдельный раздел и выделенный регион памяти лучше были бы, конечно.
hormand 15.02.2021 12:28 # 0
guest6 15.02.2021 13:16 # 0
Хвала яхве, что хоть размер их странички кратен размеру страницы памяти
Desktop 09.02.2021 23:30 # +1
- хрюкнул как myebanoebook
Desktop 09.02.2021 23:36 # 0
а вроде и не пил сегодня
OCETuHCKuu_nemyx 10.02.2021 00:06 # 0
Ванишед-хуянишед!
Desktop 09.02.2021 22:50 # 0
ой, это про ВОЗВРАЩЕНИЕ, если что
j123123 10.02.2021 02:47 # 0
OCETuHCKuu_nemyx 10.02.2021 10:00 # 0
bormand 10.02.2021 10:17 # 0
OCETuHCKuu_nemyx 09.02.2021 22:15 # 0
bormand 09.02.2021 22:19 # 0
bormand 11.02.2021 13:58 # 0
TarasB 11.02.2021 21:33 # 0
Call File::sync_data or File::sync_all if you want to do your best to ensure that all of the data has been written fully through to the disk.
These are very expensive operations, so we don't call them automatically. Code that needs to make guarantees about data consistency should use them as necessary.
TarasB 11.02.2021 21:39 # 0
https://github.com/rust-lang/rust/blob/master/library/std/src/fs.rs#L307
Desktop 11.02.2021 21:56 # +3
bormand 11.02.2021 22:55 # 0
> very expensive
Ну... это реальная цена записи на диск, не более того. По сравнению с читерской записью во write-back кеш дорого, конечно.
TarasB 11.02.2021 23:59 # 0
Не могу, он приватный
zhigolo 14.02.2021 15:10 # −1
hormand 14.02.2021 23:12 # 0
hormand 15.02.2021 19:22 # 0
Wir werden angegriffen! Alle posten besetzen. Ich wederchole: wir werden angegriffen!
3.14159265 22.08.2021 14:54 # +3
Мои глаза!!!
Тарас перешёл на дrustню (!) и ностальгирует по Сишке (!!).
> Похуй на ошибки возврата, да?
> это ж Раст, хуй с ними с исключениями короче.
Да, «Си» это не самый хуёвый язык как оказалось.