[pmg-devel] applied: [PATCH v2 pmg-log-tracker 1/3] add filter() and qentry() helper methods

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Mar 24 11:52:41 CET 2020


applied series

On 3/20/20 1:08 PM, Mira Limbeck wrote:
> This simplifies access to the structs by cloning and then upgrading them
> if possible and returning an Option<Rc<>> instead of an Option<Weak<>>.
> 
> Signed-off-by: Mira Limbeck <m.limbeck at proxmox.com>
> ---
>   src/main.rs | 72 ++++++++++++++++++++++++++---------------------------
>   1 file changed, 36 insertions(+), 36 deletions(-)
> 
> diff --git a/src/main.rs b/src/main.rs
> index 9cb96f0..aeb390f 100644
> --- a/src/main.rs
> +++ b/src/main.rs
> @@ -463,18 +463,18 @@ fn handle_lmtp_message(msg: &[u8], parser: &mut Parser, complete_line: &[u8]) {
>           // qentry matches this one
>           if let Some(fe) = parser.fentries.get(qid) {
>               qe.borrow_mut().filter = Some(Rc::clone(fe));
> -            let q = fe.borrow().qentry.clone();
> +            // if we use fe.borrow().qentry() directly we run into a borrow
> +            // issue at runtime
> +            let q = fe.borrow().qentry();
>               if let Some(q) = q {
> -                if let Some(q) = q.upgrade() {
> -                    if !Rc::ptr_eq(&q, &qe) {
> -                        // QEntries don't match, set all flags to false and
> -                        // remove the referenced FEntry
> -                        q.borrow_mut().filtered = false;
> -                        q.borrow_mut().bq_filtered = false;
> -                        q.borrow_mut().filter = None;
> -                        // update FEntry's QEntry reference to the new one
> -                        fe.borrow_mut().qentry = Some(Rc::downgrade(&qe));
> -                    }
> +                if !Rc::ptr_eq(&q, &qe) {
> +                    // QEntries don't match, set all flags to false and
> +                    // remove the referenced FEntry
> +                    q.borrow_mut().filtered = false;
> +                    q.borrow_mut().bq_filtered = false;
> +                    q.borrow_mut().filter = None;
> +                    // update FEntry's QEntry reference to the new one
> +                    fe.borrow_mut().qentry = Some(Rc::downgrade(&qe));
>                   }
>               }
>           }
> @@ -513,10 +513,8 @@ fn handle_smtpd_message(msg: &[u8], parser: &mut Parser, complete_line: &[u8]) {
>               // no QEntries referenced in SEntry so just print the SEntry
>               se.borrow_mut().print(parser);
>               // free the referenced FEntry (only happens with before-queue)
> -            if let Some(f) = &se.borrow().filter {
> -                if let Some(f) = f.upgrade() {
> -                    parser.free_fentry(&f.borrow().logid);
> -                }
> +            if let Some(f) = &se.borrow().filter() {
> +                parser.free_fentry(&f.borrow().logid);
>               }
>               parser.free_sentry(se.borrow().pid);
>           } else {
> @@ -611,13 +609,11 @@ fn handle_smtpd_message(msg: &[u8], parser: &mut Parser, complete_line: &[u8]) {
>                       // by PMG/API2/MailTracker.pm
>                       se.borrow_mut().bq_from = from.into();
>                   }
> -            } else if let Some(qe) = &fe.borrow().qentry {
> +            } else if let Some(qe) = &fe.borrow().qentry() {
>                   // mail is 'accepted', add a reference to the QEntry to the
>                   // SEntry so we can wait for all to be finished before printing
> -                if let Some(qe) = qe.upgrade() {
> -                    qe.borrow_mut().bq_sentry = Some(Rc::clone(&se));
> -                    SEntry::add_ref(&se, &qe, true);
> -                }
> +                qe.borrow_mut().bq_sentry = Some(Rc::clone(&se));
> +                SEntry::add_ref(&se, &qe, true);
>               }
>               // specify that before queue filtering is used and the mail was
>               // accepted, but not necessarily by an 'accept' rule
> @@ -966,15 +962,13 @@ impl SEntry {
>               };
>   
>           // only true in before queue filtering case
> -        if let Some(fe) = &self.filter {
> -            if let Some(fe) = fe.upgrade() {
> -                // limited to !fe.is_accepted because otherwise we would have
> -                // a QEntry with all required information instead
> -                if fe.borrow().is_bq && !fe.borrow().is_accepted && self.is_bq_accepted {
> -                    print_filter_to_entries_fn(&fe, parser, self, None);
> -                } else if fe.borrow().is_bq && !fe.borrow().is_accepted && self.is_bq_rejected {
> -                    print_filter_to_entries_fn(&fe, parser, self, Some(DStatus::Noqueue));
> -                }
> +        if let Some(fe) = &self.filter() {
> +            // limited to !fe.is_accepted because otherwise we would have
> +            // a QEntry with all required information instead
> +            if fe.borrow().is_bq && !fe.borrow().is_accepted && self.is_bq_accepted {
> +                print_filter_to_entries_fn(&fe, parser, self, None);
> +            } else if fe.borrow().is_bq && !fe.borrow().is_accepted && self.is_bq_rejected {
> +                print_filter_to_entries_fn(&fe, parser, self, Some(DStatus::Noqueue));
>               }
>           }
>   
> @@ -990,13 +984,11 @@ impl SEntry {
>           if parser.options.verbose > 1 {
>               parser.write_all_ok(b"LOGS:\n");
>               let mut logs = self.log.clone();
> -            if let Some(f) = &self.filter {
> -                if let Some(f) = f.upgrade() {
> -                    logs.append(&mut f.borrow().log.clone());
> -                    // as the logs come from 1 SEntry and 1 FEntry,
> -                    // interleave them via sort based on line number
> -                    logs.sort_by(|a, b| a.1.cmp(&b.1));
> -                }
> +            if let Some(f) = &self.filter() {
> +                logs.append(&mut f.borrow().log.clone());
> +                // as the logs come from 1 SEntry and 1 FEntry,
> +                // interleave them via sort based on line number
> +                logs.sort_by(|a, b| a.1.cmp(&b.1));
>               }
>   
>               print_log(parser, &logs);
> @@ -1118,6 +1110,10 @@ impl SEntry {
>               qentry.borrow_mut().smtpd = Some(Rc::clone(sentry));
>           }
>       }
> +
> +    fn filter(&self) -> Option<Rc<RefCell<FEntry>>> {
> +        self.filter.clone().and_then(|f| f.upgrade())
> +    }
>   }
>   
>   #[derive(Default, Debug)]
> @@ -1551,6 +1547,10 @@ impl FEntry {
>           self.processing_time = time.into();
>           self.finished = true;
>       }
> +
> +    fn qentry(&self) -> Option<Rc<RefCell<QEntry>>> {
> +        self.qentry.clone().and_then(|q| q.upgrade())
> +    }
>   }
>   
>   #[derive(Debug)]
> 




More information about the pmg-devel mailing list