Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrInUse = errors.New("name in use")
ErrInUse is returned by TryAcquire and TryHold when trying to acquire or hold a name already in use.
var ErrNotExist = errors.New("name does not exist")
ErrNotExist is returned by TryAcquire and TryHold when trying to acquire or hold a name that was not already acquired, and is thus not known by the system.
Functions ¶
func RegisterBackend ¶
func RegisterBackend(backend Backend)
RegisterBackend registers a backend. Backends cannot be used with CreateFromURL unless they are registered with this function. This function should be called in the `init` function of the backend packages.
Types ¶
type Backend ¶
type Backend struct {
// Protocol is the protocol for the backend. If the protocol is "foo",
// backend URLs starting with "foo://", such as "foo://bar", will give
// `NameManager` instances created with the `CreateNameManager`
// associated with this backend.
Protocol string
// Description holds a human-readable description of the backend.
// This description should specify, among other things, the format
// for the URL.
Description string
// CreateNameManager creates a `NameManager` from a URL, stripped
// of the protocol. For instance, if `CreateFromURL("foo://bar")` is
// called, the URL passed to this function is "bar".
CreateNameManager func(backendURL string) (NameManager, error)
}
Backend describes a backend for creating name managers.
type Name ¶
type Name struct {
// Name is the name.
Name string
// Family is the name family the name belongs to. Names are unique
// within the same family.
Family string
// CreatedAt is the timestamp at which the name was first registered.
CreatedAt time.Time
// UpdatedAt is the timestamp at which the name was last acquired.
UpdatedAt time.Time
// Free is whether the name is free, or it was acquired but not
// yet released.
Free bool
}
Name describes a name as registered with a `NameManager`.
type NameManager ¶
type NameManager interface {
// Hold acquires a name for the given family, returns it, and keep
// it alive until the release function is called (this call also
// releases the name). Thanks to a global lock, a given name cannot
// be acquired twice for the same family without having been released
// first. Using Hold in the background is almost always preferable
// to calling directly Acquire, KeepAlive, and Release, which are
// low-level. Errors occurring during the keep-alive are sent to
// an error channel.
Hold(family string) (string, <-chan error, ReleaseFunc, error)
// Acquire acquires a name for the given family, and returns it.
// Thanks to a global lock, a given name cannot be acquired twice for
// the same family without having been released first. After being
// acquired, a name must be kept alive, otherwise it can automatically
// released after a certain time. The automatic release is
// backend-specific.
Acquire(family string) (string, error)
// KeepAlive produces a heart beat to avoid a name being automatically
// released after a certain time. KeepAlive helps to avoid zombies.
// Note that automatic release does NOT have to be implemented by a
// backend.
KeepAlive(family, name string) error
// Release releases a name previously registered for a family.
// It is not an error to release a name that has already been released,
// or that was never acquired in the first place. A name that has
// be released can be acquired again.
Release(family, name string) error
// TryAcquire tries to hold a specific name. It fails with ErrInUse
// if the name has already been acquired and not yet released.
// Errors occurring during the keep-alive are sent to
// an error channel.
TryHold(family, name string) (<-chan error, ReleaseFunc, error)
// TryAcquire tries to acquire a specific name. It fails with
// ErrInUse if the name has already been acquired and not yet released.
// It fails with ErrNotExist if the name has not already been acquired
// at least once.
//
// A name acquired through TryAcquire should be kept alive with
// KeepAlive, then released with Release, the same way it is done
// with Acquire.
//
// TryAcquire can be useful, e.g., for garbage collection.
// (Just combine List with TryAcquire).
TryAcquire(family, name string) error
// List lists the names that are currently registered, either marked as
// `free` or not.
List() ([]Name, error)
// Reset deregister all the names. After this call, `List` returns
// `nil`.
Reset() error
}
NameManager objects are responsible for the acquisition and release of names with a global lock.
func CreateFromURL ¶
func CreateFromURL(url string) (NameManager, error)
CreateFromURL creates a `NameManager` from a url. The URL, e.g., "foo://bar", contains a backend protocol, e.g., "foo", and a backend-specific URL, e.g., "bar".
type ReleaseFunc ¶ added in v0.0.3
type ReleaseFunc func() error
ReleaseFunc is called to release a name that was acquired and kept alive through `NameManager.Hold`.