2015-01-16 12 views
11

Giriş dosyalarını bir konumdan alan ve PDF'ler oluşturan, kara kutu üçüncü taraf bir Java programımız var. Dosyayı kontrollü bir şekilde beslememizi gerektiren her giriş için her defasında aynı konumda bir açık dosya koyar. Bildiri (veya .xen/.que) hala mevcut mu? Bir giriş dosyasını beslemeyin.Yeniden adlandırma sırasında bir dosyanın "varolmadığı" bir an var mı?

Besleme komut dosyamızın hiçbir şey bulmadığını, dosya beslemediğini ve ortaya çıkan hatanın üzerine yazıldığında ve hataların eşleşmediğinde çok nadir olduğunu (on binlerce dosyadan bir tanesini) alıyoruz. Hiçbir şey yapmayan ama 100 bine kadar süreyi basan, umursadığımız dizinin içindeki herhangi bir şeyi bir araya getiren ve yazdıran bir perl betiği yazdım. Aşağıda .xen girişinin olduğu .xen ve .que dosyalarını görebiliyorsunuz ve .que, işlemeyi göstermek için yeniden adlandırılmış bir sürümüdür.

Sorum şu: Bu, 94.26493'teki dosya eksikliği nasıl olabilir? İşletim sistemi yeniden adlandırılırken bir dosyayı gizler mi? Feed programı o anda dosyaları aradığında sorunum oluyor, bu yüzden planlanmış hack dosyalarımı iki kez kontrol etmektir; Yeniden adlandırmanın her iki ucunu yakalamak için yeterince yavaş. Ayrıca, 2 dosya bir satırda görüntülendiğinde, besleme programının başka bir dosya koyduğunu da belirtmeliyim. Yeniden adlandırmadan önceki dosya aynı değil.

1421417394.26392/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen 
1421417394.26416/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen 
1421417394.26442/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen 
1421417394.26468/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen 
1421417394.26493 
1421417394.26907/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265 
1421417394.27426/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265 
1421417394.27456/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265 
1421417394.27486/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265 
1421417394.27528/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265 
+1

Bildiğim kadarıyla, [yeniden adlandırmak POSIX sistemlerinde atomik bir işlemdir] (http://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on -windows), böylece dosyanın hem adından önce hem de adından sonra "var" olacağını düşünürdüm. Windows dosya işlemleri *, [Transactional NTFS] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb968806%28v=vs.85%29.aspx) kullanılmadıkça genellikle atomik değildir. ama bu soru "unix" olarak etiketlendiğinden, alakalı olmadığını tahmin ediyorum. – GoBusto

+0

Doğru, özellikle AIX – pete1450

+0

Perl programının ilgili bölümlerini ekleyebilir misiniz? –

cevap

9

fiili guarantee in POSIX zaten var ab ve b adlandırmak eğer b var olmayan biriyle, yeniden adlandırma sırasında zaman anlamı yok olacağıdır. Önceden var olan b ya da daha önce a olarak adlandırılan yeni b'a değinecektir.

b zaten mevcut değilse (örneğinizde böyle görünüyorsa), garanti uygulanmaz. Ne a ne de b'un bulunmadığı bir anın olması olasıdır (belirli dosya sisteminin nasıl çalıştığına bağlıdır). Ayrıca, a ve b'un her ikisinin de var olduğu bir an olması da mümkündür (ve aynı dosyaya bakın). Kısa bir gecikmeyle iki kez kontrol edilmesi önerilen çözümünüz muhtemelen en basit yaklaşımdır.

+0

Yanlış olduğumu umuyordum. Sağladığınız dokümanı okudum ve aynı sonuca vardım. Onay için teşekkürler. – pete1450

+1

Aynı dosya sistemiyse atomiktir (aynı bağlama noktası). Eğer dosya sistemlerini geçiyorsanız, her ikisinin de var olduğu ancak sistem ve uygulama arasında farklılık gösterebileceği uzun bir zaman olduğunu varsayabilirim. Ayrıca, tüm yorumlar aslında Java'nın kullanmayı seçebileceği veya seçmeyebileceği yeniden adlandır sistem çağrısıyla ilgilidir. Ayrıca, uzak bir dosya sistemi olan yoldaki "gpfs" yi de görüyorum, böylece tüm bahislerin kapalı olduğunu öneriyorum. :-) – pedz

+0

@pedz, 'rename', dosya sistemlerinde mutlaka çalışmamaktadır (işletim sistemi için desteklemeyen bir 'EXDEV' hatası var). Ayrıca, garanti, 'a' nin ne zaman varolduğu ya da bulunmadığı hakkında hiçbir şey söylemedi, sadece 'b' her zaman var olacaktır. – cjm

İlgili konular