2010-11-24 12 views
9

मेरे उत्पादन माहौल में हमारे पास भ्रष्ट स्टेश हैश, Storable.pm द्वारा बनाई गई है, जो हम मानते हैं। मैं देव में व्यवहार को दोहराने में असमर्थ हूं, जिसने वास्तव में निदान करना मुश्किल बना दिया है।Storable.pm - गैर-छिड़काव फ़ाइल को सहेजते समय दूषित

कोड लंबे समय से काम कर रहा है, और जिस बदलाव ने इसे ब्रेक को हैश से हटा दिया था। हाल ही में तक, हैश या तो एक ही आकार में रहा, या बढ़ गया।

फ़ाइल को पटकथा में खोला गया है, और फिर store_fd फ़ाइल को लिखता है। हैश अब (कभी-कभी) छोटा है, यह 1000bytes से इस 2000byte फ़ाइल को लिखने के लिए कहेंगे। पूंछ 1000 बाइट पुराने, कचरा डेटा हैं। मेरे परीक्षण मामलों में, जब मैं हैश पुनर्प्राप्त करता हूं, तो कचरा डेटा को अनदेखा किया जाता है, क्योंकि अपेक्षित है।

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); 

मेरे सवालों का:

  1. इस काम है, या यह जरूरी मैं फ़ाइल काटना है कि है चाहिए?
  2. क्या संग्रहीत हैश फ़ाइल टर्मिनेटर चरित्र के किसी प्रकार का उपयोग करता है? यदि ऐसा है, तो यह क्या है?
  3. उपरोक्त कोड, हटाकर और जोड़ना और हटाना, मेरे परीक्षण मामले में पूरी तरह से काम करता है। क्या आप किसी भी टेस्ट केस अनुक्रम का सुझाव दे सकते हैं जो गैर-कटा हुआ फ़ाइल के कारण विफल हो सकता है? (मुझे पता है कि यह वास्तव में अस्पष्ट प्रश्न है, इसलिए इसे अनदेखा करने के लिए स्वतंत्र महसूस करें)।
+2

आप स्टोरेज के निर्मित स्टोर का उपयोग क्यों नहीं कर रहे हैं और कार्यों को पुनर्प्राप्त नहीं कर रहे हैं। आराध्य भी लॉकिंग का समर्थन करता है http://search.cpan.org/~ams/Storable-2.24/Storable.pm#ADVISORY_LOCKING – singingfish

+0

मुझे पता है कि यह करता है, लेकिन मैंने कोड नहीं लिखा था। इससे पहले कि मैंने इसे विरासत में लिया था, इस तरह से (हटाए जाने के अलावा)। मैं स्टेरेट :: लॉकिंग का उपयोग करने के लिए कोड को बदलने पर विचार करता हूं, लेकिन मुझे नहीं पता कि यह होगा (और संदेह है कि यह संभवतः नहीं होगा) मेरी समस्या को ठीक करें। (मैं कोशिश कर सकता था, लेकिन समस्या केवल उत्पादन में दिखाई देती है, इसलिए मुझे फिक्स के बारे में सुनिश्चित होना चाहिए। मैं परीक्षण और त्रुटि नहीं कर सकता)। मुझे नहीं लगता कि मेरी समस्या लॉक होने के कारण है। – Brock

उत्तर

1

मैं कचरा पूर्ण विराम वाले को कितनी अच्छी तरह Storable सौदों पता नहीं है, लेकिन निश्चित रूप से यह store_fd करने के लिए कॉल के बाद

truncate $sf, tell($sf); 

जोड़ने के लिए चोट नहीं कर सकते हैं, के बारे में है कि क्या इसके साथ सौदा कर सकते हैं सभी संदेह दूर करने अब और भविष्य में।

+0

पीटर, मुझे शर्ली मत कहो। मैं सहमत हूं, लेकिन मैं पहले टेस्ट स्थितियों में इसकी पुष्टि करना चाहता था, इसलिए सवाल। – Brock

0

क्षमा करें, मैंने सोचा कि मैंने इसे अपडेट किया है।

मैंने perl5-porters से पूछा, और इस सवाल का जवाब मिला।

मैंने फिक्स को लागू नहीं किया है, क्योंकि मैं परीक्षण के तहत दोहराना नहीं कर सकता, इसलिए मेरे उत्पादन env को धक्का नहीं देना चाहता, मेरे काम के आसपास इस समय के लिए सुरक्षित है।

ट्रर्लिंग निश्चित रूप से perl5-porters के उत्तरों के आधार पर एक अच्छा विचार है।

मुझे नहीं पता था कि किसी के पास (या कर सकता है!) मेरे प्रश्न पर एक बक्षीस डाल सकता है।

संबंधित मुद्दे