renameat2() dengan RENAME_EXCHANGE mengubah dua directory entry yang sudah ada sebagai satu operasi rename atomik. Sebelum pemanggilan, setiap pathname mengarah ke objek asalnya; setelah pemanggilan berhasil, setiap pathname mengarah ke objek yang sebelumnya memakai path satunya. Tidak ada keadaan sukses antara kedua titik itu ketika salah satu nama hanya terhapus atau tertimpa.
Sifat ini berbeda dari rename() biasa. Rename konvensional dapat mengganti destination secara atomik, tetapi replacement menghilangkan nama destination dari namespace. Exchange mempertahankan kedua objek bernama dan menukar posisi keduanya.
Kedua pathname harus sudah ada
RENAME_EXCHANGE mensyaratkan objek pada oldpath dan newpath. Jika destination path tidak ada, operasi gagal dan tidak berubah menjadi rename biasa.
Transisi namespace-nya adalah:
before:
oldpath -> inode A
newpath -> inode B
renameat2(..., RENAME_EXCHANGE)
after success:
oldpath -> inode B
newpath -> inode ASifat ini berguna saat dua state filesystem yang lengkap perlu bertukar nama yang terlihat tanpa memarkir salah satunya sementara di pathname ketiga. Jaminan atomik berlaku pada operasi exchange itu sendiri, bukan pada pekerjaan lain sebelum atau sesudahnya.
Exchange tidak menukar isi file
Operasi ini mengubah directory entry. Operasi tersebut tidak menyalin byte antarfail, menggabungkan metadata, atau menulis ulang open file description.
File descriptor yang sudah terbuka tetap merujuk ke objek file yang sama setelah pathname ditukar. Kode yang membuka oldpath sebelum pemanggilan tidak mengalami pengalihan descriptor ke objek yang kemudian tampil pada oldpath.
Batas antara identitas pathname dan referensi descriptor yang sudah terbentuk dapat digambarkan sebagai berikut:
fd = open("oldpath", ...)
RENAME_EXCHANGE(oldpath, newpath)
fd -> original object A
lookup(oldpath) -> object B
lookup(newpath) -> object AProses yang memegang descriptor dan proses yang melakukan pathname lookup baru dapat mengamati generasi namespace berbeda tanpa membuat salah satu referensi menjadi tidak konsisten.
Tipe objek yang berbeda dapat dipertukarkan
Untuk RENAME_EXCHANGE, kedua path harus ada, tetapi kedua objek boleh memiliki tipe berbeda. Dokumentasi Linux mencantumkan kasus seperti pertukaran non-empty directory dengan symbolic link.
Ini merupakan operasi namespace yang lebih kuat daripada aturan replacement biasa. Perangkat lunak yang memakai pemanggilan ini tidak dapat menganggap objek pada pathname yang tetap akan mempertahankan tipe sebelumnya setelah actor lain melakukan exchange.
Batas permission, mount, dan filesystem yang berlaku pada operasi rename tetap berlaku. Atomic exchange bukan jalan untuk melewati pathname resolution atau kebijakan filesystem.
Operasi tetap dibatasi oleh satu mounted filesystem
Operasi rename tidak memindahkan objek melintasi batas mounted filesystem. RENAME_EXCHANGE tidak mengubah perpindahan lintas filesystem menjadi operasi atomik.
Desain yang menempatkan dua path pada mounted filesystem berbeda tidak dapat memakai flag ini sebagai primitive transaksi umum. Penyalinan data ke filesystem lain lalu perubahan nama merupakan rangkaian terpisah dengan sifat kegagalan dan durability yang berbeda.
Jaminan namespace atomik juga tidak sama dengan urutan persistent storage. System call yang berhasil menetapkan hasil namespace yang terlihat sesuai semantik rename. Crash durability bergantung pada perilaku filesystem dan operasi sinkronisasi yang dibutuhkan aplikasi.
RENAME_NOREPLACE dan RENAME_EXCHANGE menyatakan transisi yang tidak kompatibel
RENAME_NOREPLACE meminta kegagalan ketika destination sudah ada. RENAME_EXCHANGE justru mensyaratkan destination ada agar dapat ikut dalam pertukaran.
Linux menolak pemanggilan yang menggabungkan kedua flag tersebut. Keduanya menyatakan aturan destination yang saling bertentangan:
RENAME_NOREPLACE:
newpath absent -> rename may proceed
newpath present -> fail
RENAME_EXCHANGE:
newpath absent -> fail
newpath present -> exchange may proceedMenganggap flag sebagai feature switch yang berdiri sendiri akan mengabaikan konflik semantik ini. Flag tersebut memilih transisi rename yang berbeda, bukan sekadar menumpuk modifier bebas pada satu operasi.
Visibilitas atomik tidak membentuk transaksi multi-operasi
Salah satu penggunaan exchange adalah publication: siapkan replacement tree lengkap di bawah satu nama, lalu tukarkan dengan tree yang sedang terlihat. Swap mencegah observer menemui celah pathname di antara kedua nama tersebut.
Fase persiapan tetap berada di luar exchange. Perubahan selama pembangunan replacement dapat gagal secara terpisah, dan cleanup objek lama setelah swap merupakan operasi lain. Jika aplikasi memerlukan publication yang konsisten terhadap crash, protokol durability harus memperhitungkan data file, update directory, dan jaminan persistence dari filesystem.
RENAME_EXCHANGE menyediakan primitive yang sempit tetapi kuat: dua nama yang sudah ada berganti referent secara bersamaan. Batas atomiknya berakhir pada transisi namespace tersebut.