--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/XCUAKZ5E1LYJ.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
1) Ability to migrate without changing app ID. This is fundamental, and we've never seen any *reason* why this is impossible. I suspect that this is very hard, but not impossible. Changing the app ID causes problems because:
- External references to entity keys (not IDs) are pervasive in many apps (such as google search links to deep pages, user bookmarks, or RSS feed URLs) because the documentation encourages the use of these keys in URLs
- Many users have keys wrapped up in properties that the migration tool cannot recognize [this doesn't impact my app, but it's a common issue on this list]
As an alternative, the infrastructure could be fixed to recognize the case of using the old app ID instead of the new app ID in a key, and quietly make the substitution.
2) Migration of large data sets takes an extremely long time. Given that we regularly see M/S downtimes in the couple of hours range, a couple of hours is probably a reasonable amount of time to migrate. A couple of days is much too much. [Note that I have not personally gotten far enough into a migration to see this duration; I'm basing this on many user complaints I've read on this list.]
3) The problem of transactional consistency needs to be addressed. It is not acceptable for transactions to end in a "maybe this worked, maybe it didn't" state. They should either succeed or fail. (Although the docs not not say whether this problem is exclusive to HR, it seems to be, and certainly it matters much more in HR since every put is implicitly transactional.)
4) As Ikai said, there are some unresolved issues in HR that need to be fixed, such as the current mystery in the 'Serious Problem: Rollback of data on HRD' thread (which is eerily familiar: I think somebody else reported a similar issue a while back).
Even if all these are addressed, it would certainly be nice if M/S remained an option. It makes different trade-offs than HR, which may be better trade-offs for some applications. I will be very disappointed if they decide to make HR a requirement for multi-threading Python, since the two are completely orthogonal choices. From my reading, M/S seems to have better throughput than HR, at the expense of more frequent downtime, and spurious datastore timeouts. I'd like to have that option in a multi-threaded app.
-Joshua
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
Thanks Ikai,
I totally agree with you about prohibit new M/S applications.
Thanks and let's getting better always. I really trust on Google.
--
Atenciosamente(thanks),
Renan Franca
-----
Presidente
____
- Renan Mobile ltda: http://renanmobile.com - Soluções em Dispositivos Móveis (Smartphones) com integração via web.
- Soluções em:
Android (Smartphones);
Google Web Toolkit (Web);
I certainly hope they don't deprecate M/S, unless/until the following issues are addressed:1) Ability to migrate without changing app ID. This is fundamental, and we've never seen any *reason* why this is impossible. I suspect that this is very hard, but not impossible.
Changing the app ID causes problems because:
- External references to entity keys (not IDs) are pervasive in many apps (such as google search links to deep pages, user bookmarks, or RSS feed URLs) because the documentation encourages the use of these keys in URLs
- Many users have keys wrapped up in properties that the migration tool cannot recognize [this doesn't impact my app, but it's a common issue on this list]
As an alternative, the infrastructure could be fixed to recognize the case of using the old app ID instead of the new app ID in a key, and quietly make the substitution.
2) Migration of large data sets takes an extremely long time. Given that we regularly see M/S downtimes in the couple of hours range, a couple of hours is probably a reasonable amount of time to migrate. A couple of days is much too much. [Note that I have not personally gotten far enough into a migration to see this duration; I'm basing this on many user complaints I've read on this list.]
3) The problem of transactional consistency needs to be addressed. It is not acceptable for transactions to end in a "maybe this worked, maybe it didn't" state. They should either succeed or fail. (Although the docs not not say whether this problem is exclusive to HR, it seems to be, and certainly it matters much more in HR since every put is implicitly transactional.)
4) As Ikai said, there are some unresolved issues in HR that need to be fixed, such as the current mystery in the 'Serious Problem: Rollback of data on HRD' thread (which is eerily familiar: I think somebody else reported a similar issue a while back).
Even if all these are addressed, it would certainly be nice if M/S remained an option. It makes different trade-offs than HR, which may be better trade-offs for some applications. I will be very disappointed if they decide to make HR a requirement for multi-threading Python, since the two are completely orthogonal choices. From my reading, M/S seems to have better throughput than HR, at the expense of more frequent downtime, and spurious datastore timeouts. I'd like to have that option in a multi-threaded app.
-Joshua
On Wednesday, August 17, 2011 5:24:48 AM UTC-7, Joshua Smith wrote:I certainly hope they don't deprecate M/S, unless/until the following issues are addressed:1) Ability to migrate without changing app ID. This is fundamental, and we've never seen any *reason* why this is impossible. I suspect that this is very hard, but not impossible.
We are able to create an alias for migrated apps, so that traffic sent to oldappid.appspot.com will be transparently routed to your new application. So while you won't be able to keep the same app id, you can keep using the same appspot.com domain, which is probably what you care about most.
Changing the app ID causes problems because:
- External references to entity keys (not IDs) are pervasive in many apps (such as google search links to deep pages, user bookmarks, or RSS feed URLs) because the documentation encourages the use of these keys in URLs
This remains an issues, but can be easily addressed in a couple of lines of application code in the appropriate request handlers. The string encoded keys that are referenced externally have encoded within them the old app id. If you take the decoded key and extract the parent, kind and id/name to create a new key (again, this is 1-2 lines of code), then your app can use that new key to locate the migrated entity within the new datastore.As far as reference (list) properties: those reference keys are automatically updated as part of the the datastore migration and should not cause you any issues.
- Many users have keys wrapped up in properties that the migration tool cannot recognize [this doesn't impact my app, but it's a common issue on this list]
This does affect some apps. As I mentioned above, a couple of lines of code in the right place should take care of this.
As an alternative, the infrastructure could be fixed to recognize the case of using the old app ID instead of the new app ID in a key, and quietly make the substitution.
That's a neat idea.
2) Migration of large data sets takes an extremely long time. Given that we regularly see M/S downtimes in the couple of hours range, a couple of hours is probably a reasonable amount of time to migrate. A couple of days is much too much. [Note that I have not personally gotten far enough into a migration to see this duration; I'm basing this on many user complaints I've read on this list.]Applications with small amounts of data can easily self migrate in a short period of time using datastore_admin. Applications with more data will benefit from the new migration tool Ikai mentioned. We created the tool specifically to simplify and speed up the migration for larger apps, and to reduce the read-only period required to make the final switch.
3) The problem of transactional consistency needs to be addressed. It is not acceptable for transactions to end in a "maybe this worked, maybe it didn't" state. They should either succeed or fail. (Although the docs not not say whether this problem is exclusive to HR, it seems to be, and certainly it matters much more in HR since every put is implicitly transactional.)There are subtle differences between the consistency guarantees offered by M/S and HRD. In some cases, apps need to make a few tweaks in order to work correctly in the new environment. The benefit is much more predictable/consistency latency and increased reliability. A good article which reviews the consistency guarantees can be found here:
4) As Ikai said, there are some unresolved issues in HR that need to be fixed, such as the current mystery in the 'Serious Problem: Rollback of data on HRD' thread (which is eerily familiar: I think somebody else reported a similar issue a while back).
I haven't looked at that thread yet, but I suspect that reviewing the above article (http://code.google.com/appengine/articles/transaction_isolation.html) would probably be beneficial in the context of that thread.
Even if all these are addressed, it would certainly be nice if M/S remained an option. It makes different trade-offs than HR, which may be better trade-offs for some applications. I will be very disappointed if they decide to make HR a requirement for multi-threading Python, since the two are completely orthogonal choices. From my reading, M/S seems to have better throughput than HR, at the expense of more frequent downtime, and spurious datastore timeouts. I'd like to have that option in a multi-threaded app.
Thanks for the input. I hope the above response addresses some of your concerns.
Robert
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/google-appengine/-/P1c_gMSRtl0J.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/P1c_gMSRtl0J.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
On Aug 18, 2011, at 2:10 PM, Fred Sauer wrote:On Wednesday, August 17, 2011 5:24:48 AM UTC-7, Joshua Smith wrote:I certainly hope they don't deprecate M/S, unless/until the following issues are addressed:1) Ability to migrate without changing app ID. This is fundamental, and we've never seen any *reason* why this is impossible. I suspect that this is very hard, but not impossible.
We are able to create an alias for migrated apps, so that traffic sent to oldappid.appspot.com will be transparently routed to your new application. So while you won't be able to keep the same app id, you can keep using the same appspot.com domain, which is probably what you care about most.Perhaps that what some people care about most, but not me. What I care about is what I spelled out in the next two bullet points :)1-2 lines of code, in dozens of handlers is the crux of the problem. Dealing with this at the application layer is problematic because there are so many code paths that need to be examined.
Changing the app ID causes problems because:
- External references to entity keys (not IDs) are pervasive in many apps (such as google search links to deep pages, user bookmarks, or RSS feed URLs) because the documentation encourages the use of these keys in URLs
This remains an issues, but can be easily addressed in a couple of lines of application code in the appropriate request handlers. The string encoded keys that are referenced externally have encoded within them the old app id. If you take the decoded key and extract the parent, kind and id/name to create a new key (again, this is 1-2 lines of code), then your app can use that new key to locate the migrated entity within the new datastore.As far as reference (list) properties: those reference keys are automatically updated as part of the the datastore migration and should not cause you any issues.- Many users have keys wrapped up in properties that the migration tool cannot recognize [this doesn't impact my app, but it's a common issue on this list]
This does affect some apps. As I mentioned above, a couple of lines of code in the right place should take care of this.
As an alternative, the infrastructure could be fixed to recognize the case of using the old app ID instead of the new app ID in a key, and quietly make the substitution.
That's a neat idea.Neat enough that you guys might implement it?I've suggested this before, but I'm glad that I've got your attention this time!
This would be a pretty huge step toward making the migration practical for me.
2) Migration of large data sets takes an extremely long time. Given that we regularly see M/S downtimes in the couple of hours range, a couple of hours is probably a reasonable amount of time to migrate. A couple of days is much too much. [Note that I have not personally gotten far enough into a migration to see this duration; I'm basing this on many user complaints I've read on this list.]Applications with small amounts of data can easily self migrate in a short period of time using datastore_admin. Applications with more data will benefit from the new migration tool Ikai mentioned. We created the tool specifically to simplify and speed up the migration for larger apps, and to reduce the read-only period required to make the final switch.Yes, I saw that in his note, and if it works as advertised, I suspect it will resolve this issue.
3) The problem of transactional consistency needs to be addressed. It is not acceptable for transactions to end in a "maybe this worked, maybe it didn't" state. They should either succeed or fail. (Although the docs not not say whether this problem is exclusive to HR, it seems to be, and certainly it matters much more in HR since every put is implicitly transactional.)There are subtle differences between the consistency guarantees offered by M/S and HRD. In some cases, apps need to make a few tweaks in order to work correctly in the new environment. The benefit is much more predictable/consistency latency and increased reliability. A good article which reviews the consistency guarantees can be found here:
I'm not talking about consistency guarantees. I get that things change under HR, and it's pretty easy to understand what the implications of that are.What I'm talking about is the problem where you have to write idempotent transactions because you can never tell whether a transaction that threw certain exceptions succeeded or failed. That's really messed up, and you really need to fix that.But, to be fair, I'm not sure this problem will cause me actual problems if I switch to HR. It just makes me really, really uncomfortable.
4) As Ikai said, there are some unresolved issues in HR that need to be fixed, such as the current mystery in the 'Serious Problem: Rollback of data on HRD' thread (which is eerily familiar: I think somebody else reported a similar issue a while back).
I haven't looked at that thread yet, but I suspect that reviewing the above article (http://code.google.com/appengine/articles/transaction_isolation.html) would probably be beneficial in the context of that thread.Check out the thread. It's spooky weird behavior that he is reporting, well beyond the stuff in that article.Even if all these are addressed, it would certainly be nice if M/S remained an option. It makes different trade-offs than HR, which may be better trade-offs for some applications. I will be very disappointed if they decide to make HR a requirement for multi-threading Python, since the two are completely orthogonal choices. From my reading, M/S seems to have better throughput than HR, at the expense of more frequent downtime, and spurious datastore timeouts. I'd like to have that option in a multi-threaded app.
Thanks for the input. I hope the above response addresses some of your concerns.Ikai pointed out that MS doesn't really have higher throughput, so I guess keeping the option is not needed if the other issues are resolved.So, to boil this down to the bits that are critical:- Implement the "neat idea" of fixing wrong app IDs within the infrastructure;- Get the new migration tool out of trusted tester status;- Resolve the outstanding HR issues, such as the one in the Rollback threadSolve those, and I can migrate.Thanks for getting back to me on this!!!-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 google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
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 view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/DoYJ0jkPJ7cJ.
q = db.GqlQuery("SELECT * FROM Person " +
"WHERE last_name = :1 AND height < :2 " +
"ORDER BY height DESC",
"Smith", 72)
The Master/Slave Datastore and the High Replication Datastore have different guarantees when it comes to query consistency. By default:
Best,--Constantine
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/BzQWzYVCk3UJ.
I think Master/Slave is a lot faster in my case up to 10 times faster. I tested it with only read, no write operations,no transactions, nothing special for example I have a heavy use of this expression:e = MyList.get_profile(email)my_keys = e.my_keysmy_members = db.get(my_keys)for member in my_members:member.<property>, etc. <-- do something with the property
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
On Thu, Aug 18, 2011 at 10:58 PM, thstart <ths...@gmail.com> wrote:I think Master/Slave is a lot faster in my case up to 10 times faster. I tested it with only read, no write operations,no transactions, nothing special for example I have a heavy use of this expression:e = MyList.get_profile(email)my_keys = e.my_keysmy_members = db.get(my_keys)for member in my_members:member.<property>, etc. <-- do something with the property
Try this:
e = MyList.get_profile(email)my_keys = e.my_keysmy_members = db.get(my_keys, config=db.create_config(read_policy=db.EVENTUAL_CONSISTENCY))
http://code.google.com/intl/en/appengine/docs/python/datastore/functions.html#create_configfor member in my_members:member.<property>, etc. <-- do something with the propertyIt's a relatively new option:
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
On Fri, Aug 19, 2011 at 1:38 AM, Stephen <sdeasey...@gmail.com> wrote:
On Thu, Aug 18, 2011 at 10:58 PM, thstart <ths...@gmail.com> wrote:I think Master/Slave is a lot faster in my case up to 10 times faster. I tested it with only read, no write operations,no transactions, nothing special for example I have a heavy use of this expression:e = MyList.get_profile(email)my_keys = e.my_keysmy_members = db.get(my_keys)for member in my_members:member.<property>, etc. <-- do something with the property
Try this:
e = MyList.get_profile(email)my_keys = e.my_keysmy_members = db.get(my_keys, config=db.create_config(read_policy=db.EVENTUAL_CONSISTENCY))If you don't want to give you eventual consistency, try this:my_members = db.get(my_keys,config=db.create_config(max_entity_groups_per_rpc=1))
It feels like you'd always want to set this to 1. What situations
might make >1 perform better?
Feel free to set the default to 1 for your apps.
Fred on my Android.
Fred on my Android.
On Aug 19, 2011 11:18 AM, "thstart" <ths...@gmail.com> wrote:
>
> +Ikai Lan
> +Fred Sauer
> +Stephen
>
> Thank you, I need to rethink again with this information: it is useful. I am fine
> with new technologies, in my case the product is very sophisticated and the balance
> between new Google technology and what my business requires was tilted to business
> side - e.g. less new technology and techniques, more pro business solution.
>
> Definitely an extension to the book, an update to the excellent Brett Slatkin (he explains very well)
> materials will be of much help and am awaiting them and am wondering how i will know if they are ready?
>
> There is some practical questions: these changes obviously have to be tested,
You can also deploy another app version for testing.
I am fine to set up a second
> app just for that, but still it would be not the real thing in real situations. Right now I have a group of trusted people
> who are already using it and looking at the logs I can see real life situations which never pop up in test accounts.
> So my question is - I obviously will want to implement the changes one by one and see the effect, being right now
> on M/S could this be done in M/S environment and then move my users to HR?
The impact of these changes are material on HRD, and may have limited performance impact on M/S.
Test where you like, but test the scenario which you plan to use.
Above all else, migrate to HRD as soon as practical.
>
> Also I suppose when Google goes full HR and obviously wants we to move out of M/S, do Google has benchmarks
> for this kind of usage as I described in order to have a good motivation to move to HR?
While you should care that your app has acceptable performance, and you should use the suggested tips to get optimal performance out of HRD, your primary concern or reasons for migrating off of M/S are
1 Avoiding scheduled read-only periods
2 Avoiding unscheduled outages and maintenance periods
3 Avoiding datastore latency spikes
Every developer who I've communicated with has been happy with their app on HRD and none want to go back. In particular the 3rd point I mentioned often weighs the heaviest for developers.
To put it another way: I have yet to find a use case, when the whole app is considered, where M/S is preferable to HRD.
Hope that helps.
Fred
>
> Thanks to all!
>
>
>
> --
> You received this message because you are subscribed to the Google Groups "Google App Engine" group.
> To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/cmDqAoiZDiwJ.
You should mirate to HRD if you care about consistent, predictable speed, performance and reliability. Your app will be happier. You will be happier. Your customers will be happier.
The advice to migrate to HRD is unqualified: you should migrate.
Fred on my Android.
I have a set of apps that Run very well on MS and unless MS is all the way down (which has happened) they ran just fine during maintenance, and No-Write periods. They are cheaper and faster on MS.
HR is definitely the best for many situation, but there may be times when MS is better especially if you are fighting costs.
Did you try the solution Stephen mentioned?
my_members = db.get(my_keys,
config=db.create_config(read_policy=db.EVENTUAL_CONSISTENCY))
I would be curious to know if this eliminated the speed issue. From
all reports (and my own highly unscientific observation), HRD seems to
perform consistently better than M/S. But I use EVENTUAL_CONSISTENCY
as a default - probably others do too. I haven't even thought to try
the alternative.
Jeff
Huh? This seems a complete non-sequitur.
> P.S. it is 3 hours and I still can not upload my app on the cloud (M/S).
I get that you're upset about something being broken. As a
non-googler, let me offer you some objective advice: You sound
awfully whiny. You'd probably get better reception by taking a
different tone.
For example, you might post: "My application, which is fast on M/S,
is slow on HRD. Why is that?" This is something we can all explore
and maybe learn something new - it runs contrary to everyone else's
experience. Instead you post "HRD is slow!" and expect us to pry the
details out of you. It doesn't sound like you're actually interested
in improving your product, you just want to rant. Seriously, get a
therapist.
Jeff
>I get that you're upset about something being broken.
Yes there are many times when try to upload my code on the cloud but the uploads are rolled back. This lasted yesterday for 3 hours.
Is it not clear what I want to say? What is your recommendation?
This could be for a wide range of reasons. You should start a new thread and give us some more details. For example, are the entities with contention warnings global to all users or user specific? Is the contention caused by user requests or tasks? What are you doing, updating a counter? Be sure to give us enough information to help you.
Robert
On Aug 20, 2011 10:52 AM, "Sekhar" <allu...@gmail.com> wrote:
>
> We're about to launch a healthcare app, and we recently switched from M/S to HRD (both with reserved instances). I'm really, really happy with HRD so far, most importantly we don't see random hiccups in data access any more. Performance has been really consistent.
>
> We are occasionally getting a new error "too much contention on these datastore entities. please try again." however. Clearly it's not due to traffic because it's like 5 of us testing the site at this point. I'm a bit worried our patients/doctors will see this after launch next month. What's this and is there a way to avoid it?
>
> --
> You received this message because you are subscribed to the Google Groups "Google App Engine" group.
> To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/QygaPE8F_dwJ.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/rpGj8t4Gy-0J.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/CBRAyB0paHwJ.
We're about to launch a healthcare app, and we recently switched from M/S to HRD (both with reserved instances). I'm really, really happy with HRD so far, most importantly we don't see random hiccups in data access any more. Performance has been really consistent.
We are occasionally getting a new error "too much contention on these datastore entities. please try again." however. Clearly it's not due to traffic because it's like 5 of us testing the site at this point. I'm a bit worried our patients/doctors will see this after launch next month. What's this and is there a way to avoid it?
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/QygaPE8F_dwJ.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
+Jeff Schnitzer> pry the details out of you.I posted a code if you care to read, the advice is EVENTUAL_CONSISTENCY which is a compromise and I don't need to do it in M/S.
>get better reception ...Yes I got a reception, Brett will update his presentations, Dan will update his book - I just purchased an access to his 2nd edition - a work in progress, and yes - I make every effort to do what is needed.The point is if you have a project which you really care you will do the same to make sure it works. If you have the time to thinker 24/7 with database experimenting, then good luck.Just checking - have you looked at the code I posted, made tests both in HR and M/S, performed benchmarks or you just want to talk not having what else to do?Do this and then come back ton talk about real world situations.>get a terapistIf you are at the point to have a waiting list of paying customers, and you invested a year in developing, testing and almost to the final, and at this point you have to completely redesign you code without knowing in advance, if you an in areal world situation probably you will get a terapist, I don't need one.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/Q3CS2U8McpAJ.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
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 view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/WVosQnUL4VYJ.
--You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/lC6R_999_vQJ.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
For the wizard, using an entity group will give you strong consistency. Use ancestor query or plain old fetch (get) by key to get strongly consistent results.
In general, query public data using regular (eventually consistent) queries. Merge in the user's own, just committed, data.
Most of the time you're probably only dealing with 100s of milliseconds or a few seconds.
Fred on my Android.
The entity id (or name) is known / available after a put().
Fred on my Android.