इन परिस्थितियों में:कनेक्टिविटी हासिल करने के करीब दोहरे कनेक्शन से कैसे बचें?
- ग्राहक ZK के लिए नेटवर्क कनेक्टिविटी खो देता है।
- एक मिनट गुजरता है।
- ग्राहक जेड के लिए नेटवर्क कनेक्टिविटी प्राप्त करता है।
- ग्राहक ZK के लिए नेटवर्क कनेक्टिविटी खो देता है:
panic: close of closed channel goroutine 2849 [running]: github.com/samuel/go-zookeeper/zk.(*Conn).Close(0xc420795180) github.com/samuel/go-zookeeper/zk/conn.go:253 47 github.com/curator-go/curator.(*handleHolder).internalClose(0xc4203058f0, 0xc420302470, 0x0) github.com/curator-go/curator/state.go:136 +0x8d github.com/curator-go/curator.(*handleHolder).closeAndReset(0xc4203058f0, 0xc42587cd00, 0x1e) github.com/curator-go/curator/state.go:122 +0x2f github.com/curator-go/curator.(*connectionState).reset(0xc420302420, 0x1b71d87, 0xf) github.com/curator-go/curator/state.go:234 +0x55 github.com/curator-go/curator.(*connectionState).handleExpiredSession(0xc420302420) github.com/curator-go/curator/state.go:351 +0xd9 github.com/curator-go/curator.(*connectionState).checkState(0xc420302420, 0xffffff90, 0x0, 0x0, 0xc425ed2600, 0xed0e5250a) github.com/curator-go/curator/state.go:318 +0x9c github.com/curator-go/curator.(*connectionState).process(0xc420302420, 0xc425ed2680) github.com/curator-go/curator/state.go:299 +0x16d created by github.com/curator-go/curator.(*Watchers).Fire github.com/curator-go/curator/watcher.go:64 +0x96
यह घटनाओं की विस्तृत अनुक्रम है:
मैं निम्नलिखित आतंक हो रही है।
- ग्राहक ZK के लिए नेटवर्क कनेक्टिविटी खो देता है:
- एक मिनट गुजरता है।
- ग्राहक जेड के लिए नेटवर्क कनेक्टिविटी प्राप्त करता है।
- goroutine एक कॉल
s.ReregisterAll()
->Conn()
->checkTimeout()
->reset
(बीसी 1 मिनट बीत जाने पर) ->closeAndReset()
->conn.Close()
जो एक दूसरे - goroutine बी के लिए ब्लॉक कर सकते हैं संभालती
zk.StateExpired
(ZK क्लस्टर इस bc भेजता है यह इस ग्राहक के रूप में मृत मानता है क्योंकि यह 2. दौरान पिंग नहीं किया है) ->reset
->closeAndReset()
->conn.Close()
क्योंकिconn.Close()
पहले से ही कनेक्शन केc.shouldQuit
चैनल बंद कर दिया और क्योंकि यह के लिए अवरुद्ध किया गयाs.zooKeeper.getZookeeperConnection
goroutine A से कभी नहीं बुलाया गया था जो एक आतंक का कारण बनता है दूसरा तो कोई नया कनेक्शन नहीं है।
एक अनुभवहीन समाधान मैंने कोशिश की बस reset
पर एक म्युटेक्स उपयोग करने के लिए है, लेकिन अब मैं helper.GetConnectionString()
रिक्त स्ट्रिंग के बराबर हो रही है। इस दुर्घटना से बचने के लिए सबसे अच्छा तरीका क्या है और जब ग्राहक खो देता है और फिर नेटवर्क कनेक्टिविटी प्राप्त करता है तो एक अच्छी स्थिति में आने का प्रयास करता है? क्या फिक्स github.com/samuel/go-zookeeper के कार्यान्वयन में होना चाहिए जो आपको पहले से बंद कनेक्शन बंद करने की अनुमति न दे?
(मैं इस मुद्दे here दायर की है, लेकिन परियोजना चर्चा के संदर्भ में कमी है तो मैं इतने पर पूछ रहा हूँ लगता है।)
मैं इन पुस्तकालयों से परिचित नहीं हूं, लेकिन थोड़ी देर के लिए कोड को समझने के बाद मेरे पास एक प्रश्न है। क्या आपको पूरी तरह से 'zk.Conn' को त्यागने और एक नया डायल करने की आवश्यकता है, या फिर आपको इसे जारी रखने और पुन: कनेक्शन की अनुमति देने की आवश्यकता है। यदि आप त्यागना चाहते हैं, तो आपकी समस्या 'github.com/curator-go/curator' के साथ होने की संभावना है, अन्यथा यह मुद्दा' github.com/samuel/go-zookeeper' में है। मुझे यकीन नहीं है कि क्या मैं वास्तव में यहां बहुत मदद कर सकता हूं, लेकिन ऐसा कुछ हो सकता है जिसे आप अन्य पुस्तकालय के साथ संबोधित कर सकें। – RayfenWindspear
मुझे लगता है कि या तो काम करेगा। यह भेद मुझे यह हल करने के लिए एक अच्छा प्रारंभिक बिंदु के रूप में समझ में आता है। – lf215
मुझे लगता है कि इस समस्या को हल करने का आसान तरीका गो-जुकीपर का कांटा बना रहा है क्योंकि इस मुद्दे को बहुत समय पहले दायर किया गया है। https://github.com/samuel/go-zookeeper/issues/148 – mattn