From 5f301dad4387843ba1532e878b5a3f42febdb224 Mon Sep 17 00:00:00 2001 From: wangxw <996268132@qq.com> Date: Sat, 5 Nov 2022 16:11:08 +0800 Subject: [PATCH 1/5] add Activate and Deactivate interface for actor, do sth when create or remove actors Signed-off-by: wangxw <996268132@qq.com> --- actor/actor.go | 4 ++++ actor/manager/container.go | 11 ++++++++++- actor/manager/manager.go | 3 ++- actor/mock/mock_factory_impl.go | 16 ++++++++++++++++ actor/mock/mock_server.go | 8 ++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/actor/actor.go b/actor/actor.go index 4dfaa79..8b147c9 100644 --- a/actor/actor.go +++ b/actor/actor.go @@ -43,6 +43,10 @@ type Server interface { // SaveState is impl by ServerImplBase, It saves the state cache of this actor instance to state store component by calling api of daprd. // Save state is called at two places: 1. On invocation of this actor instance. 2. When new actor starts. SaveState() error + // Activate called when actor created by actor manager + Activate() error + // Deactivate called before actor removed by actor manager + Deactivate() error } type ReminderCallee interface { diff --git a/actor/manager/container.go b/actor/manager/container.go index 35f9db5..19bf002 100644 --- a/actor/manager/container.go +++ b/actor/manager/container.go @@ -28,6 +28,7 @@ import ( type ActorContainer interface { Invoke(methodName string, param []byte) ([]reflect.Value, actorErr.ActorErr) GetActor() actor.Server + Deactivate() error } // DefaultActorContainer contains actor instance and methods type info generated from actor. @@ -43,8 +44,12 @@ func NewDefaultActorContainer(actorID string, impl actor.Server, serializer code daprClient, _ := dapr.NewClient() // create state manager for this new actor impl.SetStateManager(state.NewActorStateManager(impl.Type(), actorID, state.NewDaprStateAsyncProvider(daprClient))) + err := impl.Activate() + if err != nil { + return nil, actorErr.ErrSaveStateFailed + } // save state of this actor - err := impl.SaveState() + err = impl.SaveState() if err != nil { return nil, actorErr.ErrSaveStateFailed } @@ -84,3 +89,7 @@ func (d *DefaultActorContainer) Invoke(methodName string, param []byte) ([]refle returnValue := methodType.method.Func.Call(argsValues) return returnValue, actorErr.Success } + +func (d *DefaultActorContainer) Deactivate() error { + return d.actor.Deactivate() +} diff --git a/actor/manager/manager.go b/actor/manager/manager.go index ae47612..6c63e12 100644 --- a/actor/manager/manager.go +++ b/actor/manager/manager.go @@ -122,10 +122,11 @@ func (m *DefaultActorManager) InvokeMethod(actorID, methodName string, request [ // DeactivateActor removes actor from actor manager. func (m *DefaultActorManager) DeactivateActor(actorID string) actorErr.ActorErr { - _, ok := m.activeActors.Load(actorID) + actor, ok := m.activeActors.Load(actorID) if !ok { return actorErr.ErrActorIDNotFound } + actor.(ActorContainer).Deactivate() m.activeActors.Delete(actorID) return actorErr.Success } diff --git a/actor/mock/mock_factory_impl.go b/actor/mock/mock_factory_impl.go index 2fb954a..1da68e4 100644 --- a/actor/mock/mock_factory_impl.go +++ b/actor/mock/mock_factory_impl.go @@ -27,6 +27,14 @@ type ActorImpl struct { actor.ServerImplBase } +func (t *ActorImpl) Activate() error { + return nil +} + +func (t *ActorImpl) Deactivate() error { + return nil +} + func (t *ActorImpl) Type() string { return "testActorType" } @@ -46,6 +54,14 @@ type NotReminderCalleeActor struct { actor.ServerImplBase } +func (t *NotReminderCalleeActor) Activate() error { + return nil +} + +func (t *NotReminderCalleeActor) Deactivate() error { + return nil +} + func (t *NotReminderCalleeActor) Type() string { return "testActorNotReminderCalleeType" } diff --git a/actor/mock/mock_server.go b/actor/mock/mock_server.go index 7972eba..3f3fa6e 100644 --- a/actor/mock/mock_server.go +++ b/actor/mock/mock_server.go @@ -114,3 +114,11 @@ func (mr *MockServerMockRecorder) Type() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*MockServer)(nil).Type)) } + +func (m *MockServer) Activate() error { + return nil +} + +func (m *MockServer) Deactivate() error { + return nil +} From 2bc9b714c429287aefa41f4ee925c1fd4ce8999b Mon Sep 17 00:00:00 2001 From: wXwcoder <996268132@qq.com> Date: Tue, 20 Feb 2024 02:19:36 +0800 Subject: [PATCH 2/5] Update manager.go fix ActorManagerContext DeactivateActor --- actor/manager/manager.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/actor/manager/manager.go b/actor/manager/manager.go index 423130d..010bd14 100644 --- a/actor/manager/manager.go +++ b/actor/manager/manager.go @@ -164,8 +164,7 @@ func (m *DefaultActorManagerContext) InvokeMethod(ctx context.Context, actorID, return rspData, actorErr.Success } -// DeactivateActor removes actor from actor manager. -func (m *DefaultActorManager) DeactivateActor(actorID string) actorErr.ActorErr { +func (m *DefaultActorManagerContext) DeactivateActor(_ context.Context, actorID string) actorErr.ActorErr { actor, ok := m.activeActors.Load(actorID) if !ok { return actorErr.ErrActorIDNotFound @@ -175,15 +174,6 @@ func (m *DefaultActorManager) DeactivateActor(actorID string) actorErr.ActorErr return actorErr.Success } -func (m *DefaultActorManagerContext) DeactivateActor(_ context.Context, actorID string) actorErr.ActorErr { - _, ok := m.activeActors.Load(actorID) - if !ok { - return actorErr.ErrActorIDNotFound - } - m.activeActors.Delete(actorID) - return actorErr.Success -} - // InvokeReminder invoke reminder function with given params. func (m *DefaultActorManagerContext) InvokeReminder(ctx context.Context, actorID, reminderName string, params []byte) actorErr.ActorErr { if m.factory == nil { From f46102ba99307c26a2cbb1b6e7deb9ee4de096d3 Mon Sep 17 00:00:00 2001 From: wXwcoder <996268132@qq.com> Date: Tue, 20 Feb 2024 02:32:41 +0800 Subject: [PATCH 3/5] Update container.go fix actor Activate interface --- actor/manager/container.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor/manager/container.go b/actor/manager/container.go index 2733a4d..54df905 100644 --- a/actor/manager/container.go +++ b/actor/manager/container.go @@ -81,12 +81,12 @@ func NewDefaultActorContainerContext(ctx context.Context, actorID string, impl a daprClient, _ := dapr.NewClient() // create state manager for this new actor impl.SetStateManager(state.NewActorStateManagerContext(impl.Type(), actorID, state.NewDaprStateAsyncProvider(daprClient))) - err := impl.Activate() + err := impl.Activate() if err != nil { return nil, actorErr.ErrSaveStateFailed } // save state of this actor - err := impl.SaveState(ctx) + err = impl.SaveState(ctx) if err != nil { return nil, actorErr.ErrSaveStateFailed } From d2528d78db6dcee68e221bd149051f8dc1bf90b8 Mon Sep 17 00:00:00 2001 From: wXwcoder <996268132@qq.com> Date: Tue, 20 Feb 2024 02:33:49 +0800 Subject: [PATCH 4/5] Update actor.go fix actor Activate interface --- actor/actor.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/actor/actor.go b/actor/actor.go index a41a704..2cb06b0 100644 --- a/actor/actor.go +++ b/actor/actor.go @@ -68,6 +68,10 @@ type ServerContext interface { // SaveState is impl by ServerImplBase, It saves the state cache of this actor instance to state store component by calling api of daprd. // Save state is called at two places: 1. On invocation of this actor instance. 2. When new actor starts. SaveState(context.Context) error + // Activate called when actor created by actor manager + Activate() error + // Deactivate called before actor removed by actor manager + Deactivate() error } type ReminderCallee interface { From 5d56a9ddc0a5c7649957767c36cc39181aa05d74 Mon Sep 17 00:00:00 2001 From: wXwcoder <996268132@qq.com> Date: Tue, 20 Feb 2024 02:43:37 +0800 Subject: [PATCH 5/5] Update actor.go fix actor Activate Deactivate interface --- actor/actor.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/actor/actor.go b/actor/actor.go index 2cb06b0..a4df241 100644 --- a/actor/actor.go +++ b/actor/actor.go @@ -139,6 +139,16 @@ func (b *ServerImplBase) SaveState() error { return b.ctx.SaveState(context.Background()) } +// Activate when actor created by actor manager +func (b *ServerImplBase) Activate() error { + return nil +} + +// Deactivate before actor removed by actor manager +func (b *ServerImplBase) Deactivate() error { + return nil +} + // Deprecated: Use ServerImplBaseCtx instead. func (b *ServerImplBase) WithContext() *ServerImplBaseCtx { b.ctx.lock.RLock() @@ -187,6 +197,16 @@ func (b *ServerImplBaseCtx) SaveState(ctx context.Context) error { return nil } +// Activate when actor created by actor manager +func (b *ServerImplBaseCtx) Activate() error { + return nil +} + +// Deactivate before actor removed by actor manager +func (b *ServerImplBaseCtx) Deactivate() error { + return nil +} + // Deprecated: StateManager is deprecated in favour of StateManagerContext. type StateManager interface { // Add is to add new state store with @stateName and @value