Apa yang terjadi jika file diubah saat Anda menyalinnya?

19

Apa efek dari menyalin file katakan fileA.big (900mb) dari lokasi B ke locationC. Jika selama operasi cp itu, katakan 35% melalui proses, fileA.big ditambahkan dengan informasi baru dan tumbuh dari 900mb menjadi 930mb.

Apa hasil dari salinan akhir (yaitu fileA.big di locationC)?

Bagaimana jika salinannya sekitar 70% melalui, dan file asli diperbarui tetapi kali ini dipotong menjadi 400mb (yaitu kemajuan salinan berada di luar titik pemotongan), apa hasil dari salinan akhir?

Mengacu pada OS linux pada sistem file ext3 / ext4. Tidak ada volume shadow magic dll. Cp tua biasa saja. Keingintahuan dipicu dengan menyalin file couchdb langsung untuk cadangan, tetapi lebih tertarik pada skenario umum daripada kasus penggunaan khusus.

Pak Freman
sumber
Terima kasih telah bertanya yang satu ini. 'Pengetahuan' saya sebagian besar merupakan dugaan ... sampai sekarang.
tshepang

Jawaban:

10

Jika fileA.bigditanam selama salinan, salinan akan mencakup data yang ditambahkan.

Jika file terpotong lebih pendek daripada di mana salinan saat ini berada, salinan akan dibatalkan tepat di mana di dan file tujuan akan berisi apa yang disalin hingga saat dibatalkan.

Patrick
sumber
27

Patrick kira-kira benar, tetapi inilah sebabnya. Cara Anda menyalin file di bawah UNIX berfungsi seperti ini:

  1. Cobalah untuk membaca beberapa (lebih) byte dari fileA.
  2. Jika kami gagal mendapatkan byte karena kami berada di (atau melewati) akhir file, kami selesai; berhenti.
  3. Kalau tidak, tulis byte ke fileBdan loop kembali ke langkah 1.

Mengetahui hal itu, dan mengetahuinya sesederhana itu, mari kita lihat beberapa kasing sudut.

Segera setelah kami menemukan akhir file, salinan selesai. Jadi misalkan file kita bertambah selama salin, tetapi tumbuh lebih lambat daripada kita menyalinnya. Program penyalinan akan terus melampaui ukuran file asli, karena pada saat ia sampai di sana, ada lebih banyak file. Tetapi pada beberapa titik, ia mengejar dengan akhir file, dan ia tahu itu pada akhirnya karena tidak dapat membaca byte lagi sekarang . Jadi itu berhenti di sana, bahkan jika file tersebut akan tumbuh lebih lanjut.

Jika file tersebut terpotong, program salin mengatakan "Wah, saya melewati akhir file!" dan berhenti.

Dan jika potongan-potongan file diperbarui secara acak oleh, katakanlah, program database :-), maka salinan Anda akan menjadi campuran dari data lama dan baru, karena data tidak semuanya disalin pada saat yang bersamaan. Hasilnya mungkin akan menjadi salinan yang rusak, itulah sebabnya itu umumnya bukan ide yang baik untuk membuat salinan dari database hidup.

(Yang mengatakan, saya tidak terbiasa dengan CouchDB, dan dimungkinkan untuk merancang basis data agar tahan terhadap korupsi semacam ini. Tetapi yang terbaik adalah benar-benar yakin.)

Jander
sumber
Penjelasan yang bagus. BTW, ini selalu mengejutkan saya mengapa ini mungkin di bawah OS seperti UNIX tanpa mendapatkan pesan kesalahan yang dikenal dari Windows ("Tidak dapat mengakses file - file yang digunakan") Anda bahkan tidak dapat memutar file MP3 yang sudah dihapus saat memainkannya. Di bawah Unix, Anda dapat (secara mengejutkan) - tanpa masalah sama sekali. Saya kira OS berbasis UNIX selalu bekerja dengan salinan cadangan file, jadi ini layak.
syntaxerror
1
Sebenarnya, bisa membaca file yang dihapus berasal dari fitur UNIX yang berbeda: di bawah UNIX, file dan nama file adalah hal yang berbeda. Saat Anda menghapus file, apa yang sebenarnya Anda lakukan adalah menghapus "tautan" bernama ke file tersebut. Ketika sebuah program membuka file, itu juga dianggap sebagai tautan. Sistem akan menghapus file itu sendiri hanya jika tidak ada tautan yang tersisa.
Jander
Jadi jika file tumbuh lebih cepat dari yang bisa kita salin, cp tidak akan pernah berakhir? Saya menyadari itu tidak mungkin, karena apa pun yang menulis ke file harus dapat menulis ke file, lebih cepat daripada cp dapat membacanya.
Bladt