@@ -3,36 +3,21 @@ package workerpool
3
3
import (
4
4
"runtime"
5
5
"sync"
6
- "sync/atomic"
7
6
"time"
8
7
9
8
"github.com/openservicemesh/osm/pkg/logger"
10
9
)
11
10
12
- const (
13
- // Size of the job queue per worker
14
- maxJobPerWorker = 4096
15
- )
16
-
17
11
var (
18
12
log = logger .New ("workerpool" )
19
13
)
20
14
21
- // worker context for a worker routine
22
- type worker struct {
23
- id int
24
- jobs chan Job // Job queue
25
- stop chan struct {} // Stop channel
26
- wg * sync.WaitGroup // Pointer to WorkerPool wg
27
- jobsProcessed uint64 // Jobs processed by this worker
28
- }
29
-
30
15
// WorkerPool object representation
31
16
type WorkerPool struct {
32
- wg sync.WaitGroup // Sync group, to stop workers if needed
33
- workerContext [] * worker // Worker contexts
34
- nWorkers uint64 // Number of workers. Uint64 for easier mod hash later
35
- rRobinCounter uint64 // Used only by the round robin api. Modified atomically on API.
17
+ wg sync.WaitGroup // Sync group, to stop workers if needed
18
+ nWorkers uint64 // Number of workers. Uint64 for easier mod hash later
19
+ jobs chan Job
20
+ stop chan struct {} // Stop channel
36
21
}
37
22
38
23
// Job is a runnable interface to queue jobs on a WorkerPool
@@ -62,72 +47,55 @@ func NewWorkerPool(nWorkers int) *WorkerPool {
62
47
63
48
log .Info ().Msgf ("New worker pool setting up %d workers" , nWorkers )
64
49
65
- var workPool WorkerPool
50
+ workPool := & WorkerPool {
51
+ nWorkers : uint64 (nWorkers ),
52
+ jobs : make (chan Job , nWorkers ),
53
+ stop : make (chan struct {}),
54
+ }
66
55
for i := 0 ; i < nWorkers ; i ++ {
67
- workPool .workerContext = append (workPool .workerContext ,
68
- & worker {
69
- id : i ,
70
- jobs : make (chan Job , maxJobPerWorker ),
71
- stop : make (chan struct {}, 1 ),
72
- wg : & workPool .wg ,
73
- jobsProcessed : 0 ,
74
- },
75
- )
56
+ i := i
76
57
workPool .wg .Add (1 )
77
- workPool .nWorkers ++
78
-
79
- go (workPool .workerContext [i ]).work ()
58
+ go workPool .work (i )
80
59
}
81
60
82
- return & workPool
61
+ return workPool
83
62
}
84
63
85
64
// AddJob posts the job on a worker queue
86
65
// Uses Hash underneath to choose worker to post the job to
87
66
func (wp * WorkerPool ) AddJob (job Job ) <- chan struct {} {
88
- wp .workerContext [ job . Hash () % wp . nWorkers ]. jobs <- job
67
+ wp .jobs <- job
89
68
return job .GetDoneCh ()
90
69
}
91
70
92
- // AddJobRoundRobin adds a job in round robin to the queues
93
- // Concurrent calls to AddJobRoundRobin are thread safe and fair
94
- // between each other
95
- func (wp * WorkerPool ) AddJobRoundRobin (jobs Job ) {
96
- added := atomic .AddUint64 (& wp .rRobinCounter , 1 )
97
- wp .workerContext [added % wp .nWorkers ].jobs <- jobs
98
- }
99
-
100
71
// GetWorkerNumber get number of queues/workers
101
72
func (wp * WorkerPool ) GetWorkerNumber () int {
102
73
return int (wp .nWorkers )
103
74
}
104
75
105
76
// Stop stops the workerpool
106
77
func (wp * WorkerPool ) Stop () {
107
- for _ , worker := range wp .workerContext {
108
- worker .stop <- struct {}{}
109
- }
78
+ close (wp .stop )
110
79
wp .wg .Wait ()
111
80
}
112
81
113
- func (workContext * worker ) work () {
114
- defer workContext .wg .Done ()
82
+ func (wp * WorkerPool ) work (id int ) {
83
+ defer wp .wg .Done ()
84
+
85
+ log .Info ().Msgf ("Worker %d running" , id )
115
86
116
- log .Info ().Msgf ("Worker %d running" , workContext .id )
117
87
for {
118
88
select {
119
- case j := <- workContext .jobs :
89
+ case j := <- wp .jobs :
120
90
t := time .Now ()
121
- log .Debug ().Msgf ("work[%d]: Starting %v" , workContext . id , j .JobName ())
91
+ log .Debug ().Msgf ("work[%d]: Starting %v" , id , j .JobName ())
122
92
123
93
// Run current job
124
94
j .Run ()
125
95
126
- log .Debug ().Msgf ("work[%d][%s] : took %v" , workContext .id , j .JobName (), time .Since (t ))
127
- workContext .jobsProcessed ++
128
-
129
- case <- workContext .stop :
130
- log .Debug ().Msgf ("work[%d]: Stopped" , workContext .id )
96
+ log .Debug ().Msgf ("work[%d][%s] : took %v" , id , j .JobName (), time .Since (t ))
97
+ case <- wp .stop :
98
+ log .Debug ().Msgf ("work[%d]: Stopped" , id )
131
99
return
132
100
}
133
101
}
0 commit comments