2009-07-23 13 views
5

मेरे पास प्लोन आर्केटीप्स (प्लोन 2.5.एक्स) के आधार पर सैकड़ों हजार वस्तुएं हैं जिन्हें नवीनतम रूप से अपडेट की गई उनकी आर्केटीप्स स्कीमा की आवश्यकता है। आर्केटाइप स्कीमा माइग्रेशन टूल एक छोटी/मध्यम संख्या ऑब्जेक्ट्स के लिए बहुत अच्छा है, लेकिन मेरे सर्वर को उन सभी को माइग्रेट करने की कोशिश कर रहे घुटनों पर ला रहा है, जहां मैं हमेशा लिपि को मार डालता हूं। मैं एक समय में एक ऑब्जेक्ट की स्कीमा को अपडेट करने में सक्षम होना चाहता हूं, संभावित रूप से वस्तु को पुनर्प्राप्त करने के रूप में - क्या यह संभव है? यदि नहीं, तो बड़े प्लोन साइटों में आर्केटाइप स्कीमा को अपडेट करने के लिए कोई अन्य दृष्टिकोण?प्लोन में मांग पर एक आर्केटाइप ऑब्जेक्ट की स्कीमा को मैं कैसे अपडेट कर सकता हूं?

अग्रिम धन्यवाद!

+0

क्षमा करें, अपने प्रश्न को गलत तरीके से चिह्नित करें, चिह्न के बहुत तेज़। archetypes.schemaextender आपको यहां मदद नहीं करेगा। मैंने अपना जवाब हटाने के लिए वोट दिया है। –

+0

लेनेर्ट्स एवर पर टिप्पणियों को देखते हुए, क्या यह एक ज़ीईओ क्लाइंट जोड़ने और वहां माइग्रेशन करने का विकल्प है? यह साइट की प्रयोज्यता पर कम प्रभाव डाल सकता है * और * उसी उदाहरण पर माइग्रेशन कर रहा है। (मान लीजिए कि आप वर्तमान में क्या कर रहे हैं।) –

+0

हां, वर्तमान में मैं दुर्भाग्य से यह बहुत अधिक डेटा हूं। यह सिर्फ ज़ी होस्ट पर मेगा स्वैप का कारण बनता है जैसे कि अगर कोई असली अनुरोध आता है तो उसे जो भी वस्तु चाहिए उसे प्राप्त करने में काफी लंबा समय लगता है। निश्चित रूप से इसका स्पोराडिक। 2 छोटे अनुरोध और 5 सुपर लंबे समय तक। इसका एक बमर वहां एक साधारण आलसी अपग्रेड प्रतीत नहीं होता है। अगर मैं इस प्रक्रिया के बारे में और अधिक समझ गया तो मुझे एक लिखने में खुशी होगी, लेकिन यह रहस्य में थोड़ा सा झुका हुआ है। यह आश्चर्य की बात है क्योंकि यह पूरी लचीली डेटा चीज़ के साथ फिट नहीं है जो मुझे उम्मीद है। धन्यवाद !!! – eleddy

उत्तर

0

हालांकि आप यह नहीं समझाते कि "इसके घुटनों को लाने" का अर्थ क्या है, मैं अनुमान लगा रहा हूं कि आप स्मृति से बाहर हैं। यदि ऐसा है, तो शायद यह स्क्रिप्ट का एक प्रश्न है जो डिस्क में परिवर्तन नहीं कर रहा है। लूप में एक license.commit() जोड़ना (अधिमानतः केवल 100 वें या 1000 वें समय के लिए परीक्षण के साथ) इसे ठीक करना चाहिए।

संपादित करें: तो मैं गलत था, यह स्मृति समस्या नहीं थी। ऐसा लगता है कि archetypes updater सही चीज करता है।

if not self._isSchemaCurrent(): 
    logging.debug("updating schema for %s"%self.absolute_url()) 
     try: 
      import transaction 
      transaction.begin() 
      self._updateSchema() 
      transaction.commit() 
     except Exception, e: 
      logging.error('Error updating schema at %s: %s'%(self.absolute_url(), e)) 
      return False 
else: 
    logging.debug("schema for %s is up to date"%self.absolute_url()) 
    return True 

ध्यान दें कि यह प्लोन 2.5.3 और क्या मैं प्लोन के माध्यम से खुदाई की गई थी 3 दिखता से है:

+0

दुर्भाग्यवश, यह केवल एक स्मृति समस्या नहीं है। अद्यतन लोड (जैसे डिस्क IO) को काफी हद तक बढ़ने का कारण बनता है, और अधिक महत्वपूर्ण बात यह है कि अंत उपयोगकर्ता अद्यतन के प्रभाव को slooooowness के रूप में देखते हैं, इसलिए मैं हमेशा मैन्युअल रूप से हस्तक्षेप करता हूं और इसे मारता हूं। एक नियोजित आउटेज की संभावना हमेशा होती है लेकिन मैं मूर्खतापूर्ण स्कीमा अपडेट के लिए इससे बचने की कोशिश कर रहा हूं। मैं अभी मानक आर्केटाइप टूल अपडेट कोड चला रहा हूं और यह नहीं लगता कि एक आइटम को कैसे अपडेट किया जाए, अन्यथा मैं खुशी से लूप लिखूंगा और प्रतिबद्ध करूंगा। क्या आप इस उदाहरण को पोस्ट कर सकते हैं कि आप उस लूप को कैसे लिखेंगे? धन्यवाद! – eleddy

+0

ठीक है, निश्चित रूप से आईओ स्पाइक करने वाला है। क्या आपको लगता है कि डिस्क पर लिखे बिना डेटाबेस का भारी अपडेट कर सकते हैं? आपको वास्तव में वास्तविक समस्या नहीं लगती है। Archetypes उन्नयन चलाएं। –

+0

बेशक यह एक समस्या है जब ग्राहकों को भुगतान करने के लिए घंटे या पूर्ण आउटेज के लिए बकवास प्रतिक्रिया समय मिलता है।मुझे लगता है कि एक समय में एक आइटम को अपग्रेड करने का अनुरोध करना बहुत उचित है और मैंने सोचा कि कोड के एक छोटे स्निपेट के साथ यह एक आसान जवाब होगा। यदि यह संभव नहीं है तो यह संभव नहीं है और मैं अन्य विकल्पों को देखना शुरू कर दूंगा। मैं यहां कोड ढूंढ रहा हूं - मेरी समस्या क्या है पर एक व्याख्यान नहीं। – eleddy

5

2.5 सूची कोड के माध्यम से खुदाई के बाद, मैं अंत में एक आलसी स्कीमा अद्यतन का जवाब मिल गया है थोड़ा अलग। कुछ ऑब्जेक्ट्स के लिए जहां मैंने पहले से ही प्रक्रिया को अनुकूलित किया है, मैं अपग्रेड करता हूं ताकि फॉर्म नया फ़ील्ड प्रदर्शित कर सके और यह संसाधित हो जाएगा। दूसरों के लिए केवल at_post_edit_script हुक में, क्योंकि आमतौर पर उनमें महत्वपूर्ण महत्वपूर्ण स्कीमा अपग्रेड नहीं होते हैं। इसके अतिरिक्त फॉर्म प्रसंस्करण साइट का सबसे धीमा हिस्सा है, इसलिए उपयोगकर्ता अनुभव इतना प्रभावित नहीं होता है।

इसकी हैकी लेकिन यह आई/ओ splurges का कारण बनता है और यह वस्तुओं के सभी संस्करणों के साथ काम करता है। मैं इसे ले जाऊँगा!

+0

आप उस कोड को कैसे/कहां लगा रहे हैं? – rjmunro

+0

@rjmunro मेरे पास कस्टम आर्केटाइप कोड है, और मैंने इसे विभिन्न स्थानों पर रखा है, इस पर निर्भर करता है कि मुझे अपग्रेड की कितनी तेज़ी से आवश्यकता है। अधिकांश स्थानों पर यह at_post_edit हुक है। एक मामले में, मैं संपादन से पहले अपग्रेड करना चाहता हूं, इसलिए मैं प्रक्रिया को ओवरराइट करता हूं ताकि यह संपादन से पहले अपग्रेड हो। इस तरह से मैं संपादन फॉर्म में मैन्युअल रूप से नई स्कीमा सामग्री जोड़ सकता हूं और फिर इसके बारे में चिंता करने की ज़रूरत नहीं है। मैंने केवल उस मामले में वर्कफ़्लो को अपडेट करने के लिए कुछ ऐसा ही किया है, मैंने दृश्य टेम्पलेट के शीर्ष पर एक स्क्रिप्ट पर कॉल किया है जो दृश्य को अपडेट को ट्रिगर करता है। यदि आप कोड उदाहरण चाहते हैं तो मुझे बताएं :) – eleddy

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

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