@@ -2,6 +2,7 @@ package java_process
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"github.com/procyon-projects/chrono"
6
7
"github.com/rs/zerolog/log"
7
8
"github.com/shirou/gopsutil/process"
@@ -23,12 +24,11 @@ type DiscoveryWork struct {
23
24
}
24
25
25
26
var (
26
- discoveredPidsMutex sync.Mutex
27
- discoveredPids []int32
28
- ignoredPidsMutex sync.Mutex
29
- ignoredPids []int32
30
- listeners []Listener
31
- RunningStates = []string {"R" , "W" , "S" , "I" , "L" } // Running, Waiting, Sleeping
27
+ discoveredPids sync.Map
28
+ ignoredPidsMutex sync.Mutex
29
+ ignoredPids []string
30
+ listeners []Listener
31
+ RunningStates = []string {"R" , "W" , "S" , "I" , "L" } // Running, Waiting, Sleeping
32
32
33
33
discoveryJobs = make (chan DiscoveryWork )
34
34
)
@@ -56,7 +56,7 @@ func Start() {
56
56
_ , err = taskScheduler .ScheduleWithFixedDelay (func (ctx context.Context ) {
57
57
// Clear ignored pids because they might be reused
58
58
ignoredPidsMutex .Lock ()
59
- ignoredPids = []int32 {}
59
+ ignoredPids = []string {}
60
60
ignoredPidsMutex .Unlock ()
61
61
}, 1 * time .Hour )
62
62
@@ -88,16 +88,32 @@ func updatePids() {
88
88
return
89
89
}
90
90
for _ , p := range processes {
91
- if utils .Contains (ignoredPids , p .Pid ) {
91
+ createTime , err := p .CreateTime ()
92
+ if err != nil {
93
+ log .Err (err ).Msgf ("Failed to get process creation time. Pid: %d. Error: %s" , p .Pid , err .Error ())
94
+ return
95
+ }
96
+ cacheId := createCacheId (p .Pid , createTime )
97
+ if utils .ContainsString (ignoredPids , cacheId ) {
92
98
log .Trace ().Msgf ("Process %d is ignored" , p .Pid )
93
99
continue
94
100
}
95
101
discover (p , initialRetries )
96
102
}
97
103
}
98
104
105
+ func createCacheId (pid int32 , createTime int64 ) string {
106
+ return fmt .Sprintf ("%d-%d" , pid , createTime )
107
+ }
108
+
99
109
func discoverProcessJVM (job DiscoveryWork ) {
100
- if ! utils .Contains (discoveredPids , job .p .Pid ) {
110
+ createTime , err := job .p .CreateTime ()
111
+ if err != nil {
112
+ log .Err (err ).Msgf ("Failed to get process creation time. Pid: %d. Error: %s" , job .p .Pid , err .Error ())
113
+ return
114
+ }
115
+ cacheId := createCacheId (job .p .Pid , createTime )
116
+ if _ , ok := discoveredPids .Load (cacheId ); ! ok {
101
117
if IsRunning (job .p ) {
102
118
if ! checkProcessPathAvailable (job .p ) {
103
119
log .Debug ().Msgf ("Process %d is running but path is not available yet." , job .p .Pid )
@@ -129,25 +145,34 @@ func discoverProcessJVM(job DiscoveryWork) {
129
145
}
130
146
131
147
func addPidToDiscoveredPids (job DiscoveryWork ) {
132
- discoveredPidsMutex .Lock ()
133
- discoveredPids = append (discoveredPids , job .p .Pid )
134
- discoveredPidsMutex .Unlock ()
148
+ createTime , err := job .p .CreateTime ()
149
+ if err != nil {
150
+ log .Err (err ).Msgf ("Failed to get process creation time. Pid: %d. Error: %s" , job .p .Pid , err .Error ())
151
+ return
152
+ }
153
+ cacheId := createCacheId (job .p .Pid , createTime )
154
+ discoveredPids .Store (cacheId , job .p .Pid )
135
155
}
136
156
137
157
func RemovePidFromDiscoveredPids (pid int32 ) {
138
- discoveredPidsMutex .Lock ()
139
- for i , p := range discoveredPids {
140
- if p == pid {
141
- discoveredPids = append (discoveredPids [:i ], discoveredPids [i + 1 :]... )
142
- break
158
+ discoveredPids .Range (func (key , value interface {}) bool {
159
+ if value .(int32 ) == pid {
160
+ discoveredPids .Delete (key )
161
+ return false
143
162
}
144
- }
145
- discoveredPidsMutex . Unlock ( )
163
+ return true
164
+ } )
146
165
}
147
166
148
167
func addPidToIgnoredPids (job DiscoveryWork ) {
168
+ createTime , err := job .p .CreateTime ()
169
+ if err != nil {
170
+ log .Err (err ).Msgf ("Failed to get process creation time. Pid: %d. Error: %s" , job .p .Pid , err .Error ())
171
+ return
172
+ }
173
+ cacheId := createCacheId (job .p .Pid , createTime )
149
174
ignoredPidsMutex .Lock ()
150
- ignoredPids = append (ignoredPids , job . p . Pid )
175
+ ignoredPids = append (ignoredPids , cacheId )
151
176
ignoredPidsMutex .Unlock ()
152
177
}
153
178
@@ -166,16 +191,15 @@ func notifyListenersForNewProcess(p *process.Process) bool {
166
191
167
192
func AddListener (listener Listener ) {
168
193
listeners = append (listeners , listener )
169
- for _ , pid := range discoveredPids {
170
- p , err := process .NewProcess (pid )
194
+ discoveredPids . Range ( func ( key , pid interface {}) bool {
195
+ p , err := process .NewProcess (pid .( int32 ) )
171
196
if err != nil {
172
197
log .Warn ().Err (err ).Msg ("Error in listener for notifyListenersForNewProcess" )
173
- continue
174
- }
175
- if isJava (p ) {
198
+ } else if isJava (p ) {
176
199
listener .NewJavaProcess (p )
177
200
}
178
- }
201
+ return true
202
+ })
179
203
}
180
204
181
205
func RemoveListener (listener Listener ) {
0 commit comments