@@ -28,37 +28,41 @@ type PubSub struct {
28
28
cmd * Cmd
29
29
}
30
30
31
- func (c * PubSub ) conn () (* pool.Conn , bool , error ) {
31
+ func (c * PubSub ) conn () (* pool.Conn , error ) {
32
32
c .mu .Lock ()
33
- defer c .mu .Unlock ()
33
+ cn , err := c ._conn ()
34
+ c .mu .Unlock ()
35
+ return cn , err
36
+ }
34
37
38
+ func (c * PubSub ) _conn () (* pool.Conn , error ) {
35
39
if c .closed {
36
- return nil , false , pool .ErrClosed
40
+ return nil , pool .ErrClosed
37
41
}
38
42
39
43
if c .cn != nil {
40
- return c .cn , false , nil
44
+ return c .cn , nil
41
45
}
42
46
43
47
cn , err := c .base .connPool .NewConn ()
44
48
if err != nil {
45
- return nil , false , err
49
+ return nil , err
46
50
}
47
51
48
52
if ! cn .Inited {
49
53
if err := c .base .initConn (cn ); err != nil {
50
54
_ = c .base .connPool .CloseConn (cn )
51
- return nil , false , err
55
+ return nil , err
52
56
}
53
57
}
54
58
55
59
if err := c .resubscribe (cn ); err != nil {
56
60
_ = c .base .connPool .CloseConn (cn )
57
- return nil , false , err
61
+ return nil , err
58
62
}
59
63
60
64
c .cn = cn
61
- return cn , true , nil
65
+ return cn , nil
62
66
}
63
67
64
68
func (c * PubSub ) resubscribe (cn * pool.Conn ) error {
@@ -125,48 +129,48 @@ func (c *PubSub) Close() error {
125
129
// empty subscription if there are no channels.
126
130
func (c * PubSub ) Subscribe (channels ... string ) error {
127
131
c .mu .Lock ()
132
+ err := c .subscribe ("subscribe" , channels ... )
128
133
c .channels = appendIfNotExists (c .channels , channels ... )
129
134
c .mu .Unlock ()
130
- return c . subscribe ( "subscribe" , channels ... )
135
+ return err
131
136
}
132
137
133
138
// Subscribes the client to the given patterns. It returns
134
139
// empty subscription if there are no patterns.
135
140
func (c * PubSub ) PSubscribe (patterns ... string ) error {
136
141
c .mu .Lock ()
142
+ err := c .subscribe ("psubscribe" , patterns ... )
137
143
c .patterns = appendIfNotExists (c .patterns , patterns ... )
138
144
c .mu .Unlock ()
139
- return c . subscribe ( "psubscribe" , patterns ... )
145
+ return err
140
146
}
141
147
142
148
// Unsubscribes the client from the given channels, or from all of
143
149
// them if none is given.
144
150
func (c * PubSub ) Unsubscribe (channels ... string ) error {
145
151
c .mu .Lock ()
152
+ err := c .subscribe ("unsubscribe" , channels ... )
146
153
c .channels = remove (c .channels , channels ... )
147
154
c .mu .Unlock ()
148
- return c . subscribe ( "unsubscribe" , channels ... )
155
+ return err
149
156
}
150
157
151
158
// Unsubscribes the client from the given patterns, or from all of
152
159
// them if none is given.
153
160
func (c * PubSub ) PUnsubscribe (patterns ... string ) error {
154
161
c .mu .Lock ()
162
+ err := c .subscribe ("punsubscribe" , patterns ... )
155
163
c .patterns = remove (c .patterns , patterns ... )
156
164
c .mu .Unlock ()
157
- return c . subscribe ( "punsubscribe" , patterns ... )
165
+ return err
158
166
}
159
167
160
168
func (c * PubSub ) subscribe (redisCmd string , channels ... string ) error {
161
- cn , isNew , err := c .conn ()
169
+ cn , err := c ._conn ()
162
170
if err != nil {
163
171
return err
164
172
}
165
173
166
- if isNew {
167
- return nil
168
- }
169
-
170
174
err = c ._subscribe (cn , redisCmd , channels ... )
171
175
c .putConn (cn , err )
172
176
return err
@@ -179,7 +183,7 @@ func (c *PubSub) Ping(payload ...string) error {
179
183
}
180
184
cmd := NewCmd (args ... )
181
185
182
- cn , _ , err := c .conn ()
186
+ cn , err := c .conn ()
183
187
if err != nil {
184
188
return err
185
189
}
@@ -272,7 +276,7 @@ func (c *PubSub) ReceiveTimeout(timeout time.Duration) (interface{}, error) {
272
276
c .cmd = NewCmd ()
273
277
}
274
278
275
- cn , _ , err := c .conn ()
279
+ cn , err := c .conn ()
276
280
if err != nil {
277
281
return nil , err
278
282
}
0 commit comments