[pbs-devel] [PATCH proxmox-backup 14/33] server: notifications: send GC notifications via notification system
Lukas Wagner
l.wagner at proxmox.com
Wed Apr 17 16:26:04 CEST 2024
On 2024-04-17 09:46, Fabian Grünbichler wrote:
> On April 16, 2024 2:13 pm, Lukas Wagner wrote:
>>
>>
>> On 2024-04-16 11:37, Gabriel Goller wrote:
>>> On Fri Apr 12, 2024 at 12:06 PM CEST, Lukas Wagner wrote:
>>>> diff --git a/src/server/gc_job.rs b/src/server/gc_job.rs
>>>> index 41375d72..ff5bdccf 100644
>>>> --- a/src/server/gc_job.rs
>>>> +++ b/src/server/gc_job.rs
>>>> @@ -19,8 +19,6 @@ pub fn do_garbage_collection_job(
>>>> ) -> Result<String, Error> {
>>>> let store = datastore.name().to_string();
>>>>
>>>> - let (email, notify) = crate::server::lookup_datastore_notify_settings(&store);
>>>> -
>>>> let worker_type = job.jobtype().to_string();
>>>> let upid_str = WorkerTask::new_thread(
>>>> &worker_type,
>>>> @@ -43,11 +41,9 @@ pub fn do_garbage_collection_job(
>>>> eprintln!("could not finish job state for {}: {err}", job.jobtype());
>>>> }
>>>>
>>>> - if let Some(email) = email {
>>>> - let gc_status = datastore.last_gc_status();
>>>> - if let Err(err) = send_gc_status(&email, notify, &store, &gc_status, &result) {
>>>> - eprintln!("send gc notification failed: {err}");
>>>> - }
>>>> + let gc_status = datastore.last_gc_status();
>>>> + if let Err(err) = send_gc_status(&store, &gc_status, &result) {
>>>> + eprintln!("send gc notification failed: {err}");
>>>
>>> I think we should use 'task_err!()' here. I know eprintln is used above,
>>> and technically works because we redirect stderr in the service setup
>>> but it's still slow and kinda the legacy method of printing task errors.
>>
>> I think the reason why the original code does not use task_log is because the
>> job is already marked as finished at that point:
>>
>> if let Err(err) = job.finish(status) {
>> eprintln!("could not finish job state for {}: {err}", job.jobtype());
>> }
>>
>> let gc_status = datastore.last_gc_status();
>> if let Err(err) = send_gc_status(&store, &gc_status, &result) {
>> eprintln!("send gc notification failed: {err}");
>> }
>>
>> Other jobs seem to follow the same pattern - use task_log! before, and eprintln/log::error!
>> after the job is finished.
>> A `task_log!` after the job is finished still seems to work, but I'm not sure if that
>> might lead to problems. What do you think?
>
> I don't think this is a problem per se - job.finish() just marks the job as
> finished in the job state, it's not related to the worker task
> finish/exit itself.
>
> since task_log (and friends) require the worker to still exist, and the
> last thing that happens when the worker fn returns its result is that
> result being logged via the same logging mechanism, this should be fine.
> but we might still want to switch the order around, so that a warning
> for notification failure actually gets counted?
>
> if it's such a common pattern to do job.start at the start, and
> job.finish near/at the end of a worker task, I wonder whether we
> couldn't handle that in a uniform fashion ;) then we might also not end
> up calling worker.create_state twice (once for job.finish, and once for
> worker.log_result as part of the worker exiting) with slightly different
> states..
>
Thanks a lot for your input!
I think I'll do the changes in a followup (if only to replace the eprintln!) - since
Gabriel's proxmox_log/tracing series is ripping out the task_log! macro any way.
--
- Lukas
More information about the pbs-devel
mailing list