2010-11-24 13 views
9

Üretim ortamımda, Storable.pm tarafından oluşturulan bozuk depolanabilir bir kargı olduğuna inanıyoruz. Tam olarak teşhis etmeyi zorlaştıran Dev'deki davranışı çoğalamıyorum.Storable.pm - kesilmemiş bir dosyaya kaydederken bozuk

Kod uzun bir süredir çalışıyor ve kesintisi yapan değişiklik hash dosyasından siliyordu. Yakın zamana kadar, karma aynı boyutta kaldı veya büyüdü.

Dosya readwrite içinde açılır ve daha sonra store_fd dosyaya yazar. Karma şimdi (bazen) daha küçük olduğundan, bu 2000byte dosyasına için 1000bayt yazacaktır. 1000 bayt kuyruk eski, çöp verisi. Benim test durumlarda, hash elde ettiğimde, beklenen çöp verileri yok sayılır.

open($sf, "+< $self->{mod_state_filename}"); 
flock($sf, LOCK_EX); 
$self->{mod_state} = fd_retrieve($sf); 
delete ($self->{mod_state}{"somekey"}); 
seek($sf, 0, 0); 
store_fd($self->{mod_state}, $sf); 
flock($sf, LOCK_UN) 
close($sf); 

Sorularım:

  1. bu çalışma, ya da zorunlu Ben dosyayı kesecek olan Meli

    o?
  2. Depolanan karma, dosya sonlandırıcı karakterinin bir tür mu kullanıyor? Öyleyse, nedir?
  3. Yukarıdaki kod, 'un silinmesi ve eklenmesi ve silinmesi ve eklenmesi, , benim deneme durumumda mükemmel çalışır. herhangi bir test durumu dizisini kesilmeyen bir dosya nedeniyle başarısızlığa uğratabilecek bir şekilde önerebilir misiniz? (Bu 'un gerçekten belirsiz bir soru olduğunu biliyorum, bu yüzden 'u yoksayın).
+2

Neden depolanabilen yerleşik depo ve geri alma işlevlerini kullanmıyorsunuz? Storable ayrıca, http://search.cpan.org/~ams/Storable-2.24/Storable.pm#ADVISORY_LOCKING – singingfish

+0

'un kilitlenmesini de destekler, ancak kodu yazmamıştım. Miras almadan önce bu şekilde (silme hariç) bu şekilde oldu. Storable :: locking işlevini kullanmak için kodu değiştirmeyi düşünürdüm, ancak sorunumun giderilip giderilmeyeceğine (ve büyük ihtimalle bundan şüphelenmeyeceğine) dair hiçbir fikrim yok. (Ben deneyebilirim, ama problem sadece üretimde ortaya çıkıyor, bu yüzden düzeltmeden emin olmalıyım. Deneme yapamıyorum). Sorunumun kilitlenme nedeniyle olduğunu sanmıyorum. – Brock

cevap

1

o başa çıkabilirim olmadığı hakkında tüm şüphe ortadan kaldırarak, ben çöplük izi ile ne kadar iyi Storable fırsatları bilmiyorum, ama kesinlikle o store_fd çağrısının

truncate $sf, tell($sf); 

eklemek için zarar veremezler şimdi ve gelecekte.

+0

Peter, bana Shirley deme. Katılıyorum, ancak önce test koşullarında bunu onaylamak istedim, dolayısıyla soru. – Brock

0

Üzgünüm, bunu güncellediğimi düşündüm.

Perl5-porters'a sordum ve soruya cevaplar aldım.

Düzeltmeyi uygulamamışım, çünkü sınama altında çoğalamıyorum, bu yüzden üretim env'ime zorlamak istemiyorum, çalışmam şu an için daha güvenli.

Kesilmesi, perl5-porters yanıtlarına dayanan kesinlikle iyi bir fikirdir.

Birisinin soruma sahip olduğumu (veya yapamayacağını) bilmiyordum.