Thanks for the detailed explanation Russ. I was mainly concerned about
jumping into to attempt to rework a few things without a better
understanding of what the code is supposed to be doing.

If I find a few minutes today, I was thinking about writing a few
tests specifically against the __init__ method of CacheMiddleware to
ensure the right attributes are being set in the right way going
forward, and then perhaps proposing a few minor tweaks to to the code
to straighten things out. I'll put up a patch if I manage to get
anywhere.

Jim

On Jan 23, 3:33 am, Russell Keith-Magee <russ...@keith-magee.com>
wrote:
> On Sat, Jan 22, 2011 at 2:27 PM, Jim D. <jim.dal...@gmail.com> wrote:
> > Howdy,
>
> > I reported a bug earlier today (http://code.djangoproject.com/ticket/
> > 15144) related to a possible regression in changeset 15021 (http://
> > code.djangoproject.com/changeset/15021). The apparent regression is
> > that as of this changeset, the cache middleware no longer respects the
> > timeout value passed to the @cache_page decorator.
>
> > I found some time this evening to further research this. I was able to
> > create a regression test that demonstrated the bug. However, in trying
> > to create a patch which addresses the bug I'm having a hard time
> > making sense of what changeset 15021 set out to accomplish.
>
> > For whatever reason, I am unable to find any discussion related to it
> > on this discussion list or in trac. If someone would be kind enough to
> > direct me to discussion surrounding this changeset or the ticket(s)
> > associated with it, I would be most appreciative.
>
> To fill in some of the blanks here; r15021 was an attempt to improve
> the testing of some of the features introduced in r15005, when
> multiple cache backends were introduced.
>
> In particular, I was concerned about the argument handling in the
> cache_page decorator. The cache_page decorator is just a wrapper
> around the combined cache middleware; my concern fell into two areas:
>
>  * options passed to the decorator wouldn't be used correctly by the
> underlying implementation
>  * Unspecified options on the decorator would fall back to the wrong
> defaults (middleware-specific defaults, rather than decorator
> defaults)
>
> The test cases that are contained in r15021 cover the areas that I was
> concerned about.
>
> > Anyhow, that said, it appears to me there are some minor issues with
> > the code in the __init__ method of CacheMiddleware and there does not
> > appear to be adequate test coverage around some of the code.
>
> Entirely possible. Like I said, I added a bunch of tests that covered
> cases that I could see would be a problem (or were problems, and were
> fixed by the rest of the patch). I make no claim that the rest of the
> test suite is adequate.
>
> > * The cache_timeout value is being passed along to the cache, but
> > self.cache_timeout is not being set. This is the problem I identified
> > in the ticket I filed. The value was previously being set prior to
> > changeset 15021. Why was this removed and why is it now being set to
> > the default_timeout of the cache?
>
> As I noted in the ticket, it wasn't removed; the logic just gets
> invoked in a different way.
>
> It appears that you've now provided a test case, and Jag has
> volunteered a patch; I'll be sure to take a look at both in the near
> future.
>
> > * There appears to be an attempt to determine which alias and prefix
> > to use in the try / except blocks. The problem is that the key is
> > being accessed via a dict get() method, which will never raise a
> > KeyError (http://docs.python.org/library/stdtypes.html#dict.get), it
> > will only return None. So basically the except blocks are never going
> > to be raised. This could probably be resolved by passing a default
> > value of e.g. False as the second arg to get() in each instance, and
> > then changing the try/except block to a condition. It also does seem
> > like some tests are needed here to properly run these various code
> > paths and make sure they are being set correctly.
>
> This is probably a case of code evolving against a deadline. At the
> time r15021 was committed, I was working against the alpha deadline,
> and I wanted to make sure that the feature added a couple of days
> earlier didn't have any major bugs. As a result, the implementation
> evolved quickly, and it's entirely possible a couple of facepalm
> errors slipped in.
>
> > * It seems kind of weird to me that if a 'cache_alias' is set
> > explicitly, then we don't fall back to CACHE_MIDDLEWARE_SECONDS if a
> > cache_timeout is not found, but if it's not set then we do fall back
> > to that setting?
>
> Admittedly, this is a logic jump that may not be obvious. The idea
> here is that the existence of the cache_alias argument is the most
> effectively way of determining whether the middleware is being used as
> middleware, or as a decorator that is wrapping the middleware.
>
> If you're using the middleware as middleware, you should be using the
> CACHE_MIDDLEWARE_ALIAS alias. If you're using the decorator, the
> decorator *always* passes in the cache alias; if you don't specify the
> alias, it uses 'default'.
>
> Prior to r15005, the distinction didn't matter because there was only
> one cache backend. Now that we have multiple aliases, it is important
> to distinguish between the alias you use for middleware and the alias
> you use for decorators, because they aren't necessarily the same.
>
> > If someone can shed some light on these questions, I can hopefully set
> > aside some time to write a few tests and rework the code a bit if it
> > does turn out that is needed.
>
> I hope I've been able to shed a little light. Like I said; I make no
> claim that the code is perfect, just that it passes all the tests that
> I generated. If you find areas that aren't tested, any contributions
> of tests and/or patches would be gratefully accepted.
>
> Yours,
> Russ Magee %-)

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to