mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-05 16:15:56 +00:00
We had two different, incompatible-with-each-other, and both individually broken, partial implementations of resizing logic. There's the original pre-etcd resize, and then the etcd resize, and neither works, but there's conflicts between the ways they don't work. No attempt to fix this is likely to yield decent results, so instead, we yank them both out entirely, so if we decide to implement resizing (which we will) we won't be confused by stray code pertaining to resizing that's not really hooked up to anything. We're leaving the resize messages in protobuf to avoid renumbering protobuf messages. We rename some of our message types to UNUSED0, etcetera, so that any code still using the old names won't compile, to make sure we get rid of it, but we can't just drop the numbers without breaking rolling restart. The Resize_AddNode tests are removed not just because we don't have resizing, but because they were completely broken anyway and never worked at all. But there's no reason to fix them because they exist to fix the functionality we didn't have and are now removing the vestigial remains of. We also drop the one usage of the AddNode function of Noder, because it was used only by one test code fragment that was creatincg clusters, and that can be done more correctly. There were no other call sites at all. We mark the monitorAntiEntropy function to be ignored by code coverage because it's not actually being covered. There's a separate ticket for removing that entirely.
159 lines
4.6 KiB
Go
159 lines
4.6 KiB
Go
// Copyright 2021 Molecula Corp. All rights reserved.
|
|
package pilosa
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/molecula/featurebase/v3/topology"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// Serializer is an interface for serializing pilosa types to bytes and back.
|
|
type Serializer interface {
|
|
Marshal(Message) ([]byte, error)
|
|
Unmarshal([]byte, Message) error
|
|
}
|
|
|
|
// NopSerializer represents a Serializer that doesn't do anything.
|
|
var NopSerializer Serializer = &nopSerializer{}
|
|
|
|
type nopSerializer struct{}
|
|
|
|
// Marshal is a no-op implementation of Serializer Marshal method.
|
|
func (*nopSerializer) Marshal(Message) ([]byte, error) { return nil, nil }
|
|
|
|
// Unmarshal is a no-op implementation of Serializer Unmarshal method.
|
|
func (*nopSerializer) Unmarshal([]byte, Message) error { return nil }
|
|
|
|
// broadcaster is an interface for broadcasting messages.
|
|
type broadcaster interface {
|
|
SendSync(Message) error
|
|
SendAsync(Message) error
|
|
SendTo(*topology.Node, Message) error
|
|
}
|
|
|
|
// Message is the interface implemented by all core pilosa types which can be serialized to messages.
|
|
// TODO add at least a single "isMessage()" method.
|
|
type Message interface{}
|
|
|
|
// NopBroadcaster represents a Broadcaster that doesn't do anything.
|
|
var NopBroadcaster broadcaster = &nopBroadcaster{}
|
|
|
|
type nopBroadcaster struct{}
|
|
|
|
// SendSync A no-op implementation of Broadcaster SendSync method.
|
|
func (nopBroadcaster) SendSync(Message) error { return nil }
|
|
|
|
// SendAsync A no-op implementation of Broadcaster SendAsync method.
|
|
func (nopBroadcaster) SendAsync(Message) error { return nil }
|
|
|
|
// SendTo is a no-op implementation of Broadcaster SendTo method.
|
|
func (nopBroadcaster) SendTo(*topology.Node, Message) error { return nil }
|
|
|
|
// Broadcast message types.
|
|
const (
|
|
messageTypeCreateShard = iota
|
|
messageTypeCreateIndex
|
|
messageTypeDeleteIndex
|
|
messageTypeCreateField
|
|
messageTypeDeleteField
|
|
messageTypeCreateView
|
|
messageTypeDeleteView
|
|
messageTypeClusterStatus
|
|
messageTypeUNUSED0 // used to be ResizeInstruction
|
|
messageTypeUNUSED1 // used to be ResizeInstructionComplete
|
|
messageTypeNodeState
|
|
messageTypeRecalculateCaches
|
|
messageTypeLoadSchemaMessage
|
|
messageTypeNodeEvent
|
|
messageTypeNodeStatus
|
|
messageTypeTransaction
|
|
messageTypeUNUSED2 // used to be ResizeNodeMessage
|
|
messageTypeUNUSED3 // used to be ResizeAbortMessage
|
|
messageTypeUpdateField
|
|
)
|
|
|
|
// MarshalInternalMessage serializes the pilosa message and adds pilosa internal
|
|
// type info which is used by the internal messaging stuff.
|
|
func MarshalInternalMessage(m Message, s Serializer) ([]byte, error) {
|
|
typ := getMessageType(m)
|
|
buf, err := s.Marshal(m)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "marshaling")
|
|
}
|
|
return append([]byte{typ}, buf...), nil
|
|
}
|
|
|
|
func getMessage(typ byte) Message {
|
|
switch typ {
|
|
case messageTypeCreateShard:
|
|
return &CreateShardMessage{}
|
|
case messageTypeCreateIndex:
|
|
return &CreateIndexMessage{}
|
|
case messageTypeDeleteIndex:
|
|
return &DeleteIndexMessage{}
|
|
case messageTypeCreateField:
|
|
return &CreateFieldMessage{}
|
|
case messageTypeDeleteField:
|
|
return &DeleteFieldMessage{}
|
|
case messageTypeCreateView:
|
|
return &CreateViewMessage{}
|
|
case messageTypeDeleteView:
|
|
return &DeleteViewMessage{}
|
|
case messageTypeClusterStatus:
|
|
return &ClusterStatus{}
|
|
case messageTypeNodeState:
|
|
return &NodeStateMessage{}
|
|
case messageTypeRecalculateCaches:
|
|
return &RecalculateCaches{}
|
|
case messageTypeLoadSchemaMessage:
|
|
return &LoadSchemaMessage{}
|
|
case messageTypeNodeEvent:
|
|
return &NodeEvent{}
|
|
case messageTypeNodeStatus:
|
|
return &NodeStatus{}
|
|
case messageTypeTransaction:
|
|
return &TransactionMessage{}
|
|
case messageTypeUpdateField:
|
|
return &UpdateFieldMessage{}
|
|
default:
|
|
panic(fmt.Sprintf("unknown message type %d", typ))
|
|
}
|
|
}
|
|
|
|
func getMessageType(m Message) byte {
|
|
switch m.(type) {
|
|
case *CreateShardMessage:
|
|
return messageTypeCreateShard
|
|
case *CreateIndexMessage:
|
|
return messageTypeCreateIndex
|
|
case *DeleteIndexMessage:
|
|
return messageTypeDeleteIndex
|
|
case *CreateFieldMessage:
|
|
return messageTypeCreateField
|
|
case *DeleteFieldMessage:
|
|
return messageTypeDeleteField
|
|
case *CreateViewMessage:
|
|
return messageTypeCreateView
|
|
case *DeleteViewMessage:
|
|
return messageTypeDeleteView
|
|
case *ClusterStatus:
|
|
return messageTypeClusterStatus
|
|
case *NodeStateMessage:
|
|
return messageTypeNodeState
|
|
case *RecalculateCaches:
|
|
return messageTypeRecalculateCaches
|
|
case *LoadSchemaMessage:
|
|
return messageTypeLoadSchemaMessage
|
|
case *NodeEvent:
|
|
return messageTypeNodeEvent
|
|
case *NodeStatus:
|
|
return messageTypeNodeStatus
|
|
case *TransactionMessage:
|
|
return messageTypeTransaction
|
|
case *UpdateFieldMessage:
|
|
return messageTypeUpdateField
|
|
default:
|
|
panic(fmt.Sprintf("don't have type for message %#v", m))
|
|
}
|
|
}
|