Skip to content

Commit e9a39cd

Browse files
authored
Merge pull request #635 from asynkron/enable_gossip
Enable gossip
2 parents 77b540e + f1432ca commit e9a39cd

File tree

7 files changed

+69
-66
lines changed

7 files changed

+69
-66
lines changed

_examples/cluster-broadcast/node1/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
console "github.com/asynkron/goconsole"
1010
"github.com/asynkron/protoactor-go/actor"
1111
"github.com/asynkron/protoactor-go/cluster"
12-
automanaged "github.com/asynkron/protoactor-go/cluster/clusterproviders/_automanaged"
12+
"github.com/asynkron/protoactor-go/cluster/clusterproviders/automanaged"
1313
"github.com/asynkron/protoactor-go/cluster/identitylookup/disthash"
1414
"github.com/asynkron/protoactor-go/remote"
1515
)

_examples/cluster-broadcast/node2/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
"cluster-broadcast/shared"
88

9-
automanaged "github.com/asynkron/protoactor-go/cluster/clusterproviders/_automanaged"
9+
"github.com/asynkron/protoactor-go/cluster/clusterproviders/automanaged"
1010
"github.com/asynkron/protoactor-go/cluster/identitylookup/disthash"
1111

1212
console "github.com/asynkron/goconsole"

_examples/cluster-eventstream-broadcast/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"strings"
77
"time"
88

9-
automanaged "github.com/asynkron/protoactor-go/cluster/clusterproviders/_automanaged"
9+
"github.com/asynkron/protoactor-go/cluster/clusterproviders/automanaged"
1010
"github.com/asynkron/protoactor-go/cluster/identitylookup/disthash"
1111

1212
console "github.com/asynkron/goconsole"

cluster/cluster.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/asynkron/protoactor-go/remote"
1212
)
1313

14-
var extensionId = extensions.NextExtensionID()
14+
var extensionID = extensions.NextExtensionID()
1515

1616
type Cluster struct {
1717
ActorSystem *actor.ActorSystem
@@ -63,12 +63,12 @@ func (c *Cluster) subscribeToTopologyEvents() {
6363
}
6464

6565
func (c *Cluster) ExtensionID() extensions.ExtensionID {
66-
return extensionId
66+
return extensionID
6767
}
6868

6969
//goland:noinspection GoUnusedExportedFunction
7070
func GetCluster(actorSystem *actor.ActorSystem) *Cluster {
71-
c := actorSystem.Extensions.Get(extensionId)
71+
c := actorSystem.Extensions.Get(extensionID)
7272

7373
return c.(*Cluster)
7474
}
@@ -87,17 +87,17 @@ func (c *Cluster) StartMember() {
8787
c.Remote.Start()
8888

8989
address := c.ActorSystem.Address()
90-
plog.Info("Starting Proto.Actor cluster member", log.String("address", address))
90+
plog.Info("Starting Proto.Actor cluster member", log.String("id", c.ActorSystem.ID), log.String("address", address))
9191

9292
c.IdentityLookup = cfg.IdentityLookup
9393
c.IdentityLookup.Setup(c, c.GetClusterKinds(), false)
9494

9595
// TODO: Disable Gossip for now until API changes are done
96-
// gossiper must be started whenever any topology events starts flowing
97-
// if err := c.Gossip.StartGossiping(); err != nil {
98-
// panic(err)
99-
// }
100-
// c.MemberList.InitializeTopologyConsensus()
96+
//gossiper must be started whenever any topology events starts flowing
97+
if err := c.Gossip.StartGossiping(); err != nil {
98+
panic(err)
99+
}
100+
c.MemberList.InitializeTopologyConsensus()
101101

102102
if err := cfg.ClusterProvider.StartMember(c); err != nil {
103103
panic(err)

cluster/clusterproviders/automanaged/automanaged.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -380,5 +380,6 @@ func (p *AutoManagedProvider) isActiveProviderRunning() bool {
380380
}
381381

382382
func (p *AutoManagedProvider) getCurrentNode() *NodeModel {
383-
return NewNode(p.clusterName, p.address, p.memberPort, p.autoManagePort, p.knownKinds)
383+
384+
return NewNode(p.clusterName, p.cluster.ActorSystem.ID, p.address, p.memberPort, p.autoManagePort, p.knownKinds)
384385
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package automanaged
22

3-
import "fmt"
4-
53
// NodeModel represents a node in the cluster
64
type NodeModel struct {
75
ID string `json:"id"`
@@ -13,17 +11,13 @@ type NodeModel struct {
1311
}
1412

1513
// NewNode returns a new node for the cluster
16-
func NewNode(clusterName string, address string, port int, autoManPort int, kind []string) *NodeModel {
14+
func NewNode(clusterName string, id string, address string, port int, autoManPort int, kind []string) *NodeModel {
1715
return &NodeModel{
18-
ID: createNodeID(clusterName, address, port),
16+
ID: id,
1917
ClusterName: clusterName,
2018
Address: address,
2119
Port: port,
2220
AutoManagePort: autoManPort,
2321
Kinds: kind,
2422
}
2523
}
26-
27-
func createNodeID(clusterName string, address string, port int) string {
28-
return fmt.Sprintf("%v@%v:%v", clusterName, address, port)
29-
}

cluster/gossip_actor.go

+53-45
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ func NewGossipActor(requestTimeout time.Duration, myID string, getBlockedMembers
3434
// Receive method.
3535
func (ga *GossipActor) Receive(ctx actor.Context) {
3636
switch r := ctx.Message().(type) {
37+
case *actor.Started:
38+
//pass
3739
case *SetGossipStateKey:
3840
ga.onSetGossipStateKey(r, ctx)
3941
case *GetGossipStateRequest:
@@ -49,7 +51,7 @@ func (ga *GossipActor) Receive(ctx actor.Context) {
4951
case *ClusterTopology:
5052
ga.onClusterTopology(r)
5153
case *GossipResponse:
52-
// noop: review after roger's work is done
54+
plog.Error("GossipResponse should not be received by GossipActor") //it should be a response to a request
5355
default:
5456
plog.Warn("Gossip received unknown message request", log.Message(r))
5557
}
@@ -74,7 +76,7 @@ func (ga *GossipActor) onGetGossipStateKey(r *GetGossipStateRequest, ctx actor.C
7476
}
7577

7678
func (ga *GossipActor) onGossipRequest(r *GossipRequest, ctx actor.Context) {
77-
plog.Debug("Gossip request", log.PID("sender", ctx.Sender()))
79+
plog.Debug("OnGossipRequest", log.PID("sender", ctx.Sender()))
7880
ga.ReceiveState(r.State, ctx)
7981

8082
if !GetCluster(ctx.ActorSystem()).MemberList.ContainsMemberID(r.MemberId) {
@@ -97,26 +99,36 @@ func (ga *GossipActor) onGossipRequest(r *GossipRequest, ctx actor.Context) {
9799
return
98100
}
99101

100-
msg := GossipResponse{
101-
State: memberState.State,
102-
}
103-
future := ctx.RequestFuture(ctx.Sender(), &msg, GetCluster(ctx.ActorSystem()).Config.GossipRequestTimeout)
104-
105-
// wait until we get a response or an error from the future
106-
resp, err := future.Result()
107-
if err != nil {
108-
plog.Error("onSendGossipState failed", log.Error(err))
109-
110-
return
111-
}
112-
113-
if _, ok := resp.(*GossipResponseAck); ok {
114-
memberState.CommitOffsets()
115-
116-
return
117-
}
118-
119-
plog.Error("onSendGossipState received unknown response message", log.Message(r))
102+
ctx.Respond(&GossipResponse{})
103+
return
104+
105+
//turn off acking for now
106+
107+
//msg := GossipResponse{
108+
// State: memberState.State,
109+
//}
110+
//future := ctx.RequestFuture(ctx.Sender(), &msg, GetCluster(ctx.ActorSystem()).Config.GossipRequestTimeout)
111+
//
112+
//ctx.ReenterAfter(future, func(res interface{}, err error) {
113+
// if err != nil {
114+
// plog.Warn("onGossipRequest failed", log.String("MemberId", r.MemberId), log.Error(err))
115+
// return
116+
// }
117+
//
118+
// if _, ok := res.(*GossipResponseAck); ok {
119+
// memberState.CommitOffsets()
120+
// return
121+
// }
122+
//
123+
// m, ok := res.(proto.Message)
124+
// if !ok {
125+
// plog.Warn("onGossipRequest failed", log.String("MemberId", r.MemberId), log.Error(err))
126+
// return
127+
// }
128+
// n := string(proto.MessageName(m).Name())
129+
//
130+
// plog.Error("onGossipRequest received unknown response message", log.String("type", n), log.Message(r))
131+
//})
120132
}
121133

122134
func (ga *GossipActor) onSetGossipStateKey(r *SetGossipStateKey, ctx actor.Context) {
@@ -145,43 +157,39 @@ func (ga *GossipActor) ReceiveState(remoteState *GossipState, ctx actor.Context)
145157

146158
func (ga *GossipActor) sendGossipForMember(member *Member, memberStateDelta *MemberStateDelta, ctx actor.Context) {
147159
pid := actor.NewPID(member.Address(), DefaultGossipActorName)
148-
plog.Info("Sending GossipRequest", log.String("MemberId", member.Id))
160+
plog.Debug("Sending GossipRequest", log.String("MemberId", member.Id))
149161

150162
// a short timeout is massively important, we cannot afford hanging around waiting
151163
// for timeout, blocking other gossips from getting through
152164

153165
msg := GossipRequest{
154-
// TODO: Uncomment this line when we replace the current "address:port" as ID
155-
// with the proper ActorSystem.ID after new API refactor changes
156-
// Oscar Campos: 2022-04-09
157-
// MemberId: ctx.ActorSystem().ID,
158-
MemberId: member.Address(),
166+
MemberId: member.Id,
159167
State: memberStateDelta.State,
160168
}
161169
future := ctx.RequestFuture(pid, &msg, ga.gossipRequestTimeout)
162170

163-
// wait until we get a response or an error from the future
164-
r, err := future.Result()
165-
if err != nil {
166-
plog.Error("onSendGossipState failed", log.Error(err))
171+
ctx.ReenterAfter(future, func(res interface{}, err error) {
172+
if ctx.Sender() != nil {
173+
ctx.Send(ctx.Sender(), &GossipResponseAck{})
174+
}
167175

168-
return
169-
}
176+
if err != nil {
177+
plog.Warn("sendGossipForMember failed", log.String("MemberId", member.Id), log.Error(err))
178+
return
179+
}
170180

171-
resp, ok := r.(*GossipResponse)
172-
if !ok {
173-
plog.Error("onSendGossipState received unknown response message", log.Message(r))
181+
resp, ok := res.(*GossipResponse)
182+
if !ok {
183+
plog.Error("sendGossipForMember received unknown response message", log.Message(resp))
174184

175-
return
176-
}
185+
return
186+
}
177187

178-
memberStateDelta.CommitOffsets()
188+
memberStateDelta.CommitOffsets()
179189

180-
if resp.State != nil {
181-
ga.ReceiveState(resp.State, ctx)
190+
if resp.State != nil {
191+
ga.ReceiveState(resp.State, ctx)
182192

183-
if ctx.Sender() != nil {
184-
ctx.Send(ctx.Sender(), &GossipResponseAck{})
185193
}
186-
}
194+
})
187195
}

0 commit comments

Comments
 (0)