How do I do a consistent get with a query?  I thought that there was no way to 
do a query that was guaranteed to get the lastest.  Did I miss something in the 
docs?

The code that builds the HTML fragment I'm caching uses a couple queries like 
this:

  def getBoards(self):
    tid = self.id()
    boards = BoardModel.gql("WHERE towns = :1 AND agency = :2 ORDER BY name", 
tid, False).fetch(1000)
    return filter(lambda x: not tid in x.disabled, boards)

The towns attribute is a list of towns that need notice for that board:

class BoardModel(db.Model):
  towns = db.ListProperty(long)
...

How would you recommend rewriting that query to ensure the list of boards is 
complete, have up-to-date names, etc.?

On Sep 4, 2011, at 7:24 PM, Nick Johnson wrote:

> Hi Joshua,
> 
> Can you not do a consistent get for the data when you have a cache miss, to 
> ensure you're fetching the latest copy, and cache that?
> 
> Looking at how NDB does its caching may be instructive here.
> 
> -Nick Johnson
> 
> On Mon, Sep 5, 2011 at 1:16 AM, Joshua Smith <[email protected]> wrote:
> My monkeypatching solution (see my recent post in the -python group), which 
> Guido says I shouldn't use, but which is just so darned pretty I can't help 
> it, has gotten me through the first challenge of switching to HR, which is 
> dealing with google search results containing keys into my old app's data 
> store.
> 
> So now I'm looking at the big Kahuna problem of consistency.  Here's my first 
> messy challenge there:
> 
> My app puts a list of boards on the home page for a town, along with the list 
> of meetings.  Generating that list of boards was taking a lot of CPU, but 
> they hardly ever change, so I put in a memcache system that built the HTML 
> when it wasn't in the cache, and then cached it before serving.  I clear the 
> cache whenever the list of boards changes in some way.
> 
> Well that ain't gonna work in HR.  It's quite possible that I update a board, 
> clear the cache, and someone comes and hits that page before "eventually 
> consistent" comes to pass.  So now I've got a cached copy of the stale data.
> 
> (Note that I cannot use entity groups to solve this because some boards are 
> municipal agencies, and therefore cannot be parented to the town that is 
> building its list.  I could parent all boards to some global parent, but, 
> well, yuck.)
> 
> I have some different ideas about how to fix this, but I'm wondering if 
> anyone else who's done the port to HR has come up with a solution they find 
> particularly elegant?  I assume this is a pretty common problem, so there 
> must be a design pattern out there… somewhere.
> 
> Here are my ideas:
> 
> - Clear the cache with a periodic task that re-clears it several times.  I'm 
> thinking a recurring geometric retry would be prudent (1, 2, 4, 8, 16, 32, 
> 64, 128, 256, 512 seconds, and then pray that we have consistency)
> 
> - Checksum the modified or new board, and put that sum into memcache.  When 
> generating the new board, confirm that any checksums are good.  This seems 
> more deterministic, except I don't trust memache not to squelch the checksum 
> record.  So perhaps I should do something in the datastore.  This feels like 
> it's be about 10x as much code as the stupid geometric flush.
> 
> Any suggestions?
> 
> -Joshua
> 
> --
> You received this message because you are subscribed to the Google Groups 
> "Google App Engine" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/google-appengine?hl=en.
> 
> 
> 
> 
> -- 
> Nick Johnson, Developer Programs Engineer, App Engine
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Google App Engine" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/google-appengine?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to