Unit testing for def/ module.
Added unit tests to test code in def/ module.
This commit is contained in:
parent
e24b8a08c9
commit
bac60e872a
396 changed files with 83991 additions and 13209 deletions
98
vendor/github.com/samuel/go-zookeeper/zk/conn.go
generated
vendored
98
vendor/github.com/samuel/go-zookeeper/zk/conn.go
generated
vendored
|
@ -409,13 +409,11 @@ func (c *Conn) resendZkAuth(reauthReadyChan chan struct{}) {
|
|||
defer close(reauthReadyChan)
|
||||
|
||||
if c.logInfo {
|
||||
c.logger.Printf("Re-submitting `%d` credentials after reconnect",
|
||||
len(c.creds))
|
||||
c.logger.Printf("re-submitting `%d` credentials after reconnect", len(c.creds))
|
||||
}
|
||||
|
||||
for _, cred := range c.creds {
|
||||
if shouldCancel() {
|
||||
c.logger.Printf("Cancel rer-submitting credentials")
|
||||
return
|
||||
}
|
||||
resChan, err := c.sendRequest(
|
||||
|
@ -428,7 +426,7 @@ func (c *Conn) resendZkAuth(reauthReadyChan chan struct{}) {
|
|||
nil)
|
||||
|
||||
if err != nil {
|
||||
c.logger.Printf("Call to sendRequest failed during credential resubmit: %s", err)
|
||||
c.logger.Printf("call to sendRequest failed during credential resubmit: %s", err)
|
||||
// FIXME(prozlach): lets ignore errors for now
|
||||
continue
|
||||
}
|
||||
|
@ -437,14 +435,14 @@ func (c *Conn) resendZkAuth(reauthReadyChan chan struct{}) {
|
|||
select {
|
||||
case res = <-resChan:
|
||||
case <-c.closeChan:
|
||||
c.logger.Printf("Recv closed, cancel re-submitting credentials")
|
||||
c.logger.Printf("recv closed, cancel re-submitting credentials")
|
||||
return
|
||||
case <-c.shouldQuit:
|
||||
c.logger.Printf("Should quit, cancel re-submitting credentials")
|
||||
c.logger.Printf("should quit, cancel re-submitting credentials")
|
||||
return
|
||||
}
|
||||
if res.err != nil {
|
||||
c.logger.Printf("Credential re-submit failed: %s", res.err)
|
||||
c.logger.Printf("credential re-submit failed: %s", res.err)
|
||||
// FIXME(prozlach): lets ignore errors for now
|
||||
continue
|
||||
}
|
||||
|
@ -486,14 +484,14 @@ func (c *Conn) loop() {
|
|||
err := c.authenticate()
|
||||
switch {
|
||||
case err == ErrSessionExpired:
|
||||
c.logger.Printf("Authentication failed: %s", err)
|
||||
c.logger.Printf("authentication failed: %s", err)
|
||||
c.invalidateWatches(err)
|
||||
case err != nil && c.conn != nil:
|
||||
c.logger.Printf("Authentication failed: %s", err)
|
||||
c.logger.Printf("authentication failed: %s", err)
|
||||
c.conn.Close()
|
||||
case err == nil:
|
||||
if c.logInfo {
|
||||
c.logger.Printf("Authenticated: id=%d, timeout=%d", c.SessionID(), c.sessionTimeoutMs)
|
||||
c.logger.Printf("authenticated: id=%d, timeout=%d", c.SessionID(), c.sessionTimeoutMs)
|
||||
}
|
||||
c.hostProvider.Connected() // mark success
|
||||
c.closeChan = make(chan struct{}) // channel to tell send loop stop
|
||||
|
@ -508,7 +506,7 @@ func (c *Conn) loop() {
|
|||
}
|
||||
err := c.sendLoop()
|
||||
if err != nil || c.logInfo {
|
||||
c.logger.Printf("Send loop terminated: err=%v", err)
|
||||
c.logger.Printf("send loop terminated: err=%v", err)
|
||||
}
|
||||
c.conn.Close() // causes recv loop to EOF/exit
|
||||
wg.Done()
|
||||
|
@ -523,7 +521,7 @@ func (c *Conn) loop() {
|
|||
err = c.recvLoop(c.conn)
|
||||
}
|
||||
if err != io.EOF || c.logInfo {
|
||||
c.logger.Printf("Recv loop terminated: err=%v", err)
|
||||
c.logger.Printf("recv loop terminated: err=%v", err)
|
||||
}
|
||||
if err == nil {
|
||||
panic("zk: recvLoop should never return nil error")
|
||||
|
@ -697,20 +695,28 @@ func (c *Conn) authenticate() error {
|
|||
|
||||
binary.BigEndian.PutUint32(buf[:4], uint32(n))
|
||||
|
||||
c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout * 10))
|
||||
if err := c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout * 10)); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = c.conn.Write(buf[:n+4])
|
||||
c.conn.SetWriteDeadline(time.Time{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.conn.SetWriteDeadline(time.Time{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Receive and decode a connect response.
|
||||
c.conn.SetReadDeadline(time.Now().Add(c.recvTimeout * 10))
|
||||
if err := c.conn.SetReadDeadline(time.Now().Add(c.recvTimeout * 10)); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = io.ReadFull(c.conn, buf[:4])
|
||||
c.conn.SetReadDeadline(time.Time{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.conn.SetReadDeadline(time.Time{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
blen := int(binary.BigEndian.Uint32(buf[:4]))
|
||||
if cap(buf) < blen {
|
||||
|
@ -772,14 +778,18 @@ func (c *Conn) sendData(req *request) error {
|
|||
c.requests[req.xid] = req
|
||||
c.requestsLock.Unlock()
|
||||
|
||||
c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout))
|
||||
if err := c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout)); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = c.conn.Write(c.buf[:n+4])
|
||||
c.conn.SetWriteDeadline(time.Time{})
|
||||
if err != nil {
|
||||
req.recvChan <- response{-1, err}
|
||||
c.conn.Close()
|
||||
return err
|
||||
}
|
||||
if err := c.conn.SetWriteDeadline(time.Time{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -802,13 +812,17 @@ func (c *Conn) sendLoop() error {
|
|||
|
||||
binary.BigEndian.PutUint32(c.buf[:4], uint32(n))
|
||||
|
||||
c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout))
|
||||
if err := c.conn.SetWriteDeadline(time.Now().Add(c.recvTimeout)); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = c.conn.Write(c.buf[:n+4])
|
||||
c.conn.SetWriteDeadline(time.Time{})
|
||||
if err != nil {
|
||||
c.conn.Close()
|
||||
return err
|
||||
}
|
||||
if err := c.conn.SetWriteDeadline(time.Time{}); err != nil {
|
||||
return err
|
||||
}
|
||||
case <-c.closeChan:
|
||||
return nil
|
||||
}
|
||||
|
@ -823,10 +837,12 @@ func (c *Conn) recvLoop(conn net.Conn) error {
|
|||
buf := make([]byte, sz)
|
||||
for {
|
||||
// package length
|
||||
conn.SetReadDeadline(time.Now().Add(c.recvTimeout))
|
||||
if err := conn.SetReadDeadline(time.Now().Add(c.recvTimeout)); err != nil {
|
||||
c.logger.Printf("failed to set connection deadline: %v", err)
|
||||
}
|
||||
_, err := io.ReadFull(conn, buf[:4])
|
||||
if err != nil {
|
||||
return err
|
||||
return fmt.Errorf("failed to read from connection: %v", err)
|
||||
}
|
||||
|
||||
blen := int(binary.BigEndian.Uint32(buf[:4]))
|
||||
|
@ -838,10 +854,12 @@ func (c *Conn) recvLoop(conn net.Conn) error {
|
|||
}
|
||||
|
||||
_, err = io.ReadFull(conn, buf[:blen])
|
||||
conn.SetReadDeadline(time.Time{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := conn.SetReadDeadline(time.Time{}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
res := responseHeader{}
|
||||
_, err = decodePacket(buf[:16], &res)
|
||||
|
@ -874,7 +892,7 @@ func (c *Conn) recvLoop(conn net.Conn) error {
|
|||
c.watchersLock.Lock()
|
||||
for _, t := range wTypes {
|
||||
wpt := watchPathType{res.Path, t}
|
||||
if watchers := c.watchers[wpt]; watchers != nil && len(watchers) > 0 {
|
||||
if watchers, ok := c.watchers[wpt]; ok {
|
||||
for _, ch := range watchers {
|
||||
ch <- ev
|
||||
close(ch)
|
||||
|
@ -1220,6 +1238,38 @@ func (c *Conn) Multi(ops ...interface{}) ([]MultiResponse, error) {
|
|||
return mr, err
|
||||
}
|
||||
|
||||
// IncrementalReconfig is the zookeeper reconfiguration api that allows adding and removing servers
|
||||
// by lists of members.
|
||||
// Return the new configuration stats.
|
||||
func (c *Conn) IncrementalReconfig(joining, leaving []string, version int64) (*Stat, error) {
|
||||
// TODO: validate the shape of the member string to give early feedback.
|
||||
request := &reconfigRequest{
|
||||
JoiningServers: []byte(strings.Join(joining, ",")),
|
||||
LeavingServers: []byte(strings.Join(leaving, ",")),
|
||||
CurConfigId: version,
|
||||
}
|
||||
|
||||
return c.internalReconfig(request)
|
||||
}
|
||||
|
||||
// Reconfig is the non-incremental update functionality for Zookeeper where the list preovided
|
||||
// is the entire new member list.
|
||||
// the optional version allows for conditional reconfigurations, -1 ignores the condition.
|
||||
func (c *Conn) Reconfig(members []string, version int64) (*Stat, error) {
|
||||
request := &reconfigRequest{
|
||||
NewMembers: []byte(strings.Join(members, ",")),
|
||||
CurConfigId: version,
|
||||
}
|
||||
|
||||
return c.internalReconfig(request)
|
||||
}
|
||||
|
||||
func (c *Conn) internalReconfig(request *reconfigRequest) (*Stat, error) {
|
||||
response := &reconfigReponse{}
|
||||
_, err := c.request(opReconfig, request, response, nil)
|
||||
return &response.Stat, err
|
||||
}
|
||||
|
||||
// Server returns the current or last-connected server name.
|
||||
func (c *Conn) Server() string {
|
||||
c.serverMu.Lock()
|
||||
|
|
Reference in a new issue