@@ -54,6 +54,7 @@ func (c *Client) Close() error {
5454func (c * Client ) Do (cmd string , args ... interface {}) (interface {}, error ) {
5555 r , err := c .conn .Do (cmd , args ... )
5656 if err != nil {
57+ c .Close ()
5758 return nil , errors .Trace (err )
5859 }
5960 c .LastUse = time .Now ()
@@ -64,9 +65,26 @@ func (c *Client) Do(cmd string, args ...interface{}) (interface{}, error) {
6465 return r , nil
6566}
6667
68+ func (c * Client ) Send (cmd string , args ... interface {}) error {
69+ if err := c .conn .Send (cmd , args ... ); err != nil {
70+ c .Close ()
71+ return errors .Trace (err )
72+ }
73+ return nil
74+ }
75+
76+ func (c * Client ) Flush () error {
77+ if err := c .conn .Flush (); err != nil {
78+ c .Close ()
79+ return errors .Trace (err )
80+ }
81+ return nil
82+ }
83+
6784func (c * Client ) Receive () (interface {}, error ) {
6885 r , err := c .conn .Receive ()
6986 if err != nil {
87+ c .Close ()
7088 return nil , errors .Trace (err )
7189 }
7290 c .LastUse = time .Now ()
@@ -170,11 +188,11 @@ func (c *Client) SetMaster(master string) error {
170188 if err != nil {
171189 return errors .Trace (err )
172190 }
173- c .conn . Send ("MULTI" )
174- c .conn . Send ("CONFIG" , "SET" , "masterauth" , c .Auth )
175- c .conn . Send ("SLAVEOF" , host , port )
176- c .conn . Send ("CONFIG" , "REWRITE" )
177- c .conn . Send ("CLIENT" , "KILL" , "TYPE" , "normal" )
191+ c .Send ("MULTI" )
192+ c .Send ("CONFIG" , "SET" , "masterauth" , c .Auth )
193+ c .Send ("SLAVEOF" , host , port )
194+ c .Send ("CONFIG" , "REWRITE" )
195+ c .Send ("CLIENT" , "KILL" , "TYPE" , "normal" )
178196 values , err := redigo .Values (c .Do ("EXEC" ))
179197 if err != nil {
180198 return errors .Trace (err )
@@ -385,10 +403,10 @@ func (p *Pool) getClientFromCache(addr string) (*Client, error) {
385403 return nil , nil
386404}
387405
388- func (p * Pool ) PutClient (c * Client ) {
406+ func (p * Pool ) PutClient (c * Client , err error ) {
389407 p .mu .Lock ()
390408 defer p .mu .Unlock ()
391- if p .closed || ! p .isRecyclable (c ) {
409+ if err != nil || p .closed || ! p .isRecyclable (c ) {
392410 c .Close ()
393411 } else {
394412 cache := p .pool [c .Addr ]
@@ -400,22 +418,30 @@ func (p *Pool) PutClient(c *Client) {
400418 }
401419}
402420
403- func (p * Pool ) Info (addr string ) (map [string ]string , error ) {
421+ func (p * Pool ) Info (addr string ) (_ map [string ]string , err error ) {
404422 c , err := p .GetClient (addr )
405423 if err != nil {
406424 return nil , err
407425 }
408- defer p .PutClient (c )
409- return c .Info ()
426+ defer p .PutClient (c , err )
427+ m , err := c .Info ()
428+ if err != nil {
429+ return nil , err
430+ }
431+ return m , nil
410432}
411433
412- func (p * Pool ) InfoFull (addr string ) (map [string ]string , error ) {
434+ func (p * Pool ) InfoFull (addr string ) (_ map [string ]string , err error ) {
413435 c , err := p .GetClient (addr )
414436 if err != nil {
415437 return nil , err
416438 }
417- defer p .PutClient (c )
418- return c .InfoFull ()
439+ defer p .PutClient (c , err )
440+ m , err := c .InfoFull ()
441+ if err != nil {
442+ return nil , err
443+ }
444+ return m , nil
419445}
420446
421447type InfoCache struct {
0 commit comments