@@ -164,17 +164,17 @@ std::vector<std::string> Worker::GetPendingTaskTrace() {
164
164
return traces;
165
165
}
166
166
167
- WorkerSet::WorkerSet (std::string name, uint32_t worker_num, int64_t max_pending_task_count)
167
+ ExecqWorkerSet::ExecqWorkerSet (std::string name, uint32_t worker_num, int64_t max_pending_task_count)
168
168
: name_(name),
169
169
worker_num_ (worker_num),
170
170
max_pending_task_count_(max_pending_task_count),
171
171
active_worker_id_(0 ),
172
172
total_task_count_metrics_(fmt::format(" dingo_worker_set_{}_total_task_count" , name)),
173
173
pending_task_count_metrics_(fmt::format(" dingo_worker_set_{}_pending_task_count" , name)) {}
174
174
175
- WorkerSet ::~WorkerSet () = default ;
175
+ ExecqWorkerSet ::~ExecqWorkerSet () = default ;
176
176
177
- bool WorkerSet ::Init () {
177
+ bool ExecqWorkerSet ::Init () {
178
178
for (int i = 0 ; i < worker_num_; ++i) {
179
179
auto worker = Worker::New ([this ](WorkerEventType type) { WatchWorker (type); });
180
180
if (!worker->Init ()) {
@@ -186,13 +186,13 @@ bool WorkerSet::Init() {
186
186
return true ;
187
187
}
188
188
189
- void WorkerSet ::Destroy () {
189
+ void ExecqWorkerSet ::Destroy () {
190
190
for (const auto & worker : workers_) {
191
191
worker->Destroy ();
192
192
}
193
193
}
194
194
195
- bool WorkerSet ::ExecuteRR (TaskRunnablePtr task) {
195
+ bool ExecqWorkerSet ::ExecuteRR (TaskRunnablePtr task) {
196
196
if (BAIDU_UNLIKELY (max_pending_task_count_ > 0 &&
197
197
pending_task_count_.load (std::memory_order_relaxed) > max_pending_task_count_)) {
198
198
DINGO_LOG (WARNING) << fmt::format (" [execqueue] exceed max pending task limit, {}/{}" ,
@@ -209,7 +209,7 @@ bool WorkerSet::ExecuteRR(TaskRunnablePtr task) {
209
209
return ret;
210
210
}
211
211
212
- bool WorkerSet ::ExecuteLeastQueue (TaskRunnablePtr task) {
212
+ bool ExecqWorkerSet ::ExecuteLeastQueue (TaskRunnablePtr task) {
213
213
if (BAIDU_UNLIKELY (max_pending_task_count_ > 0 &&
214
214
pending_task_count_.load (std::memory_order_relaxed) > max_pending_task_count_)) {
215
215
DINGO_LOG (WARNING) << fmt::format (" [execqueue] exceed max pending task limit, {}/{}" ,
@@ -226,7 +226,7 @@ bool WorkerSet::ExecuteLeastQueue(TaskRunnablePtr task) {
226
226
return ret;
227
227
}
228
228
229
- bool WorkerSet ::ExecuteHashByRegionId (int64_t region_id, TaskRunnablePtr task) {
229
+ bool ExecqWorkerSet ::ExecuteHashByRegionId (int64_t region_id, TaskRunnablePtr task) {
230
230
if (BAIDU_UNLIKELY (max_pending_task_count_ > 0 &&
231
231
pending_task_count_.load (std::memory_order_relaxed) > max_pending_task_count_)) {
232
232
DINGO_LOG (WARNING) << fmt::format (" [execqueue] exceed max pending task limit, {}/{}" ,
@@ -243,13 +243,13 @@ bool WorkerSet::ExecuteHashByRegionId(int64_t region_id, TaskRunnablePtr task) {
243
243
return ret;
244
244
}
245
245
246
- void WorkerSet ::WatchWorker (WorkerEventType type) {
246
+ void ExecqWorkerSet ::WatchWorker (WorkerEventType type) {
247
247
if (type == WorkerEventType::kFinishTask ) {
248
248
DecPendingTaskCount ();
249
249
}
250
250
}
251
251
252
- uint32_t WorkerSet ::LeastPendingTaskWorker () {
252
+ uint32_t ExecqWorkerSet ::LeastPendingTaskWorker () {
253
253
uint32_t index = 0 ;
254
254
int32_t min_pending_count = INT32_MAX;
255
255
uint32_t worker_num = workers_.size ();
@@ -265,23 +265,23 @@ uint32_t WorkerSet::LeastPendingTaskWorker() {
265
265
return index ;
266
266
}
267
267
268
- uint64_t WorkerSet ::TotalTaskCount () { return total_task_count_metrics_.get_value (); }
268
+ uint64_t ExecqWorkerSet ::TotalTaskCount () { return total_task_count_metrics_.get_value (); }
269
269
270
- void WorkerSet ::IncTotalTaskCount () { total_task_count_metrics_ << 1 ; }
270
+ void ExecqWorkerSet ::IncTotalTaskCount () { total_task_count_metrics_ << 1 ; }
271
271
272
- uint64_t WorkerSet ::PendingTaskCount () { return pending_task_count_.load (std::memory_order_relaxed); }
272
+ uint64_t ExecqWorkerSet ::PendingTaskCount () { return pending_task_count_.load (std::memory_order_relaxed); }
273
273
274
- void WorkerSet ::IncPendingTaskCount () {
274
+ void ExecqWorkerSet ::IncPendingTaskCount () {
275
275
pending_task_count_metrics_ << 1 ;
276
276
pending_task_count_.fetch_add (1 , std::memory_order_relaxed);
277
277
}
278
278
279
- void WorkerSet ::DecPendingTaskCount () {
279
+ void ExecqWorkerSet ::DecPendingTaskCount () {
280
280
pending_task_count_metrics_ << -1 ;
281
281
pending_task_count_.fetch_sub (1 , std::memory_order_relaxed);
282
282
}
283
283
284
- std::vector<std::vector<std::string>> WorkerSet ::GetPendingTaskTrace () {
284
+ std::vector<std::vector<std::string>> ExecqWorkerSet ::GetPendingTaskTrace () {
285
285
std::vector<std::vector<std::string>> traces;
286
286
287
287
traces.reserve (workers_.size ());
@@ -292,10 +292,12 @@ std::vector<std::vector<std::string>> WorkerSet::GetPendingTaskTrace() {
292
292
return traces;
293
293
}
294
294
295
- PriorWorkerSet::PriorWorkerSet (std::string name, uint32_t worker_num, int64_t max_pending_task_count, bool use_pthread)
295
+ SimpleWorkerSet::SimpleWorkerSet (std::string name, uint32_t worker_num, int64_t max_pending_task_count,
296
+ bool use_pthread, bool use_prior)
296
297
: name_(name),
297
298
worker_num_(worker_num),
298
299
use_pthread_(use_pthread),
300
+ use_prior_(use_prior),
299
301
max_pending_task_count_(max_pending_task_count),
300
302
total_task_count_metrics_(fmt::format(" dingo_prior_worker_set_{}_total_task_count" , name)),
301
303
pending_task_count_metrics_(fmt::format(" dingo_prior_worker_set_{}_pending_task_count" , name)),
@@ -305,43 +307,72 @@ PriorWorkerSet::PriorWorkerSet(std::string name, uint32_t worker_num, int64_t ma
305
307
bthread_cond_init (&cond_, nullptr );
306
308
}
307
309
308
- PriorWorkerSet ::~PriorWorkerSet () {
310
+ SimpleWorkerSet ::~SimpleWorkerSet () {
309
311
bthread_cond_destroy (&cond_);
310
312
bthread_mutex_destroy (&mutex_);
311
313
}
312
314
313
- bool PriorWorkerSet ::Init () {
315
+ bool SimpleWorkerSet ::Init () {
314
316
uint32_t i = 0 ;
315
317
316
318
auto worker_function = [this , &i]() {
317
319
if (use_pthread_) {
318
320
pthread_setname_np (pthread_self (), (name_ + " :" + std::to_string (i)).c_str ());
319
321
}
320
322
321
- while (true ) {
322
- bthread_mutex_lock (&mutex_);
323
- while (pending_task_count_.load (std::memory_order_relaxed) == 0 ) {
324
- bthread_cond_wait (&cond_, &mutex_);
325
- }
323
+ if (!use_prior_) {
324
+ while (true ) {
325
+ bthread_mutex_lock (&mutex_);
326
+ while (tasks_.empty ()) {
327
+ bthread_cond_wait (&cond_, &mutex_);
328
+ }
326
329
327
- // get task from task queue
328
- TaskRunnablePtr task = nullptr ;
329
- int64_t now_time_us = 0 ;
330
- if (! tasks_.empty ()) {
331
- task = tasks_.top ();
332
- tasks_. pop ();
330
+ // get task from task queue
331
+ TaskRunnablePtr task = nullptr ;
332
+ if ( BAIDU_LIKELY (!tasks_. empty ())) {
333
+ task = tasks_.front ();
334
+ tasks_.pop ();
335
+ }
333
336
334
- now_time_us = Helper::TimestampUs ();
335
- queue_wait_metrics_ << now_time_us - task->CreateTimeUs ();
336
- }
337
+ bthread_mutex_unlock (&mutex_);
337
338
338
- bthread_mutex_unlock (&mutex_);
339
+ if (BAIDU_UNLIKELY (task != nullptr )) {
340
+ int64_t now_time_us = Helper::TimestampUs ();
341
+ queue_wait_metrics_ << now_time_us - task->CreateTimeUs ();
339
342
340
- if (BAIDU_UNLIKELY (task != nullptr )) {
341
- task->Run ();
342
- queue_run_metrics_ << Helper::TimestampUs () - now_time_us;
343
- DecPendingTaskCount ();
344
- Notify (WorkerEventType::kFinishTask );
343
+ task->Run ();
344
+
345
+ queue_run_metrics_ << Helper::TimestampUs () - now_time_us;
346
+ DecPendingTaskCount ();
347
+ Notify (WorkerEventType::kFinishTask );
348
+ }
349
+ }
350
+ } else {
351
+ while (true ) {
352
+ bthread_mutex_lock (&mutex_);
353
+ while (pending_task_count_.load (std::memory_order_relaxed) == 0 ) {
354
+ bthread_cond_wait (&cond_, &mutex_);
355
+ }
356
+
357
+ // get task from task queue
358
+ TaskRunnablePtr task = nullptr ;
359
+ if (BAIDU_LIKELY (!prior_tasks_.empty ())) {
360
+ task = prior_tasks_.top ();
361
+ prior_tasks_.pop ();
362
+ }
363
+
364
+ bthread_mutex_unlock (&mutex_);
365
+
366
+ if (BAIDU_LIKELY (task != nullptr )) {
367
+ int64_t now_time_us = Helper::TimestampUs ();
368
+ queue_wait_metrics_ << now_time_us - task->CreateTimeUs ();
369
+
370
+ task->Run ();
371
+
372
+ queue_run_metrics_ << Helper::TimestampUs () - now_time_us;
373
+ DecPendingTaskCount ();
374
+ Notify (WorkerEventType::kFinishTask );
375
+ }
345
376
}
346
377
}
347
378
};
@@ -359,7 +390,7 @@ bool PriorWorkerSet::Init() {
359
390
return true ;
360
391
}
361
392
362
- void PriorWorkerSet ::Destroy () {
393
+ void SimpleWorkerSet ::Destroy () {
363
394
if (use_pthread_) {
364
395
for (auto & std_thread : pthread_workers_) {
365
396
std_thread.join ();
@@ -371,61 +402,66 @@ void PriorWorkerSet::Destroy() {
371
402
}
372
403
}
373
404
374
- bool PriorWorkerSet::Execute (TaskRunnablePtr task) {
375
- auto pend_task_count = pending_task_count_.load (std::memory_order_relaxed);
376
-
377
- if (BAIDU_UNLIKELY (max_pending_task_count_ > 0 && pend_task_count > max_pending_task_count_)) {
378
- DINGO_LOG (WARNING) << fmt::format (" [execqueue] exceed max pending task limit, {}/{}" ,
379
- pending_task_count_.load (std::memory_order_relaxed), max_pending_task_count_);
380
- return false ;
405
+ bool SimpleWorkerSet::Execute (TaskRunnablePtr task) {
406
+ if (max_pending_task_count_ > 0 ) {
407
+ auto pend_task_count = pending_task_count_.load (std::memory_order_relaxed);
408
+ if (pend_task_count > max_pending_task_count_) {
409
+ DINGO_LOG (WARNING) << fmt::format (" [execqueue] exceed max pending task limit, {}/{}" , pend_task_count,
410
+ max_pending_task_count_);
411
+ return false ;
412
+ }
381
413
}
382
414
383
415
IncPendingTaskCount ();
384
416
IncTotalTaskCount ();
385
417
386
418
bthread_mutex_lock (&mutex_);
387
- tasks_.push (task);
388
- bthread_cond_signal (&cond_);
419
+ if (!use_prior_) {
420
+ tasks_.push (task);
421
+ } else {
422
+ prior_tasks_.push (task);
423
+ }
424
+ bthread_cond_broadcast (&cond_);
389
425
bthread_mutex_unlock (&mutex_);
390
426
391
427
return true ;
392
428
}
393
429
394
- bool PriorWorkerSet ::ExecuteRR (TaskRunnablePtr task) { return Execute (task); }
430
+ bool SimpleWorkerSet ::ExecuteRR (TaskRunnablePtr task) { return Execute (task); }
395
431
396
- bool PriorWorkerSet ::ExecuteLeastQueue (TaskRunnablePtr task) { return Execute (task); }
432
+ bool SimpleWorkerSet ::ExecuteLeastQueue (TaskRunnablePtr task) { return Execute (task); }
397
433
398
- bool PriorWorkerSet ::ExecuteHashByRegionId (int64_t /* region_id*/ , TaskRunnablePtr task) { return Execute (task); }
434
+ bool SimpleWorkerSet ::ExecuteHashByRegionId (int64_t /* region_id*/ , TaskRunnablePtr task) { return Execute (task); }
399
435
400
- void PriorWorkerSet ::WatchWorker (WorkerEventType type) {
436
+ void SimpleWorkerSet ::WatchWorker (WorkerEventType type) {
401
437
if (type == WorkerEventType::kFinishTask ) {
402
438
DecPendingTaskCount ();
403
439
}
404
440
}
405
441
406
- uint64_t PriorWorkerSet ::TotalTaskCount () { return total_task_count_metrics_.get_value (); }
442
+ uint64_t SimpleWorkerSet ::TotalTaskCount () { return total_task_count_metrics_.get_value (); }
407
443
408
- void PriorWorkerSet ::IncTotalTaskCount () { total_task_count_metrics_ << 1 ; }
444
+ void SimpleWorkerSet ::IncTotalTaskCount () { total_task_count_metrics_ << 1 ; }
409
445
410
- uint64_t PriorWorkerSet ::PendingTaskCount () { return pending_task_count_.load (std::memory_order_relaxed); }
446
+ uint64_t SimpleWorkerSet ::PendingTaskCount () { return pending_task_count_.load (std::memory_order_relaxed); }
411
447
412
- void PriorWorkerSet ::IncPendingTaskCount () {
448
+ void SimpleWorkerSet ::IncPendingTaskCount () {
413
449
pending_task_count_metrics_ << 1 ;
414
450
pending_task_count_.fetch_add (1 , std::memory_order_relaxed);
415
451
}
416
452
417
- void PriorWorkerSet ::DecPendingTaskCount () {
453
+ void SimpleWorkerSet ::DecPendingTaskCount () {
418
454
pending_task_count_metrics_ << -1 ;
419
455
pending_task_count_.fetch_sub (1 , std::memory_order_relaxed);
420
456
}
421
457
422
- std::vector<std::vector<std::string>> PriorWorkerSet ::GetPendingTaskTrace () { // NOLINT
458
+ std::vector<std::vector<std::string>> SimpleWorkerSet ::GetPendingTaskTrace () { // NOLINT
423
459
std::vector<std::vector<std::string>> traces;
424
460
425
461
return traces;
426
462
}
427
463
428
- void PriorWorkerSet ::Notify (WorkerEventType type) {
464
+ void SimpleWorkerSet ::Notify (WorkerEventType type) {
429
465
if (notify_func_ != nullptr ) {
430
466
notify_func_ (type);
431
467
}
0 commit comments