Get returns new connection from session.
()
| 73 | |
| 74 | // Get returns new connection from session. |
| 75 | func (s *Session) Get() (conn rpc.Client, err error) { |
| 76 | s.Lock() |
| 77 | defer s.Unlock() |
| 78 | s.offset++ |
| 79 | s.offset %= conf.MaxRPCMuxPoolPhysicalConnection |
| 80 | |
| 81 | var ( |
| 82 | sess *mux.Session |
| 83 | stream *mux.Stream |
| 84 | sessions []*mux.Session |
| 85 | ) |
| 86 | |
| 87 | for { |
| 88 | if len(s.sess) <= s.offset { |
| 89 | // open new session |
| 90 | sess, err = s.newSession() |
| 91 | if err != nil { |
| 92 | return |
| 93 | } |
| 94 | s.sess = append(s.sess, sess) |
| 95 | s.offset = len(s.sess) - 1 |
| 96 | } else { |
| 97 | sess = s.sess[s.offset] |
| 98 | } |
| 99 | |
| 100 | // open connection |
| 101 | stream, err = sess.OpenStream() |
| 102 | if err != nil { |
| 103 | // invalidate session |
| 104 | sessions = nil |
| 105 | sessions = append(sessions, s.sess[0:s.offset]...) |
| 106 | sessions = append(sessions, s.sess[s.offset+1:]...) |
| 107 | s.sess = sessions |
| 108 | continue |
| 109 | } |
| 110 | |
| 111 | return rpc.NewClient(stream), nil |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | // Len returns physical connection count. |
| 116 | func (s *Session) Len() int { |
no test coverage detected