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 }