File descriptor inotify memaparkan aktivitas filesystem sebagai antrean terurut berisi record event, tetapi antrean tersebut bukan riwayat otoritatif atas state namespace. Event identik yang belum dibaca dapat digabungkan, kapasitas antrean terbatas, dan overflow secara eksplisit berarti sejumlah event telah hilang. Proses yang memperlakukan aliran ini sebagai transaction log lengkap dapat mempertahankan state yang tidak lagi sesuai dengan filesystem.
Model yang lebih tepat adalah notifikasi perubahan dengan kewajiban pemulihan. Event dapat menjaga cache tetap mutakhir secara inkremental selama alirannya utuh; kondisi tertentu memutus riwayat inkremental tersebut dan menuntut rekonsiliasi terhadap state filesystem.
Record event menggambarkan observasi, bukan transaksi
inotify_init1() membuat instance inotify dengan antrean event. Watch yang ditambahkan melalui inotify_add_watch() mengaitkan watch descriptor dengan objek filesystem dan event mask. Pembacaan descriptor inotify mengembalikan satu atau beberapa record struct inotify_event dengan panjang variabel.
Setiap record memuat watch descriptor, mask, cookie, dan nama child opsional. Field tersebut mengidentifikasi event yang teramati dalam cakupan pemantauan. Field itu tidak menyediakan transaction identifier untuk seluruh filesystem, versi snapshot, atau sequence number yang durable.
Perbedaannya terlihat saat satu operasi logis menghasilkan beberapa record. Pemindahan file di antara dua direktori yang dipantau dapat menghasilkan IN_MOVED_FROM untuk direktori sumber dan IN_MOVED_TO untuk direktori tujuan. Cookie nonzero yang sama memungkinkan aplikasi mengaitkan keduanya, tetapi pasangan tersebut tetap dikirim melalui antrean event biasa.
Event lain dapat muncul di antara kedua record. Pasangan itu juga tidak dijamin masuk ke antrean secara atomik. Consumer karena itu perlu menerima kemungkinan bahwa record move dari sisi sumber sudah terlihat sementara pasangan dari sisi tujuan belum tersedia.
Cookie rename mengorelasikan event tanpa membuat pengiriman atomik
Cookie rename merupakan metadata korelasi, bukan batas transaksi. Cookie memungkinkan pencocokan record move terkait ketika kedua sisi teramati, tetapi tidak menjamin bahwa kedua record berada dalam cakupan pemantauan consumer.
Jika file dipindahkan dari direktori yang dipantau ke direktori yang tidak dipantau, consumer dapat menerima IN_MOVED_FROM tanpa IN_MOVED_TO. Pemindahan ke dalam cakupan pantauan dapat menghasilkan bentuk sebaliknya. Queue overflow juga dapat menghilangkan record yang semestinya membentuk pasangan.
Karena itu, pencocokan rename berbasis timeout adalah kebijakan aplikasi, bukan semantik kernel. Consumer dapat menyimpan sementara record move tanpa pasangan, tetapi pada akhirnya perlu mengklasifikasikannya sesuai model cache sendiri. Cookie tidak menyatakan bahwa pasangan yang belum ada pasti akan datang.
Pathname menambahkan race lain. Event menyebut child sebagaimana keterkaitannya dengan direktori yang dipantau saat event dibuat. Ketika user space memproses record tersebut, operasi berikutnya mungkin sudah mengganti nama atau menghapus path itu. Resolusi ulang nama dari event menanyakan state filesystem saat ini, bukan state historis objek ketika event dibuat.
Coalescing menghapus semantik jumlah event
Linux dapat menggabungkan event inotify berurutan yang belum dibaca jika watch descriptor, mask, cookie, dan namanya identik. Mekanisme ini mengurangi tekanan pada antrean, tetapi juga menghilangkan pemetaan yang andal antara jumlah record event dan jumlah operasi.
Consumer dapat memakai IN_MODIFY sebagai sinyal bahwa isi berubah. Consumer tidak dapat menyimpulkan tiga write terjadi hanya karena menerima tiga record modifikasi, atau satu write terjadi hanya karena menerima satu record.
Batas ini relevan untuk counter, audit trail, dan protokol replikasi. Jika aplikasi memerlukan setiap mutasi sebagai fakta durable yang terpisah, semantik notifikasi inotify saja tidak memadai. State filesystem atau sumber transaksional lain harus membawa informasi otoritatif.
Coalescing tidak membuat notifikasi hasilnya menjadi salah. Mekanisme itu mengubah granularitas observasi. Satu record dapat mewakili beberapa perubahan ekuivalen yang terjadi sebelum record lebih lama dikonsumsi.
Queue overflow memutus riwayat cache inkremental
Kernel membatasi jumlah event yang dapat mengantre pada satu instance inotify. Ketika batas tersebut terlampaui, event berlebih dibuang dan aliran melaporkan IN_Q_OVERFLOW dengan watch descriptor -1.
Setelah overflow, consumer tidak mengetahui perubahan mana yang hilang. Melanjutkan penerapan event berikutnya ke cache secara umum tidak dapat merekonstruksi interval yang hilang. Create, rename, dan delete dapat terjadi saat record hilang tanpa menyisakan notifikasi berikutnya yang mengungkap riwayat path di tengahnya.
Untuk cache dengan invariant “sesuai dengan state filesystem saat ini”, overflow menjadi batas rekonsiliasi. Aplikasi dapat membangun ulang tampilan terkait dari filesystem, membuat ulang watch bila sesuai, lalu melanjutkan pemrosesan inkremental dari baseline baru.
Cakupan pemulihan bergantung pada cache. Proses yang memelihara satu direktori mungkin cukup melakukan rescan direktori tersebut. Proses dengan model rekursif dapat memerlukan rekonstruksi lebih luas karena directory move yang hilang dapat membuat pathname descendant dalam cache menjadi tidak valid.
Pemantauan rekursif memiliki race saat pemasangan watch
Watch inotify pada sebuah direktori tidak otomatis mencakup descendant secara rekursif. Pemantauan rekursif dibangun di user space dengan menambahkan watch untuk subdirektori.
Hal ini menciptakan celah waktu untuk direktori yang baru dibuat atau baru dipindahkan masuk. Event pada parent dapat memberi tahu proses bahwa subdirektori muncul, tetapi file dapat dibuat di dalam subdirektori tersebut sebelum proses memasang watch baru. Operasi child itu tidak wajib terwakili dalam aliran event yang dilihat consumer.
Desain cache dapat mengompensasi dengan memindai subdirektori baru setelah memasang watch. Scan membentuk state saat ini untuk celah tersebut; notifikasi berikutnya menjaganya secara inkremental. Rekonsiliasi tetap perlu diperhatikan karena perubahan filesystem dapat terus berlangsung selama scan.
Mekanisme ini menunjukkan batas yang lebih luas: recursive watcher adalah komposisi watch per objek di user space, bukan subscription rekursif atomik yang dipasang sekaligus pada seluruh directory tree.
Watch descriptor adalah handle yang memerlukan bookkeeping pathname
Event mengidentifikasi watch melalui integer watch descriptor. Aplikasi yang menyajikan state berbasis path biasanya memelihara pemetaan dari watch descriptor ke pathname atau identitas objek internal lain.
Directory move membuat pemetaan tersebut memiliki state. Jika direktori yang dipantau berpindah di dalam tree, cached path untuk descendant dapat menjadi usang meski watch descriptor masih berguna. Mengubah hanya path direktori yang dipindahkan dapat meninggalkan entry descendant dengan prefix lama.
Deletion dan unmount menambah transisi lifetime. IN_IGNORED melaporkan bahwa watch telah dihapus, baik secara eksplisit maupun karena objek yang dipantau hilang atau filesystem-nya di-unmount. Consumer perlu memperlakukan identitas watch sebagai objek dengan lifecycle, bukan alias pathname permanen.
Hard link makin memisahkan identitas objek dari identitas path. Beberapa pathname dapat merujuk inode yang sama, sementara watch terkait dengan objek filesystem yang dicapai saat watch dipasang. Cache path di atas mekanisme tersebut harus menetapkan nama mana yang direpresentasikan.
Notifikasi dan otoritas berada pada lapisan berbeda
inotify sesuai sebagai pemicu invalidation, reload, indexing, atau pemeliharaan cache ketika consumer menerima model pemulihannya. File descriptor-nya juga dapat dipadukan dengan poll() dan epoll, sehingga notifikasi filesystem dapat berbagi event loop dengan socket, timer, dan sumber readiness lain.
Sifat integrasi tersebut tidak mengubah aliran menjadi jurnal. Pengiriman terurut berlaku pada record yang mencapai antrean. Cookie rename mengorelasikan event move terkait yang teramati. Keduanya tidak memulihkan jumlah operasi yang terkena coalescing, event yang hilang akibat overflow, celah recursive watch, atau state path yang sudah berubah sebelum user space memproses record.
Desain yang kuat karena itu menetapkan sumber otoritas secara eksplisit. inotify membawa petunjuk inkremental tentang perubahan; filesystem menyediakan state namespace dan metadata saat ini; storage aplikasi dapat menyediakan riwayat yang lebih kuat ketika record mutasi presisi dibutuhkan. Setelah aliran notifikasi menyatakan riwayatnya tidak lengkap, correctness berasal dari pembangunan ulang terhadap lapisan otoritatif, bukan dari ekstrapolasi event yang tersisa.