gossip

package
v0.0.0-...-f211112 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 31, 2016 License: Apache-2.0 Imports: 22 Imported by: 0

Documentation

Overview

Package gossip implements a protocol for sharing information between Cockroach nodes using an ad-hoc, peer-to-peer network. The self-assembled network aims to minimize time for new information to reach each node, and minimize network traffic required.

Gossiped information is identified by key. Gossip information is captured by info objects.

Single-valued info values can have any type.

A map of info objects is kept by a Gossip instance. Single-valued info objects can be added via Gossip.AddInfo(). Info can be queried for single-valued keys via Gossip.GetInfo.

Package gossip is a generated protocol buffer package.

It is generated from these files:
	cockroach/gossip/gossip.proto

It has these top-level messages:
	BootstrapInfo
	Node
	Request
	Response
	Info

Index

Constants

View Source
const (
	// KeyClusterID is the unique UUID for this Cockroach cluster.
	// The value is a string UUID for the cluster.  The cluster ID is
	// gossiped by all nodes that contain a replica of the first range,
	// and it serves as a check for basic gossip connectivity. The
	// Gossip.Connected channel is closed when we see this key.
	KeyClusterID = "cluster-id"

	// KeyStorePrefix is the key prefix for gossiping stores in the network.
	// The suffix is a store ID and the value is roachpb.StoreDescriptor.
	KeyStorePrefix = "store"

	// KeyNodeIDPrefix is the key prefix for gossiping node id
	// addresses. The actual key is suffixed with the decimal
	// representation of the node id and the value is the host:port
	// string address of the node. E.g. node:1 => 127.0.0.1:24001
	KeyNodeIDPrefix = "node"

	// KeySentinel is a key for gossip which must not expire or
	// else the node considers itself partitioned and will retry with
	// bootstrap hosts.  The sentinel is gossiped by the node that holds
	// the leader lease for the first range.
	KeySentinel = "sentinel"

	// KeyFirstRangeDescriptor is the descriptor for the "first"
	// range. The "first" range contains the meta1 key range, the first
	// level of the bi-level key addressing scheme. The value is a slice
	// of storage.Replica structs.
	KeyFirstRangeDescriptor = "first-range"

	// KeySystemConfig is the gossip key for the system DB span.
	// The value if a config.SystemConfig which holds all key/value
	// pairs in the system DB span.
	KeySystemConfig = "system-db"
)

Constants for gossip keys.

View Source
const (
	// MaxHops is the maximum number of hops which any gossip info
	// should require to transit between any two nodes in a gossip
	// network.
	MaxHops = 5
)

Variables

View Source
var (
	ErrInvalidLengthGossip = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowGossip   = fmt.Errorf("proto: integer overflow")
)
View Source
var (
	// TestBootstrap is the default gossip bootstrap used for running tests.
	TestBootstrap = []resolver.Resolver{}
)

Functions

func MakeKey

func MakeKey(components ...string) string

MakeKey creates a canonical key under which to gossip a piece of information. The first argument will typically be one of the key constants defined in this package.

func MakeNodeIDKey

func MakeNodeIDKey(nodeID roachpb.NodeID) string

MakeNodeIDKey returns the gossip key for node ID info.

func MakePrefixPattern

func MakePrefixPattern(prefix string) string

MakePrefixPattern returns a regular expression pattern that matches precisely the Gossip keys created by invocations of MakeKey with multiple arguments for which the first argument is equal to the given prefix.

func MakeStoreKey

func MakeStoreKey(storeID roachpb.StoreID) string

MakeStoreKey returns the gossip key for the given store.

Types

type BootstrapInfo

type BootstrapInfo struct {
	// A map from node ID to address.
	Addresses []cockroach_util.UnresolvedAddr `protobuf:"bytes,1,rep,name=addresses" json:"addresses"`
	// Timestamp at which the bootstrap info was written.
	Timestamp cockroach_roachpb1.Timestamp `protobuf:"bytes,2,opt,name=timestamp" json:"timestamp"`
}

BootstrapInfo contains information necessary to bootstrapping the gossip network from a cold start.

func (*BootstrapInfo) Marshal

func (m *BootstrapInfo) Marshal() (data []byte, err error)

func (*BootstrapInfo) MarshalTo

func (m *BootstrapInfo) MarshalTo(data []byte) (int, error)

func (*BootstrapInfo) ProtoMessage

func (*BootstrapInfo) ProtoMessage()

func (*BootstrapInfo) Reset

func (m *BootstrapInfo) Reset()

func (*BootstrapInfo) Size

func (m *BootstrapInfo) Size() (n int)

func (*BootstrapInfo) String

func (m *BootstrapInfo) String() string

func (*BootstrapInfo) Unmarshal

func (m *BootstrapInfo) Unmarshal(data []byte) error

type Callback

type Callback func(string, roachpb.Value)

Callback is a callback method to be invoked on gossip update of info denoted by key.

type Gossip

type Gossip struct {
	Connected chan struct{} // Closed upon initial connection
	// contains filtered or unexported fields
}

Gossip is an instance of a gossip node. It embeds a gossip server. During bootstrapping, the bootstrap list contains candidates for entry to the gossip network.

func New

func New(rpcContext *rpc.Context, resolvers []resolver.Resolver) *Gossip

New creates an instance of a gossip node.

func (*Gossip) AddInfo

func (g *Gossip) AddInfo(key string, val []byte, ttl time.Duration) error

AddInfo adds or updates an info object. Returns an error if info couldn't be added.

func (*Gossip) AddInfoProto

func (g *Gossip) AddInfoProto(key string, msg proto.Message, ttl time.Duration) error

AddInfoProto adds or updates an info object. Returns an error if info couldn't be added.

func (*Gossip) EnableSimulationCycler

func (g *Gossip) EnableSimulationCycler(enable bool)

EnableSimulationCycler is for TESTING PURPOSES ONLY. It sets a condition variable which is signaled at each cycle of the simulation via SimulationCycle(). The gossip server makes each connecting client wait for the cycler to signal before responding.

func (*Gossip) GetInfo

func (g *Gossip) GetInfo(key string) ([]byte, error)

GetInfo returns an info value by key or an error if specified key does not exist or has expired.

func (*Gossip) GetInfoProto

func (g *Gossip) GetInfoProto(key string, msg proto.Message) error

GetInfoProto returns an info value by key or an error if specified key does not exist or has expired.

func (*Gossip) GetInfosAsJSON

func (g *Gossip) GetInfosAsJSON() ([]byte, error)

GetInfosAsJSON returns the contents of the infostore, marshalled to JSON.

func (*Gossip) GetNodeDescriptor

func (g *Gossip) GetNodeDescriptor(nodeID roachpb.NodeID) (*roachpb.NodeDescriptor, error)

GetNodeDescriptor looks up the descriptor of the node by ID.

func (*Gossip) GetNodeID

func (g *Gossip) GetNodeID() roachpb.NodeID

GetNodeID returns the instance's saved node ID.

func (*Gossip) GetNodeIDAddress

func (g *Gossip) GetNodeIDAddress(nodeID roachpb.NodeID) (net.Addr, error)

GetNodeIDAddress looks up the address of the node by ID.

func (*Gossip) GetSystemConfig

func (g *Gossip) GetSystemConfig() *config.SystemConfig

GetSystemConfig returns the local unmarshalled version of the system config. It may be nil if it was never gossiped.

func (Gossip) Gossip

func (s Gossip) Gossip(argsI proto.Message) (proto.Message, error)

Gossip receives gossiped information from a peer node. The received delta is combined with the infostore, and this node's own gossip is returned to requesting client.

func (*Gossip) Incoming

func (g *Gossip) Incoming() []roachpb.NodeID

Incoming returns a slice of incoming gossip client connection node IDs.

func (Gossip) InfosReceived

func (s Gossip) InfosReceived() int

InfosReceived returns the total count of infos received from clients.

func (Gossip) InfosSent

func (s Gossip) InfosSent() int

InfosSent returns the total count of infos sent to clients.

func (*Gossip) MaxHops

func (g *Gossip) MaxHops() uint32

MaxHops returns the maximum number of hops to reach any other node in the system, according to the infos which have reached this node via gossip network.

func (*Gossip) Outgoing

func (g *Gossip) Outgoing() []roachpb.NodeID

Outgoing returns a slice of outgoing gossip client connection node IDs. Note that these outgoing client connections may not actually be legitimately connected. They may be in the process of trying, or may already have failed, but haven't yet been processed by the gossip instance.

func (*Gossip) RegisterCallback

func (g *Gossip) RegisterCallback(pattern string, method Callback) func()

RegisterCallback registers a callback for a key pattern to be invoked whenever new info for a gossip key matching pattern is received. The callback method is invoked with the info key which matched pattern. Returns a function to unregister the callback.

func (*Gossip) RegisterSystemConfigChannel

func (g *Gossip) RegisterSystemConfigChannel() <-chan struct{}

RegisterSystemConfigChannel registers a channel to signify updates for the system config. It is notified after registration, and whenever a new system config is successfully unmarshalled.

func (*Gossip) SetBootstrapInterval

func (g *Gossip) SetBootstrapInterval(interval time.Duration)

SetBootstrapInterval sets a minimum interval between successive attempts to connect to new hosts in order to join the gossip network.

func (*Gossip) SetCullInterval

func (g *Gossip) SetCullInterval(interval time.Duration)

SetCullInterval sets the interval between periodic shutdown of outgoing gossip client connections in an effort to improve the fitness of the network.

func (*Gossip) SetNodeDescriptor

func (g *Gossip) SetNodeDescriptor(desc *roachpb.NodeDescriptor) error

SetNodeDescriptor adds the node descriptor to the gossip network and sets the infostore's node ID.

func (*Gossip) SetNodeID

func (g *Gossip) SetNodeID(nodeID roachpb.NodeID)

SetNodeID sets the infostore's node ID.

func (*Gossip) SetResolvers

func (g *Gossip) SetResolvers(resolvers []resolver.Resolver)

SetResolvers initializes the set of gossip resolvers used to find nodes to bootstrap the gossip network.

func (*Gossip) SetStallInterval

func (g *Gossip) SetStallInterval(interval time.Duration)

SetStallInterval sets the interval between periodic checks to determine whether the node is not fully connected to the gossip network.

func (*Gossip) SetStorage

func (g *Gossip) SetStorage(storage Storage) error

SetStorage provides an instance of the Storage interface for reading and writing gossip bootstrap data from persistent storage. This should be invoked as early in the lifecycle of a gossip instance as possible, but can be called at any time.

func (*Gossip) SimulationCycle

func (g *Gossip) SimulationCycle()

SimulationCycle cycles this gossip node's server by allowing all connected clients to proceed one step.

func (*Gossip) Start

func (g *Gossip) Start(rpcServer *rpc.Server, addr net.Addr, stopper *stop.Stopper)

Start launches the gossip instance, which commences joining the gossip network using the supplied rpc server and the gossip bootstrap addresses specified via command-line flag: --gossip.

The supplied address is used to identify the gossip instance in the gossip network; it will be used by other instances to connect to this instance.

This method starts bootstrap loop, gossip server, and client management in separate goroutines and returns.

type Info

type Info struct {
	Value cockroach_roachpb1.Value `protobuf:"bytes,1,opt,name=value" json:"value"`
	// Wall time of info when generated by originating node (Unix-nanos).
	OrigStamp int64 `protobuf:"varint,2,opt,name=orig_stamp,proto3" json:"orig_stamp,omitempty"`
	// Wall time when info is to be discarded (Unix-nanos).
	TTLStamp int64 `protobuf:"varint,3,opt,name=ttl_stamp,proto3" json:"ttl_stamp,omitempty"`
	// Number of hops from originator.
	Hops uint32 `protobuf:"varint,4,opt,name=hops,proto3" json:"hops,omitempty"`
	// Originating node's ID.
	NodeID github_com_cockroachdb_cockroach_roachpb.NodeID `protobuf:"varint,5,opt,name=node_id,proto3,casttype=github.com/cockroachdb/cockroach/roachpb.NodeID" json:"node_id,omitempty"`
	// Peer node ID which passed this info.
	PeerID github_com_cockroachdb_cockroach_roachpb.NodeID `protobuf:"varint,6,opt,name=peer_id,proto3,casttype=github.com/cockroachdb/cockroach/roachpb.NodeID" json:"peer_id,omitempty"`
}

Info is the basic unit of information traded over the gossip network.

func (*Info) Marshal

func (m *Info) Marshal() (data []byte, err error)

func (*Info) MarshalTo

func (m *Info) MarshalTo(data []byte) (int, error)

func (*Info) ProtoMessage

func (*Info) ProtoMessage()

func (*Info) Reset

func (m *Info) Reset()

func (*Info) Size

func (m *Info) Size() (n int)

func (*Info) String

func (m *Info) String() string

func (*Info) Unmarshal

func (m *Info) Unmarshal(data []byte) error

type Node

type Node struct {
	// The most recent timestamp of any info which originated at this node.
	HighWaterStamp int64 `protobuf:"varint,1,opt,name=high_water_stamp,proto3" json:"high_water_stamp,omitempty"`
	// The minimum number of hops seen for any info which originated at this node.
	MinHops uint32 `protobuf:"varint,2,opt,name=min_hops,proto3" json:"min_hops,omitempty"`
}

Node contains information about a gossip node.

func (*Node) Marshal

func (m *Node) Marshal() (data []byte, err error)

func (*Node) MarshalTo

func (m *Node) MarshalTo(data []byte) (int, error)

func (*Node) ProtoMessage

func (*Node) ProtoMessage()

func (*Node) Reset

func (m *Node) Reset()

func (*Node) Size

func (m *Node) Size() (n int)

func (*Node) String

func (m *Node) String() string

func (*Node) Unmarshal

func (m *Node) Unmarshal(data []byte) error

type Request

type Request struct {
	// Requesting node's ID.
	NodeID github_com_cockroachdb_cockroach_roachpb.NodeID `protobuf:"varint,1,opt,name=node_id,proto3,casttype=github.com/cockroachdb/cockroach/roachpb.NodeID" json:"node_id,omitempty"`
	// Address of the requesting client.
	Addr cockroach_util.UnresolvedAddr `protobuf:"bytes,2,opt,name=addr" json:"addr"`
	// Local address of client on requesting node (this is a kludge to
	// allow gossip to know when client connections are dropped).
	LAddr cockroach_util.UnresolvedAddr `protobuf:"bytes,3,opt,name=l_addr" json:"l_addr"`
	// Map of information about other nodes, as seen by the requester.
	Nodes map[int32]*Node `` /* 138-byte string literal not displayed */
	// Delta of Infos originating at sender.
	Delta map[string]*Info `` /* 137-byte string literal not displayed */
}

Request is the request struct passed with the Gossip RPC.

func (*Request) GetUser

func (*Request) GetUser() string

GetUser implements security.RequestWithUser. Gossip messages are always sent by the node user.

func (*Request) Marshal

func (m *Request) Marshal() (data []byte, err error)

func (*Request) MarshalTo

func (m *Request) MarshalTo(data []byte) (int, error)

func (*Request) ProtoMessage

func (*Request) ProtoMessage()

func (*Request) Reset

func (m *Request) Reset()

func (*Request) Size

func (m *Request) Size() (n int)

func (*Request) String

func (m *Request) String() string

func (*Request) Unmarshal

func (m *Request) Unmarshal(data []byte) error

type Response

type Response struct {
	// Responding Node's ID.
	NodeID github_com_cockroachdb_cockroach_roachpb.NodeID `protobuf:"varint,1,opt,name=node_id,proto3,casttype=github.com/cockroachdb/cockroach/roachpb.NodeID" json:"node_id,omitempty"`
	// Address of the responding client.
	Addr cockroach_util.UnresolvedAddr `protobuf:"bytes,2,opt,name=addr" json:"addr"`
	// Non-nil means client should retry with this address.
	AlternateAddr *cockroach_util.UnresolvedAddr `protobuf:"bytes,3,opt,name=alternate_addr" json:"alternate_addr,omitempty"`
	// Node ID of the alternate address, if alternate_addr is not nil.
	AlternateNodeID github_com_cockroachdb_cockroach_roachpb.NodeID `` /* 145-byte string literal not displayed */
	// Delta of Infos which are fresh according to the map of Node info messages
	// passed with the request.
	Delta map[string]*Info `` /* 137-byte string literal not displayed */
	// Map of information about other nodes, as seen by the responder.
	Nodes map[int32]*Node `` /* 138-byte string literal not displayed */
}

Response is returned from the Gossip.Gossip RPC. Delta will be nil in the event that Alternate is set.

func (*Response) Marshal

func (m *Response) Marshal() (data []byte, err error)

func (*Response) MarshalTo

func (m *Response) MarshalTo(data []byte) (int, error)

func (*Response) ProtoMessage

func (*Response) ProtoMessage()

func (*Response) Reset

func (m *Response) Reset()

func (*Response) Size

func (m *Response) Size() (n int)

func (*Response) String

func (m *Response) String() string

func (*Response) Unmarshal

func (m *Response) Unmarshal(data []byte) error

type Storage

type Storage interface {
	// ReadBootstrapInfo fetches the bootstrap data from the persistent
	// store into the provided bootstrap protobuf. Returns nil or an
	// error on failure.
	ReadBootstrapInfo(*BootstrapInfo) error
	// WriteBootstrapInfo stores the provided bootstrap data to the
	// persistent store. Returns nil or an error on failure.
	WriteBootstrapInfo(*BootstrapInfo) error
}

Storage is an interface which allows the gossip instance to read and write bootstrapping data to persistent storage between instantiations.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL