2011-12-12 10 views
9

की वजह से क्रैश हो जाता है, मैं अपने स्वयं के स्टोरेज इंजन पर MySQL के लिए काम कर रहा हूं। अब तक यह स्टोरेज इंजन विश्वसनीय और सही काम करता है - लेकिन केवल छोटे (~ 100 एमबी) टेबल के लिए ... बड़ी टेबल के लिए, मुझे एक सेगमेंटेशन गलती मिलती है, जब मैं किसी ऑर्डर के साथ क्वेरी निष्पादित करने का प्रयास करता हूं, तो ऐसा कुछ एक segfault को बढ़ावा मिलेगा:मेरा स्वयं का स्टोरेज इंजन बहुत छोटा सॉर्ट_बफर

select * from item order by i_author; 

तो मैं डिबग मोड में MySQL संकलित, और देखा था, वहाँ अब filesort.cc में merge_buffers समारोह में एक अभिकथन विफलता है कि:

/* The following will fire if there is not enough space in sort_buffer */ 
DBUG_ASSERT(maxcount!=0); 

ईमानदारी से मैं इस त्रुटि को गायब करने के लिए मुझे पता नहीं है कि मैं अपने स्टोरेज इंजन में क्या बदल सकता हूं। ऐसा लगता है कि मुझे कॉन्फ़िगरेशन पैरामीटर sort_buffer_size को बदलना है - लेकिन तालिका के आकार से अधिक इस चीज़ को सेट करने से भी इस त्रुटि के साथ कुछ भी बदल जाता है।

क्या कोई भी, जो MySQL स्टोरेज इंजन को लिखना है, उसे कोई हल करने का कोई विचार है?

उत्तर

4

फाल्कन स्टोरेज इंजन के साथ एक समान issue की सूचना दी गई है। बग में टिप्पणी थी,

ऐसा लगता है कि जब आपके पास पंक्ति अनुमान है तो समस्याएं गंभीर रूप से गलत हैं।

शायद आपके स्टोरेज इंजन में कहीं भी एक बग है, लेकिन स्टैक ओवरफ़्लो के माध्यम से डीबग करना मुश्किल है।

+0

आह बहुत बहुत धन्यवाद, इस संकेत ने वास्तव में समस्या हल की। दस्तावेज़ीकरण के अनुसार, तालिका आकार के लिए सही अनुमान देना अनिवार्य नहीं है - जाहिर है कि दस्तावेज गलत है। अब मैंने अपने बाइनरी कुंजी इंडेक्स से अपने बी +-ट्री के उच्च रिकॉर्ड को रिकॉर्ड करना है और उसके आकार के लिए ऊपरी बाउंड की गणना करना है (क्योंकि केवल एक अनुमान की आवश्यकता है, सही मूल्य बहुत महंगा होगा)। अब मेरे सभी परीक्षण बड़े टेबल पर चलते हैं। धन्यवाद उस टिप के लिए बहुत कुछ! –

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