Hi Aaron, Since you're not doing the update inside a transaction, it's likely that what's happening is that multiple tasks are updating the entity at the same time, which results in a concurrency issue: Both tasks fetch the entity and modify it, and the one that does the put last is the one whose results are visible.
Doing the update in a transaction should fix this. -Nick Johnson On Sun, Jun 13, 2010 at 8:50 AM, Aaron Cheung <[email protected]>wrote: > Hi guys, > > I'm still having trouble debugging this error. Would appreciate any > thoughts! > > Thanks, > Aaron > > > On Sat, Jun 12, 2010 at 3:55 AM, Aaron <[email protected]> wrote: > >> Hi! >> >> I am currently implementing the deferred library in my code, and I am >> running into a very very strange problem. The function that I am >> deferring gets passed an entity key. It does two tasks: 1) Gets the >> entity, retrieves a reference property, alters it, and then puts it >> back 2)Sends out an email >> >> The email is getting sent out every time the deferred function is >> called. BUT, the first task only completes 2/3 of the time. I have >> been replicating this error over and over and have yet to find any >> pattern in the failures. Here is the deferred function >> >> def complete_insert(self, data, answer_key, userkey): >> a = db.get(answer_key) >> q = a.question >> q.answercount += 1 >> q.answerers += [str(userkey)] >> q.answerers = list(set(q.answerers)) >> q.answered = True >> q.lastanswer = str(answer_key) >> q.lastanswerdate = datetime.now() >> q.put() >> >> mail = Mail() >> followers = db.get(q.indexes.followerlist) >> emails = [] >> for follower in followers: >> mail.send(emails, "question-followers-email", params = >> {"question": common.strip_html(q.question), >> "details":common.strip_html(q.details), "slug":q.slug, >> "answer":common.strip_html(data["answer"])} ) >> >> A couple observations that make this even more boggling. I can tell >> when the function fails because the counter does not increment and the >> other properties do not change. However, when it fails, I can see the >> put() being done in AppStats under /ah/deferred. FURthermore, I have >> checked that the values being passed into the function are the ones >> that I am expecting. (I did this by adding another put that wrote the >> arguments to a test model) >> >> I have absolutely no idea what could be going on here. Is this a bug? >> >> Very best and thanks for your time, >> Aaron >> >> -- >> 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]<google-appengine%[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]<google-appengine%[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 Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration Number: 368047 Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration Number: 368047 -- 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.
