Sebuah rename() di Linux yang diamati melalui inotify dapat menghasilkan dua record dengan cookie nonzero yang sama: IN_MOVED_FROM untuk directory entry lama dan IN_MOVED_TO untuk entry baru. Cookie tersebut mengorelasikan kedua record, tetapi tidak mengubahnya menjadi satu item queue yang atomik.
Batas ini penting bagi perangkat lunak yang memelihara indeks pathname, menyinkronkan state direktori, atau mengubah notifikasi filesystem menjadi record perubahan tingkat lebih tinggi. Rename merupakan satu operasi filesystem, sedangkan representasinya di inotify dapat berupa pasangan dengan properti pengelompokan delivery yang lebih lemah.
Cookie membawa korelasi, bukan state transaksi
Setiap struct inotify_event memiliki field cookie. Linux saat ini memakai cookie nonzero untuk menghubungkan event rename IN_MOVED_FROM dan IN_MOVED_TO; tipe event lain memakai nilai nol.
struct inotify_event {
int wd;
uint32_t mask;
uint32_t cookie;
uint32_t len;
char name[];
};Untuk move antara dua direktori yang sama-sama dipantau, event sisi sumber menyebut entry lama dan event sisi tujuan menyebut entry baru. Cookie yang cocok memungkinkan user space mengaitkan kedua observasi tersebut.
Watch descriptor dan name tetap mendeskripsikan masing-masing sisi secara terpisah. Cookie tidak memuat pathname, nomor inode, generation counter, atau identifier transaksi yang persisten. Cakupan praktisnya adalah korelasi di antara event rename yang dikirim oleh instance inotify tersebut.
Event yang berpasangan tidak harus bersebelahan
Stream event inotify memiliki urutan, tetapi pasangan IN_MOVED_FROM dan IN_MOVED_TO yang cocok tidak dijamin menempati posisi bersebelahan. Aktivitas dari proses lain dapat menempatkan record yang tidak terkait di antara keduanya.
Pasangan tersebut juga tidak dimasukkan ke queue sebagai satu unit yang tidak dapat dipisahkan. User space dapat mengamati kondisi ketika event sumber sudah tersedia sementara event tujuan pasangannya belum muncul.
Consumer yang menganggap record tepat setelah IN_MOVED_FROM pasti merupakan pasangannya berarti menerapkan syarat yang lebih kuat daripada kontrak interface. Pencocokan berbasis cookie memerlukan state yang dapat menoleransi record lain di antaranya.
IN_MOVED_FROM cookie=41 name=old.db
IN_CREATE cookie=0 name=marker
IN_MOVED_TO cookie=41 name=new.dbRecord di tengah tidak memutus relasi rename. Posisi bersebelahan bukan bagian dari relasi tersebut.
Batas watch dapat membuat satu sisi tidak terlihat
Pairing juga dibatasi oleh namespace yang dipantau. Jika sebuah file berpindah dari direktori yang dipantau ke direktori yang tidak dipantau oleh instance inotify yang sama, sisi sumber dapat menghasilkan IN_MOVED_FROM tanpa IN_MOVED_TO yang terlihat.
Bentuk sebaliknya dapat terjadi ketika objek masuk dari luar himpunan yang dipantau: sisi tujuan terlihat sementara sisi sumber tidak.
Akibatnya, record move tanpa pasangan bersifat ambigu pada saat dibaca. Record itu dapat menunjukkan perpindahan yang melintasi batas pemantauan, atau pasangannya mungkin belum tiba. Menunggu pasangan merupakan kebijakan di user space, bukan jaminan completion dari cookie.
Queue overflow membatalkan state yang diturunkan dari event
Sebuah instance inotify memiliki event queue dengan kapasitas terbatas. Saat overflow terjadi, Linux melaporkan IN_Q_OVERFLOW dan sejumlah event telah hilang. Pada kondisi ini, cache pathname yang hanya diturunkan dari notifikasi sebelumnya tidak lagi dapat mengasumsikan bahwa semua transisi filesystem telah terwakili.
Rename pairing tidak dapat memperbaiki histori yang hilang. Sebuah cookie yang masih pending mungkin kehilangan pasangannya, dan event create, delete, atau attribute lain juga dapat hilang.
Sistem yang membutuhkan mirror konsisten umumnya memerlukan jalur pemulihan yang membangun ulang state terkait dari filesystem setelah overflow. Stream notifikasi kemudian berfungsi sebagai sumber sinyal inkremental di antara proses rekonsiliasi, bukan journal otoritatif.
Event coalescing juga membatasi semantik penghitungan
Linux dapat menggabungkan event inotify berurutan yang belum dibaca ketika watch descriptor, mask, cookie, dan namanya identik. Mekanisme ini mengurangi tekanan pada queue, tetapi juga membuat stream tidak cocok sebagai penghitung operasi yang andal.
Properti tersebut terpisah dari rename pairing, namun menegaskan batas arsitektural yang sama: inotify melaporkan aktivitas filesystem untuk pemeliharaan state reaktif; interface ini bukan log transaksi lossless.
Untuk penanganan rename, cookie menyediakan relasi yang presisi ketika kedua record move tersedia. State machine tetap perlu menangani pasangan yang terlambat, batas himpunan yang dipantau, queue overflow, serta rekonsiliasi terhadap state filesystem terkini.