Aaryan Bhagat writes:

 > - In the case of `Send_Warnings` function if the same approach was
 >   followed, meaning it would take one by one the `Address` instances,
 >   check tuples in the `bounce_info` attribute ( see the pr for this )
 >   and see whether to send a warning mail or not to can be a slow
 >   method.
 > 
 > - Let's suppose the `Addresses` list is very long, then an `Address`
 >   instance in the very bottom of the list whose subscription has been
 >   disabled and some warning emails send, now waits to receive another
 >   mail as the interval is more than
 >   `bounce_you_are_disabled_warnings_interval`.
 > 
 > -  If the function is enumerating from the top then in order to take
 >    action first it has to reach this `Address` instance but the
 >    interval is already crossed. This can cause slow performance as the
 >    `warning mail` will be sent way late than it actually should have
 >    been sent.

I assume that what you mean here is that this process is executed
perhaps once per day and probably takes a few minutes at most in
processing.  Then we have 300s/86400s = 1/288 of a day = probability
that during the interval that address's timer expires, and the message
is delayed until the process triggers again, hypothetically a full
day.

The odds that this happens is quite small unless you have a humongous
list.  Furthermore, the probability that the mail will go through this
time if the account has disabled due to bouncing is presumably way
less than 1.  So my first-order response is this is a non-problem.

Note that you have basically the same problem if the Address's timer
expires a few seconds after the send_warnings process finishes.

My second-order response is if you still care given that this is
rarely going to happen, and even more rarely will it generate a
message that reaches the user who reactivates the subscription, you
can arrange to have an index on the Addresses (or a separate queue)
which has the earliest timer first, and then process the Addresses in
that order.  You'll still have the same problem if the timer expires a
few picoseconds after you start processing the particular address. :-)
Basically the way to deal with this is to adjust the
`bounce_you_are_disabled_warnings_interval`.

If you do implement the queue, another possibility comes up, which is
that you process the queue continuously, with a process (a runner, I
guess) that sleeps until it's time to process the next send_warning.
This would have the advantage that if there were another "DMARC event"
that caused large number of bounces, you wouldn't have a flood of
warning messages are a particular time of day.

 > - Also if I am implementing 2 functions `process_bounces` and
 >   `send_warnings` what if both of them attempted at the same
 >   `Address` instance?

What about it?  This is even more unlikely, and I assume that
process_bounces will have a read-write lock that prevents reading (and
writing) while it's writing, while send_warnings will have a read lock
that prevents writing while it's reading.  I think all of the
databases we support have such locks.
_______________________________________________
Mailman-Developers mailing list -- mailman-developers@python.org
To unsubscribe send an email to mailman-developers-le...@python.org
https://mail.python.org/mailman3/lists/mailman-developers.python.org/
Mailman FAQ: https://wiki.list.org/x/AgA3

Security Policy: https://wiki.list.org/x/QIA9

Reply via email to