2017-06-30 9 views
11

इन परिस्थितियों में:कनेक्टिविटी हासिल करने के करीब दोहरे कनेक्शन से कैसे बचें?

  1. ग्राहक ZK के लिए नेटवर्क कनेक्टिविटी खो देता है।
  2. एक मिनट गुजरता है।
  3. ग्राहक जेड के लिए नेटवर्क कनेक्टिविटी प्राप्त करता है।

    1. ग्राहक 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 
      

      यह घटनाओं की विस्तृत अनुक्रम है:

    मैं निम्नलिखित आतंक हो रही है।

  4. एक मिनट गुजरता है।
  5. ग्राहक जेड के लिए नेटवर्क कनेक्टिविटी प्राप्त करता है।
  6. goroutine एक कॉल s.ReregisterAll() ->Conn() ->checkTimeout() ->reset (बीसी 1 मिनट बीत जाने पर) ->closeAndReset() ->conn.Close()जो एक दूसरे
  7. 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 दायर की है, लेकिन परियोजना चर्चा के संदर्भ में कमी है तो मैं इतने पर पूछ रहा हूँ लगता है।)

+3

मैं इन पुस्तकालयों से परिचित नहीं हूं, लेकिन थोड़ी देर के लिए कोड को समझने के बाद मेरे पास एक प्रश्न है। क्या आपको पूरी तरह से 'zk.Conn' को त्यागने और एक नया डायल करने की आवश्यकता है, या फिर आपको इसे जारी रखने और पुन: कनेक्शन की अनुमति देने की आवश्यकता है। यदि आप त्यागना चाहते हैं, तो आपकी समस्या 'github.com/curator-go/curator' के साथ होने की संभावना है, अन्यथा यह मुद्दा' github.com/samuel/go-zookeeper' में है। मुझे यकीन नहीं है कि क्या मैं वास्तव में यहां बहुत मदद कर सकता हूं, लेकिन ऐसा कुछ हो सकता है जिसे आप अन्य पुस्तकालय के साथ संबोधित कर सकें। – RayfenWindspear

+0

मुझे लगता है कि या तो काम करेगा। यह भेद मुझे यह हल करने के लिए एक अच्छा प्रारंभिक बिंदु के रूप में समझ में आता है। – lf215

+2

मुझे लगता है कि इस समस्या को हल करने का आसान तरीका गो-जुकीपर का कांटा बना रहा है क्योंकि इस मुद्दे को बहुत समय पहले दायर किया गया है। https://github.com/samuel/go-zookeeper/issues/148 – mattn

उत्तर

0

zk.Conn एक विधि राज्य() है कि एक enum देता है "राज्य" है, जो निम्न में से एक है:

type State int32 
const (
    StateUnknown   State = -1 
    StateDisconnected  State = 0 
    StateConnecting  State = 1 
    StateAuthFailed  State = 4 
    StateConnectedReadOnly State = 5 
    StateSaslAuthenticated State = 6 
    StateExpired   State = -112 

    StateConnected = State(100) 
    StateHasSession = State(101) 
) 

क्या राज्य "क्ोन" है जब goroutine बी कॉल conn.Close में()?

एक संभावित समाधान goroutine बी में स्विच जोड़ने के लिए होगा जिससे आप conn को कॉल नहीं करते हैं। बंद करें() यदि आप conn.StateConnecting में हैं।

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