github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/zk/zookeeper.update.go (about)

     1  package zk
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/sereiner/library/encoding"
     8  )
     9  
    10  // Update 更新一个节点的值,如果存在则更新,如果不存在则报错
    11  func (client *ZookeeperClient) Update(path string, data string, version int32) (err error) {
    12  	if !client.isConnect {
    13  		err = ErrColientCouldNotConnect
    14  		return
    15  	}
    16  	if client.done {
    17  		err = ErrClientConnClosing
    18  		return
    19  	}
    20  	// 判断节点是否存在
    21  	if b, err := client.Exists(path); !b || err != nil {
    22  		return fmt.Errorf("update node %s fail(node is not exists : %t, err : %v)", path, b, err)
    23  	}
    24  
    25  	// 启动一个协程,更新节点
    26  	ch := make(chan error, 1)
    27  	go func(ch chan error) {
    28  
    29  		buff := encoding.Encode(data, "gbk")
    30  		_, err = client.conn.Set(path, buff, version)
    31  
    32  		ch <- err
    33  
    34  	}(ch)
    35  
    36  	// 启动一个计时器,判断更新节点是否超时
    37  	select {
    38  	case <-time.After(TIMEOUT):
    39  		err = fmt.Errorf("update node %s timeout", path)
    40  		return
    41  	case err = <-ch:
    42  		return err
    43  	}
    44  }