mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-12 22:07:59 +00:00
Modified the gossip implementation to optionally send messages directly (instead of over gossip). Added support for local and remote NodeState, as well as function to merge remote into local state. Refactored Protobuf models to include `DBMeta` and `FrameMeta` as well as support for NodeState.
88 lines
2 KiB
Go
88 lines
2 KiB
Go
package pilosa
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/gogo/protobuf/proto"
|
|
"github.com/pilosa/pilosa/internal"
|
|
)
|
|
|
|
func init() {
|
|
NopMessenger = &nopMessenger{}
|
|
}
|
|
|
|
var NopMessenger Messenger
|
|
|
|
// nopMessenger represents a Messenger that doesn't do anything.
|
|
type nopMessenger struct{}
|
|
|
|
func (c *nopMessenger) SendMessage(pb proto.Message, method string) error {
|
|
fmt.Println("NOPMessenger: Send")
|
|
return nil
|
|
}
|
|
func (c *nopMessenger) ReceiveMessage(pb proto.Message) error {
|
|
fmt.Println("NOPMessenger: Receive")
|
|
return nil
|
|
}
|
|
|
|
type Messenger interface {
|
|
SendMessage(pb proto.Message, method string) error
|
|
ReceiveMessage(pb proto.Message) error
|
|
}
|
|
|
|
const (
|
|
MessageTypeCreateSlice = 1
|
|
MessageTypeCreateDB = 2
|
|
MessageTypeDeleteDB = 3
|
|
MessageTypeCreateFrame = 4
|
|
MessageTypeDeleteFrame = 5
|
|
)
|
|
|
|
func MarshalMessage(m proto.Message) ([]byte, error) {
|
|
var typ uint8
|
|
switch obj := m.(type) {
|
|
case *internal.CreateSliceMessage:
|
|
typ = MessageTypeCreateSlice
|
|
case *internal.CreateDBMessage:
|
|
typ = MessageTypeCreateDB
|
|
case *internal.DeleteDBMessage:
|
|
typ = MessageTypeDeleteDB
|
|
case *internal.CreateFrameMessage:
|
|
typ = MessageTypeCreateFrame
|
|
case *internal.DeleteFrameMessage:
|
|
typ = MessageTypeDeleteFrame
|
|
default:
|
|
return nil, fmt.Errorf("message type not implemented for marshalling: %s", reflect.TypeOf(obj))
|
|
}
|
|
buf, err := proto.Marshal(m)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return append([]byte{typ}, buf...), nil
|
|
}
|
|
|
|
func UnmarshalMessage(buf []byte) (proto.Message, error) {
|
|
typ, buf := buf[0], buf[1:]
|
|
|
|
var m proto.Message
|
|
switch typ {
|
|
case MessageTypeCreateSlice:
|
|
m = &internal.CreateSliceMessage{}
|
|
case MessageTypeCreateDB:
|
|
m = &internal.CreateDBMessage{}
|
|
case MessageTypeDeleteDB:
|
|
m = &internal.DeleteDBMessage{}
|
|
case MessageTypeCreateFrame:
|
|
m = &internal.CreateFrameMessage{}
|
|
case MessageTypeDeleteFrame:
|
|
m = &internal.DeleteFrameMessage{}
|
|
default:
|
|
return nil, fmt.Errorf("invalid message type: %d", typ)
|
|
}
|
|
|
|
if err := proto.Unmarshal(buf, m); err != nil {
|
|
return nil, err
|
|
}
|
|
return m, nil
|
|
}
|