-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathruntime.go
More file actions
170 lines (135 loc) · 3.46 KB
/
runtime.go
File metadata and controls
170 lines (135 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package actor
import (
"fmt"
. "github.com/vsdmars/actor/internal/logger"
"go.uber.org/zap"
)
const (
errDupRegister = "actor already registered by name: %s"
)
var (
regActor = registeredActor{
nameUUID: make(map[string]string),
uuidActor: make(map[string]Actor),
}
)
// Cleanup cleans up the use of actor library
func Cleanup() {
defer regActor.rwLock.RUnlock()
regActor.rwLock.RLock()
GetLog().Info(
"Actor Service Cleanup",
zap.String("service", serviceName),
)
for _, actor := range regActor.uuidActor {
actor.close()
GetLog().Info(
"Actor closed due to Cleanup",
zap.String("service", serviceName),
zap.String("actor", actor.Name()),
zap.String("uuid", actor.UUID()),
)
}
LogSync()
}
// Get return registered Actor by name
func Get(name string) (Actor, error) {
return regActor.getByName(name)
}
// GetByName return registered Actor by name
func GetByName(actor string) (Actor, error) {
return Get(actor)
}
// GetByUUID return registered Actor by UUID
func GetByUUID(uuid string) (Actor, error) {
return regActor.getByUUID(uuid)
}
func (r *registeredActor) register(actor Actor) error {
defer r.rwLock.Unlock()
r.rwLock.Lock()
if _, ok := r.nameUUID[actor.Name()]; ok {
GetLog().Error(
"register Actor failed",
zap.String("service", serviceName),
zap.String("actor", actor.Name()),
zap.String("uuid", actor.UUID()),
zap.String("error", fmt.Sprintf(errDupRegister, actor.Name())),
)
return ErrRegisterActor
}
r.nameUUID[actor.Name()] = actor.UUID()
r.uuidActor[actor.UUID()] = actor
GetLog().Info(
"actor registered",
zap.String("service", serviceName),
zap.String("actor", actor.Name()),
zap.String("uuid", actor.UUID()),
)
return nil
}
func (r *registeredActor) deregister(actor Actor) error {
defer r.rwLock.Unlock()
r.rwLock.Lock()
if _, ok := r.nameUUID[actor.Name()]; !ok {
GetLog().Error(
"deregister Actor failed",
zap.String("service", serviceName),
zap.String("actor", actor.Name()),
zap.String("uuid", actor.UUID()),
zap.String("message", "actor haven't registered by name"),
)
return ErrRegisterActor
}
delete(r.uuidActor, actor.UUID())
delete(r.nameUUID, actor.Name())
GetLog().Info(
"actor deregistered",
zap.String("service", serviceName),
zap.String("actor", actor.Name()),
zap.String("uuid", actor.UUID()),
)
return nil
}
func (r *registeredActor) getByName(name string) (Actor, error) {
defer r.rwLock.RUnlock()
r.rwLock.RLock()
if uuid, ok := r.nameUUID[name]; ok {
if actor, ok := r.uuidActor[uuid]; ok {
GetLog().Info(
"get actor by name",
zap.String("service", serviceName),
zap.String("actor", name),
zap.String("uuid", uuid),
zap.String("message", "actor retrieved"),
)
return actor, nil
}
}
GetLog().Error(
"get actor by name failed",
zap.String("service", serviceName),
zap.String("actor", name),
zap.String("message", "actor not registered"),
)
return nil, ErrRetrieveActor
}
func (r *registeredActor) getByUUID(uuid string) (Actor, error) {
defer r.rwLock.RUnlock()
r.rwLock.RLock()
if actor, ok := r.uuidActor[uuid]; ok {
GetLog().Info(
"get actor by uuid",
zap.String("service", serviceName),
zap.String("uuid", uuid),
zap.String("message", "actor retrieved"),
)
return actor, nil
}
GetLog().Error(
"get actor by uuid failed",
zap.String("service", serviceName),
zap.String("uuid", uuid),
zap.String("message", "actor not registered"),
)
return nil, ErrRetrieveActor
}