Skip to content

Commit a50a002

Browse files
authored
Merge pull request #20 from BinChengZhao/feature/stable
fix: timeout-event handle bug.
2 parents 1c5b85b + bd1b01c commit a50a002

File tree

3 files changed

+44
-30
lines changed

3 files changed

+44
-30
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# Version 0.8.2
2+
3+
v0.8.2 New features:
4+
5+
1. FIXED:
6+
When the `TimeoutTask` event fails to remove the handle, Ok(()) is returned by default.
7+
This causes the `TimeoutTask` event to be sent to the outside world by `status_report_sender`,Which is a buggy behavior.
18
# Version 0.8.1
29

310
v0.8.1 New features:

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "delay_timer"
3-
version = "0.8.1"
3+
version = "0.8.2"
44
authors = ["binchengZhao <binchengZhao@outlook.com>"]
55
edition = "2018"
66
repository = "https://github.com/BinChengZhao/delay-timer"

src/timer/event_handle.rs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -174,17 +174,19 @@ impl EventHandle {
174174

175175
let dispatch_result = self.event_dispatch(event).await;
176176

177-
if let Ok(public_event) = dispatch_result
178-
.map_err(|e| {
177+
match dispatch_result {
178+
Ok(event_sync_mark) if event_sync_mark => {
179+
if let Ok(public_event) = public_event_result {
180+
status_report_sender
181+
.send(public_event)
182+
.await
183+
.unwrap_or_else(|e| error!("event sync error: {}", e));
184+
}
185+
}
186+
Err(e) => {
179187
error!("{}", &e);
180-
e
181-
})
182-
.and(public_event_result)
183-
{
184-
status_report_sender
185-
.send(public_event)
186-
.await
187-
.unwrap_or_else(|e| print!("{}", e));
188+
}
189+
_ => {}
188190
}
189191
}
190192
return;
@@ -199,33 +201,35 @@ impl EventHandle {
199201
}
200202
}
201203

202-
pub(crate) async fn event_dispatch(&mut self, event: TimerEvent) -> Result<()> {
204+
pub(crate) async fn event_dispatch(&mut self, event: TimerEvent) -> Result<bool> {
203205
match event {
204206
TimerEvent::StopTimer => {
205207
self.shared_header.shared_motivation.store(false, Release);
206-
Ok(())
208+
Ok(true)
207209
}
208210

209-
TimerEvent::AddTask(task) => self
210-
.add_task(task)
211-
.map(|task_mark| self.record_task_mark(task_mark)),
211+
TimerEvent::AddTask(task) => self.add_task(task).map(|task_mark| {
212+
self.record_task_mark(task_mark);
213+
true
214+
}),
212215

213216
TimerEvent::InsertTask(task, task_instances_chain_maintainer) => {
214217
self.add_task(task).map(|mut task_mark| {
215218
task_mark.set_task_instances_chain_maintainer(task_instances_chain_maintainer);
216219
self.record_task_mark(task_mark);
220+
true
217221
})
218222
}
219223

220224
TimerEvent::UpdateTask(task) => {
221225
self.update_task(task).await;
222-
Ok(())
226+
Ok(true)
223227
}
224228

225-
TimerEvent::AdvanceTask(task_id) => self.advance_task(task_id).await,
229+
TimerEvent::AdvanceTask(task_id) => self.advance_task(task_id).await.map(|_| true),
226230

227231
TimerEvent::RemoveTask(task_id) => {
228-
let remove_result = self.remove_task(task_id).await;
232+
let remove_result = self.remove_task(task_id).await.map(|_| true);
229233

230234
self.shared_header.task_flag_map.remove(&task_id);
231235
remove_result
@@ -234,24 +238,27 @@ impl EventHandle {
234238
self.cancel_task::<true>(task_id, record_id, state::instance::CANCELLED)
235239
}
236240

241+
// FIXED:
242+
// When the `TimeoutTask` event fails to remove the handle, Ok(()) is returned by default.
243+
// This causes the `TimeoutTask` event to be sent to the outside world by `status_report_sender`,
244+
// Which is a buggy behavior.
245+
246+
// Redesign the return value: Result<()> -> Result<bool>
247+
// Ok(_) & Err(_) for Result, means whether the processing is successful or not.
248+
// `bool` means whether to synchronize the event to external.
237249
TimerEvent::TimeoutTask(task_id, record_id) => {
238250
self.cancel_task::<false>(task_id, record_id, state::instance::TIMEOUT)
239251
}
240252

241253
TimerEvent::AppendTaskHandle(task_id, delay_task_handler_box) => {
242254
self.maintain_task_status(task_id, delay_task_handler_box)
243255
.await;
244-
Ok(())
256+
Ok(true)
245257
}
246258

247259
TimerEvent::FinishTask(FinishTaskBody {
248260
task_id, record_id, ..
249-
}) => {
250-
//TODO: maintain a outside-task-handle , through it pass the _finish_time and final-state.
251-
// Provide a separate start time for the external, record_id time with a delay.
252-
// Or use snowflake.real_time to generate record_id , so you don't have to add a separate field.
253-
self.finish_task(task_id, record_id)
254-
}
261+
}) => self.finish_task(task_id, record_id).map(|_| true),
255262
}
256263
}
257264

@@ -399,7 +406,7 @@ impl EventHandle {
399406
task_id: u64,
400407
record_id: i64,
401408
state: usize,
402-
) -> Result<()> {
409+
) -> Result<bool> {
403410
// The cancellation operation is executed first, and then the outside world is notified of the cancellation event.
404411
// If the operation object does not exist in the middle, it should return early.
405412

@@ -409,7 +416,7 @@ impl EventHandle {
409416
if INITIATIVE {
410417
quit_result?;
411418
} else {
412-
return Ok(());
419+
return Ok(false);
413420
}
414421
}
415422

@@ -423,7 +430,7 @@ impl EventHandle {
423430
task_mark.notify_cancel_finish(record_id, state)?;
424431
}
425432

426-
return Ok(());
433+
return Ok(true);
427434
}
428435

429436
if INITIATIVE {
@@ -434,7 +441,7 @@ impl EventHandle {
434441
state
435442
))
436443
} else {
437-
Ok(())
444+
Ok(false)
438445
}
439446
}
440447

0 commit comments

Comments
 (0)