Documentation ¶
Overview ¶
Package zk emulates a "global" namespace across n zk quorums.
Index ¶
- Constants
- Variables
- func ChildrenRecursive(zconn Conn, zkPath string) ([]string, error)
- func CreateOrUpdate(zconn Conn, zkPath, value string, flags int, aclv []zookeeper.ACL, ...) (pathCreated string, err error)
- func CreateRecursive(zconn Conn, zkPath, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error)
- func DeleteRecursive(zconn Conn, zkPath string, version int) error
- func GetZkSubprocessFlags() []string
- func GuessLocalCell() string
- func IsDirectory(aclv []zookeeper.ACL) bool
- func ObtainQueueLock(zconn Conn, zkPath string, wait time.Duration, interrupted <-chan struct{}) error
- func ResolveWildcards(zconn Conn, zkPaths []string) ([]string, error)
- func ZkCellFromZkPath(zkPath string) (string, error)
- func ZkKnownCells() ([]string, error)
- func ZkPathToZkAddr(zkPath string) (string, error)
- type ChangeFunc
- type Conn
- type ConnCache
- type ElectorTask
- type GlobalConn
- func (gzc *GlobalConn) Children(path string) (children []string, stat Stat, err error)
- func (gzc *GlobalConn) Close() (err error)
- func (gzc *GlobalConn) Create(path, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error)
- func (gzc *GlobalConn) Delete(path string, version int) (err error)
- func (gzc *GlobalConn) Get(path string) (data string, stat Stat, err error)
- func (gzc *GlobalConn) Set(path, value string, version int) (stat Stat, err error)
- type GlobalZookeeperError
- type MetaConn
- func (conn *MetaConn) ACL(path string) (acl []zookeeper.ACL, stat Stat, err error)
- func (conn *MetaConn) Children(path string) (children []string, stat Stat, err error)
- func (conn *MetaConn) ChildrenW(path string) (children []string, stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *MetaConn) Close() error
- func (conn *MetaConn) Create(path, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error)
- func (conn *MetaConn) Delete(path string, version int) (err error)
- func (conn *MetaConn) Exists(path string) (stat Stat, err error)
- func (conn *MetaConn) ExistsW(path string) (stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *MetaConn) Get(path string) (data string, stat Stat, err error)
- func (conn *MetaConn) GetW(path string) (data string, stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *MetaConn) RetryChange(path string, flags int, acl []zookeeper.ACL, changeFunc ChangeFunc) error
- func (conn *MetaConn) Set(path, value string, version int) (stat Stat, err error)
- func (conn *MetaConn) SetACL(path string, aclv []zookeeper.ACL, version int) (err error)
- type Stat
- type ZElector
- type ZLocker
- type ZkConn
- func (conn *ZkConn) ACL(path string) (acls []zookeeper.ACL, stat Stat, err error)
- func (conn *ZkConn) Children(path string) (children []string, stat Stat, err error)
- func (conn *ZkConn) ChildrenW(path string) (children []string, stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *ZkConn) Close() error
- func (conn *ZkConn) Create(path, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error)
- func (conn *ZkConn) Delete(path string, version int) (err error)
- func (conn *ZkConn) Exists(path string) (stat Stat, err error)
- func (conn *ZkConn) ExistsW(path string) (stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *ZkConn) Get(path string) (data string, stat Stat, err error)
- func (conn *ZkConn) GetW(path string) (data string, stat Stat, watch <-chan zookeeper.Event, err error)
- func (conn *ZkConn) RetryChange(path string, flags int, acl []zookeeper.ACL, changeFunc ChangeFunc) error
- func (conn *ZkConn) Set(path, value string, version int) (stat Stat, err error)
- func (conn *ZkConn) SetACL(path string, aclv []zookeeper.ACL, version int) error
Constants ¶
const ( // PERM_DIRECTORY are default permissions for a node. PERM_DIRECTORY = zookeeper.PERM_ADMIN | zookeeper.PERM_CREATE | zookeeper.PERM_DELETE | zookeeper.PERM_READ | zookeeper.PERM_WRITE // PERM_FILE allows a zk node to emulate file behavior by disallowing child nodes. PERM_FILE = zookeeper.PERM_ADMIN | zookeeper.PERM_READ | zookeeper.PERM_WRITE )
const (
DEFAULT_BASE_TIMEOUT = 5 * time.Second
)
const (
DEFAULT_MAX_RETRIES = 3
)
Variables ¶
var ( // DefaultZkConfigPaths is the default list of config files to check. DefaultZkConfigPaths = []string{"/etc/zookeeper/zk_client.json"} // MagicPrefix is the Default name for the root note in the zookeeper tree. MagicPrefix = "zk" )
var ( // This error is returned by functions that wait for a result // when they are interrupted. ErrInterrupted = errors.New("zkutil: obtaining lock was interrupted") // This error is returned by functions that wait for a result // when the timeout value is reached. ErrTimeout = errors.New("zkutil: obtaining lock timed out") )
var ErrConnectionClosed = errors.New("ZkConn: connection is closed")
ErrConnectionClosed is returned if we try to access a closed connection.
Functions ¶
func CreateOrUpdate ¶
func CreateRecursive ¶
func CreateRecursive(zconn Conn, zkPath, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error)
Create a path and any pieces required, think mkdir -p. Intermediate znodes are always created empty.
func GetZkSubprocessFlags ¶
func GetZkSubprocessFlags() []string
GetZkSubprocessFlags returns the flags necessary to run a sub-process that would connect to the same zk servers as this process (assuming the environment of the sub-process is the same as ours)
func GuessLocalCell ¶
func GuessLocalCell() string
Read the cell from -zk.local-cell, or the environment ZK_CLIENT_LOCAL_CELL or guess the cell by the hostname. The letter-only prefix of the string is used as the cell name. For instance:
pa1 -> pa sjl-1 -> sjl lwc1 -> lwc
func IsDirectory ¶
IsDirectory returns if this node should be treated as a directory.
func ObtainQueueLock ¶
func ObtainQueueLock(zconn Conn, zkPath string, wait time.Duration, interrupted <-chan struct{}) error
The lexically lowest node is the lock holder - verify that this path holds the lock. Call this queue-lock because the semantics are a hybrid. Normal zookeeper locks make assumptions about sequential numbering that don't hold when the data in a lock is modified. if the provided 'interrupted' chan is closed, we'll just stop waiting and return an interruption error
func ResolveWildcards ¶
resolve paths like: /zk/nyc/vt/tablets/*/action /zk/global/vt/keyspaces/*/shards/*/action /zk/*/vt/tablets/*/action into real existing paths
If you send paths that don't contain any wildcard and don't exist, this function will return an empty array.
func ZkCellFromZkPath ¶
ZkCellFromZkPath extracts the cell name from a zkPath.
func ZkKnownCells ¶
returns all the known cells, alphabetically ordered. It will include 'global' if there is a dc-specific global cell or a global cell
func ZkPathToZkAddr ¶
Types ¶
type Conn ¶
type Conn interface { Get(path string) (data string, stat Stat, err error) GetW(path string) (data string, stat Stat, watch <-chan zookeeper.Event, err error) Children(path string) (children []string, stat Stat, err error) ChildrenW(path string) (children []string, stat Stat, watch <-chan zookeeper.Event, err error) Exists(path string) (stat Stat, err error) ExistsW(path string) (stat Stat, watch <-chan zookeeper.Event, err error) Create(path, value string, flags int, aclv []zookeeper.ACL) (pathCreated string, err error) Set(path, value string, version int) (stat Stat, err error) Delete(path string, version int) (err error) Close() error RetryChange(path string, flags int, acl []zookeeper.ACL, changeFunc ChangeFunc) error ACL(path string) ([]zookeeper.ACL, Stat, error) SetACL(path string, aclv []zookeeper.ACL, version int) error }
This interface is really close to the zookeeper connection interface. It uses the Stat interface defined here instead of the zookeeper.Stat structure for stats. Everything else is the same as in zookeeper. So refer to the zookeeper docs for the conventions used here (for instance, using -1 as version to specify any version)
type ConnCache ¶
type ConnCache struct {
// contains filtered or unexported fields
}
ConnCache is a cache for Zookeeper connections which guarantees that you have at most one zookeeper connection per cell.
func NewConnCache ¶
func NewConnCache() *ConnCache
NewConnCache creates a new Zookeeper connection cache.
type ElectorTask ¶
type ElectorTask interface { Run() error Stop() // Return true if interrupted, false if it died of natural causes. // An interrupted task indicates that the election should stop. Interrupted() bool }
ElectorTask is the interface for a task that runs essentially forever or until something bad happens. If a task must be stopped, it should be handled promptly - no second notification will be sent.
type GlobalConn ¶
type GlobalConn struct {
// contains filtered or unexported fields
}
func (*GlobalConn) Children ¶
func (gzc *GlobalConn) Children(path string) (children []string, stat Stat, err error)
func (*GlobalConn) Close ¶
func (gzc *GlobalConn) Close() (err error)
type GlobalZookeeperError ¶
type GlobalZookeeperError string
func (GlobalZookeeperError) Error ¶
func (e GlobalZookeeperError) Error() string
type MetaConn ¶
type MetaConn struct {
// contains filtered or unexported fields
}
func NewMetaConn ¶
func NewMetaConn() *MetaConn
func (*MetaConn) RetryChange ¶
type ZElector ¶
type ZElector struct {
// contains filtered or unexported fields
}
ZElector stores basic state for running an election.
func CreateElection ¶
CreateElection returns an initialized elector. An election is really a cycle of events. You are flip-flopping between leader and candidate. It's better to think of this as a stream of events that one needs to react to.
func (ZElector) LockWithTimeout ¶
LockWithTimeout returns nil when the lock is acquired. A lock is held if the file exists and you are the creator. Setting the wait to zero makes this a nonblocking lock check.
FIXME(msolo) Disallow non-super users from removing the lock?
func (*ZElector) RunTask ¶
func (ze *ZElector) RunTask(task ElectorTask) error
RunTask returns nil when the underlyingtask ends or the error it generated.
type ZLocker ¶
type ZLocker interface { Lock() error LockWithTimeout(wait time.Duration) error Unlock() error Interrupt() }
ZLocker is an interface for a lock that can fail.
func CreateMutex ¶
CreateMutex initializes an unacquired mutex. A mutex is released only by Unlock. You can clean up a mutex with delete, but you should be careful doing so.
type ZkConn ¶
type ZkConn struct {
// contains filtered or unexported fields
}
ZkConn is a client class that implements zk.Conn using a zookeeper.Conn. The conn member variable is protected by the mutex.
func DialZk ¶
Dial a ZK server and waits for connection event. Returns a ZkConn encapsulating the zookeeper.Conn, and the zookeeper session event channel to monitor the connection
The value for baseTimeout is used as a session timeout as well, and will be used to negotiate a 'good' value with the server. From reading the zookeeper source code, it has to be between 6 and 60 seconds (2x and 20x the tickTime by default, with default tick time being 3 seconds). min session time, max session time and ticktime can all be overwritten on the zookeeper server side, so these numbers may vary.
Then this baseTimeout is used to compute other related timeouts: - connect timeout is 1/3 of baseTimeout - recv timeout is 2/3 of baseTimeout minus a ping time - send timeout is 1/3 of baseTimeout - we try to send a ping a least every baseTimeout / 3
Note the baseTimeout has *nothing* to do with the time between we call Dial and the maximum time before we receive the event on the session. The library will actually try to re-connect in the background (after each timeout), and may *never* send an event if the TCP connections always fail. Use DialZkTimeout to enforce a timeout for the initial connect.
func DialZkTimeout ¶
func (*ZkConn) Close ¶
Close will close the connection asynchronously. It will never fail, even though closing the connection might fail in the background. Accessing this ZkConn after Close has been called will return ErrConnectionClosed.