[appengine-java] Re: Problems with entity groups in transactions
Hi, I think at this point that Max's knowledge is needed Max could you report on this thread please??? Thanks datanucleus wrote: Perhaps GAE/J doesn't respect that metadata extension tag then. Raise a bug on their DataNucleus plugin for it. Not related to JDO but... parent-child relationships are really simple to define with Twig... you don't need to use keys at all. FWIW You don't need "Key"s ***in JDO*** at all either ... when the JDO interface is respected and implementation details don't leak out into user space; keys should not be presented to the user IMHO. JDO is then a very good option whether you want your code to run on another platform or not. -- Patrizio Munzi Product Specialist Viale Bruno Buozzi, 19 - 00197 Roma (Italy) tel: +39 06 4543 3540 fax: +39 06 4543 3587 mobile: +39 393 7195 164 mail: patrizio.mu...@eris4.com web: http://www.eris4.com skype: eris4_munzi --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Problems with entity groups in transactions
2009/11/2 datanucleus andy_jeffer...@yahoo.com FWIW You don't need Keys ***in JDO*** at all either ... when the JDO interface is respected and implementation details don't leak out into user space; keys should not be presented to the user IMHO. JDO is then a very good option whether you want your code to run on another platform or not. You must use Keys in your model objects, no? I would call this user space as the user must still write this code. Sure you can write extra code to abstract this away but frameworks should really do this for you. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: JDO Best Practices
DM - http://vike.googlecode.com/svn/trunk/vike/src/br/com/ximp/vike/server... Judging from above you don't use JPO but low level API. But your entity class (Actor) is dressed with JDO annotations. I don't know what will happen if entity dressed with JPA annotiation and beautified by JDO enhancer will be persisted by low level API skipping JDO layer. If you use JDO annotation use JDO API to manage your entities: http://code.google.com/intl/pl/appengine/docs/java/gettingstarted/usingdatastore.html --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Issue with com.google.appengine.api.datastore.Text?
Thanks, It is working. Is this an issue? Or is it specific to Text On Nov 3, 11:00 am, Rusty Wright rwright.li...@gmail.com wrote: What happens if you change @Persistent to @Persistent(defaultFetchGroup = true) ? Tito George wrote: Enviornment: Local I have a Text field in one Persistent capable object, @Persistent private com.google.appengine.api.datastore.Text event_Description; I am sure that i am not setting null into this field. But while operating on queried object event_Description.getValue() is throwing NullPointerException. I am quering like this. public static MapLong, Event getEvents(AppUser appUser){ PersistenceManager pm = PMF.getInstance().getPersistenceManager(); Query query = pm.newQuery(Event.class); query.setFilter(email == pEmail); query.declareParameters(String pEmail); ListEvent result = null; MapLong, Event eventsMap = null; try { result = (ListEvent) query.execute(appUser.getEmail()); eventsMap = new HashMapLong, Event(); for(Event e: result){ //LINE TO REPLACE eventsMap.put(e.getEvent_ID(), e); } } finally { pm.close(); query.closeAll(); } return eventsMap; } Its works fine if I replace above commented line(//LINE TO REPLACE) with String str = e.getEvent_Description(); or sop(e.getEvent_Description()); or e.getEvent_Description(); Any Comments??? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: very high error rate (88%) receiving XMPP no error msg in the log !
anyone else facing same problem ? my app's today's error rate is 94% (of 832) ! --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Data Store Indexes
Also, I updated my datastore-indexes.xml as the following: ?xml version=1.0 encoding=utf-8? datastore-indexes xmlns=http://appengine.google.com/ns/datastore-indexes/1.0; autoGenerate=true datastore-index kind=MDsIri ancestor=false property name=iri direction=asc / property name=name direction=asc / property name=image direction=asc / property name=iriLowerCase direction=asc / property name=nameLowerCase direction=asc / /datastore-index /datastore-indexes I changed the kind from com.col.server.MDsIri to MDsIri. It still produced No results. I cannot test it on Development Server -- please let me know if there is a way to test it locally.. I uploaded it and only tested it on the (deployed) App Engine. My app id is http://foafan2000.appspot.com/ On Nov 2, 7:49 pm, Pion onlee2...@gmail.com wrote: Thanks Jason. I tried the following: SELECT __key__ FROM MDsIri Also, SELECT * FROM MDsIri No more error. But it returns No results. The Data Viewer shows that I have many entities. http://code.google.com/appengine/docs/python/datastore/gqlreference.html shows the following syntax: SELECT [* | __key__] FROM kind [WHERE condition [AND condition ...]] [ORDER BY property [ASC | DESC] [, property [ASC | DESC] ...]] [LIMIT [offset,]count] [OFFSET offset] Why didn't I get any result? On Nov 2, 4:15 pm, Jason (Google) apija...@google.com wrote: Yes, that is the correct doc for the Java indexes. Regarding your GQL query, the name of the kind is not the full name of the class (including the package) but the simple name. So try using MDsIri instead of com.col.server. MDsIri. You should be able to see any entities you saved in the data viewer and the valid kind names are provided in the drop down. - Jason On Fri, Oct 30, 2009 at 12:05 PM, Pion onlee2...@gmail.com wrote: I found this http://code.google.com/appengine/docs/java/datastore/queriesandindexe... with the following example: ?xml version=1.0 encoding=utf-8? datastore-indexes xmlns=http://appengine.google.com/ns/datastore-indexes/1.0; autoGenerate=true datastore-index kind=Person ancestor=false property name=lastName direction=asc / property name=height direction=desc / /datastore-index /datastore-indexes But I still cannot solve my query error. On Oct 30, 9:34 am, Pion onlee2...@gmail.com wrote: I just deployedmy app to the GAE for the first time. I went to the Admin Console - DataStore - Indexes which says, You have not created indexes for this application. Some types of queries require an index to be built. You can manage your indexes in an index.yaml file. Learn more abouthttp:// code.google.com/appengine/kb/general.html#indexes . http://code.google.com/appengine/kb/general.html#indexeslinkstohttp:// code.google.com/appengine/docs/python/datastore/queriesandinde It seems to be Python specific. What's the corresponding one on Java? It seems to be on war\WEB-INF \appengine-generated\datastore-indexes.xml. Please correct me if I am wrong. My datastore-indexes.xml is empty. ?xml version=1.0 encoding=utf-8? datastore-indexes autoGenerate=true /datastore-indexes Also, I didi the following: o Go to the Admin Console - DataStore - Data Viewer. It displays my low-level datastore contents. o Click the Query (using GQL). It displays SELECT * FROM com.col.server.MDsIri automatically by default. o Click Run Query button o It says, Invalid GQL query string. I suspect because I do not have any indexes yet. What are the syntax to populate datastore-indexes.xml so I can do the above query. Thanks in advance for your help. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: ClassCastException after changing PK from Long to String
Hi Jason, thank you very much for your answer. I think that you are right, but have to admit, that I cannot prove it. I have tested the application again after some time (browser has been closed in between), and everything worked fine. Is it possible, that sessions (javax.servlet.http.HttpSession) are not being killed between application deployments? I have deleted the data in my datastore via the Admin Console, just as you proposed, and no data had been left. But I remember one instance of this persistent object in the session (although I thought I would detach it from the datastore), and that could have been the one that caused this problem. I would very much appreciate the information, if the session data is being kept alive between deployments and if I can delete those as well. Thanks a lot! Greetings, Peter --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: RPC SerializationException if detachable=true
A simple search on this forum for GWT and detachable should give plenty of links ... as to why GWT doesn't cope seamlessly with standard bytecode-enhanced classes. Also http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/3c768d8d33bfb1dcseems http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html and project Gilead (in SourceForge) --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: XSLT Version
See http://groups.google.com/group/google-appengine-java/browse_thread/thread/9c9fb88e1b175395/f8f9a9adcfeb044f?lnk=gstq=xslt#f8f9a9adcfeb044f and you see that saxon works with App Engine And Saxon support XSLT 2 So, with Saxon, App Engine supports XSLT 2 --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Dev server datastore deadlock
I can reproduce the deadlock and I believe I have a fix. I'm not sure if it will make the next release though. Can you please file an issue so we can track this? Thanks, Max On Sat, Oct 31, 2009 at 4:31 PM, stumpy ianmcgrath.m...@gmail.com wrote: I removed the thread dump doc because the servlet code denomstrates the problem. On Oct 29, 8:20 pm, Jason (Google) apija...@google.com wrote: Thanks for the snippet. The thread dump isn't appearing for me in the Google Doc -- can you try posting it again and verifying that it's publicly viewable? - Jason On Wed, Oct 28, 2009 at 2:27 AM, stumpy ianmcgrath.m...@gmail.com wrote: The thread dump is a bit cryptic so I reduced the problem down to a small servlet that fails. Use the servlet below in the development environment and set up aync requests to it and a deadline will occur e.g. using 2 or more looped curls from the terminal. public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); Transaction t = ds.beginTransaction(); try { Key key = KeyFactory.createKey(entity_kind, 1); Entity e = new Entity(key); e.setProperty(property_bytes, new Blob(new byte[100])); ds.put(t, e); t.commit(); } catch (Throwable th) { if (t.isActive()) { t.rollback(); } } } On Oct 27, 6:12 pm, stumpy ianmcgrath.m...@gmail.com wrote: http://docs.google.com/Doc?docid=0AV6jRtzB1ZNYZGNtNWdxemZfNjNkYjVkajl... --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Object not persisted JDO
Hi Julio. How are you verifying that the entity is not persisted? Are you querying for it or verifying using the data viewer? If you're not using the data viewer, please try this first -- http://localhost:8080/_ah/admin(substitute your port number for 8080). If you don't see your entities in the data viewer, can you post your source for the PersistenceCapable objects and the code you're using to persist them? - Jason On Mon, Nov 2, 2009 at 6:31 AM, Julio Faerman jfaer...@gmail.com wrote: Hi, I am trying to persist an object using JDO, but the object is not beeing persisted to the datastore. Can anyone please help me understand why? Here is what i can see in the logs from the moment i .makePersistent() to the point EM is closed: [DataNucleus.Persistence] - Making object persistent : br.com.ximp.vike.server.model.games.ww.ac...@1392743 [DataNucleus.Cache] - Object br.com.ximp.vike.server.model.games.ww.ac...@1392743 (id=org.datanucleus.identity.identityrefere...@6506f0) added to Level 1 cache (loadedFlags=[YYY]) [DataNucleus.Transaction] - Outstanding nontx update being committed to datastore [DataNucleus.Transaction] - Transaction created [DataNucleus Transaction, ID=Xid= --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: managing root / parent objects
The overhead of having to fetch the inner object is negligible since you're using a direct fetch by key. You can set a @NotPersistent property of the intended type and modify your DAO methods to fetch both objects (User and FavoriteFood) and set the @NotPersistent property of the User to this fetched object. It's a few extra lines but you get the convenience of being able to access the inner object directly without polluting your datastore with cloned objects. - Jason On Sat, Oct 31, 2009 at 4:21 PM, Rusty Wright rwright.li...@gmail.comwrote: Yes, that's the point. My thinking is that (correct me if I'm wrong) if I store the object's key, when I fetch the outer containing object that has its key, I'll need to use the key to fetch the object. By cloning it, I don't need to do that, I just fetch the outer object and the inner object will get fetched along with it (assuming it's in the default fetch group). Whenever I want the outer object I'll also want its inner objects. If I store the key in the outer object, when I fetch the outer object it seems to me that I'll then need to fetch the contained object. And I'll have two fields on the outer object; using my FavoriteFood example, I'll need a field favoriteFoodKey, type Key, which is persisted, and a favoriteFood, type FavoriteFood, which is transient, and not persisted. Then my jsp would use the getter for the favoriteFood field. This is why I'm asking; it seems a bit complicated. Perhaps there's a simpler way that I could use. In my case, there isn't a lot of data so the duplication of objects isn't a big issue. John Patterson wrote: Why are you cloning instead of setting the original object? JDO will store the clone as a separate entity in the datastore. 2009/11/1 Rusty Wright rwright.li...@gmail.com mailto:rwright.li...@gmail.com I'm trying to figure out the best way to manage root objects that are used with different objects. For a semi concrete example, suppose you have a web page with a drop down list of Favorite Foods, and a User object may have a reference to a FavoriteFood, and other objects will have references to FavoriteFood objects as well. It seems to me that if individual FavoriteFood objects don't change, but the list (table) of FavoriteFood objects can grow, you could make them Cloneable and use the clone, making it a child, for example: FavoriteFood fav = favoriteFoodDao.findByStringId(stringId); user.addFavoriteFood(fav.clone()); Google's examples usually (always?) store the subordinate object's Key rather than a clone of the object. I can see problems with using clones; even though I'm sure they won't, they may change. Similarly, items may need to be deleted from the master FavoriteFood list/table. There may be other problems that I haven't thought of. Anyhow, I'm wondering if others have gone done this road or investigated it and can offer advise. Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Inequality operator is !=, but can we add
not-equal filters are not supported in the current SDK unless you're doing not equal null, in which case we just turn it into null because the datastore considers null to be smaller than any non-null value. You can read about the supported filter types here: http://code.google.com/appengine/docs/java/datastore/queriesandindexes.html In the forthcoming SDK not-equal filters will be supported (along with IN filters). Max On Sat, Oct 31, 2009 at 8:34 AM, Dave Cheong d...@davecheong.com wrote: And public void myMethod2() { Query query = entityManager.createQuery(select o from Myclass o where o.title = :p1 and o.myProperty :p2); // bind params query.getResultList(); // exception thrown unexpectedly also } On Nov 1, 3:32 am, Dave Cheong d...@davecheong.com wrote: The relevant code snippets are: In MyServiceImpl - @Repository @Transactional public MyServiceImpl ... { protected EntityManager entityManager; public void myMethod() { Query query = entityManager.createQuery(select o from Myclass o where o.title = :p1 and o.myProperty != :p2); // bind params query.getResultList(); // exception thrown unexpectedly } @PersistenceContext public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } } In applicationContext.xml - !-- JPA EntityManagerFactory -- bean id=entityManagerFactory class=org.springframework.orm.jpa.LocalEntityManagerFactoryBean p:persistenceUnitName=main/ !-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -- bean id=transactionManager class=org.springframework.orm.jpa.JpaTransactionManager p:entityManagerFactory-ref=entityManagerFactory/ In persistence.xml - persistence-unit name=main providerorg.datanucleus.store.appengine.jpa.DatastorePersistenceProvider / provider properties property name=datanucleus.NontransactionalRead value=true/ property name=datanucleus.NontransactionalWrite value=true/ property name=datanucleus.ConnectionURL value=appengine/ /properties /persistence-unit Any help you provide is appreciated. thanks, dave On Nov 1, 3:23 am, Dave Cheong d...@davecheong.com wrote: What I'm saying is I'm using EMF and writing JPQL and is not working, which it should since it is the valid operator for inequality. Are you saying it works for you? dave On Nov 1, 12:27 am, datanucleus andy_jeffer...@yahoo.com wrote: 1). I can't seem to get != working either. I have no such problems with JDOQL, but then you're using it in GAE/J with an old version of DataNucleus. 2) If I have mapped my objects using JPA annotations, will the query engine default to JDOQL vs JPQL? The type of metadata specification ... JDO XML, JDO Annotations, JPA XML, JPA Annotations ... has nothing to do with the persistence API being used (in DataNucleus). If you create a PMF then you use JDO API, if you create an EMF then you use JPA API. JPA API only allows JPQL queries (you can't use JDOQL). JDO API allows JDOQL or JPQL queries, using the API to define what you're using; see the JDO javadocs. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: SimpleDS: an alternative for Datastore persistence
Great! Since someone else is now using this besides me, I've added more comments. Also, I've added some testcases and fixed an issue when invoking put() with entities that contain partial keys. If your entities don't have complete keys when invoking put(), you should go get the latest code. Let me know if you run into any problems, or have suggestions for improvements. Vince On Mon, Nov 2, 2009 at 10:47 PM, Roy Smith roy.smith@googlemail.com wrote: Hi Vince Thanks for sharing. I've modified my persistence framework to incorporate your class and it works very well. kind regards Roy --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: AccessControlException on DatastoreService.put() method
Do you see any other exceptions under WARNING or ERROR that provides more information? How long do you wait before the exception is thrown? If it's close to 30 seconds, you could be experiencing a timeout, and you can try scaling back the number of entities written (500 is the theoretical max but depending on the size of the entities and the responsiveness of the datastore, you may not be able to hit this count in every request). - Jason On Sat, Oct 31, 2009 at 8:30 AM, Pion onlee2...@gmail.com wrote: I got the AccessControlException on the following code snippet: public void add(ListString iriList, ListString nameList, ListString imageList) { // deleted for brevity try { datastore.put(eList); // The log below shows this line as at com.col.server.MDsIri.add(MDsIri.java:74) } catch (IllegalArgumentException exIA) { logger.severe(IllegalArgumentException when trying to datastore.put. Exception message: + exIA.getMessage()); } catch (ConcurrentModificationException exCM) { logger.severe(ConcurrentModificationException when trying to datastore.put. Exception message: + exCM.getMessage()); } catch (Exception ex) { logger.severe(Exception when trying to datastore.put. Exception message: + ex.getMessage()); // the log (last line) below says that the message is unknown } } // deleted for brevity } I follow the guideline that the eList has only 500 entities at most as mentioned on http://code.google.com/appengine/docs/java/datastore/overview.html#Quotas_and_Limits . Also, I don't call any thread or system threads as mentioned on http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox. I did not get the error below on my Development Server. I don't know how to interpret the error because the exception/error message is Unknown(last line of the log). I appreciate any help. Log from the Google Apple Engine Admin Console - Main - Logs 10-31 09:06AM 07.119 com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue $SystemLoader loadFinalizer: Not allowed to access system class loader. I 10-31 09:06AM 07.145 com.google.appengine.repackaged.com.google.common.base.internal.Finalizer getInheritableThreadLocalsField: Couldn't access Thread.inheritableThreadLocals. Reference finalizer threads will inherit thread local values. I 10-31 09:06AM 07.148 com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue init: Failed to start reference finalizer thread. Reference cleanup will only occur when new references are created. java.lang.reflect.InvocationTargetException at com.google.appengine.runtime.Request.process-69e6389d93ef7f72 (Request.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Method.java:40) at com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue.init (FinalizableReferenceQueue.java:124) at com.google.appengine.repackaged.com.google.common.labs.misc.InterningPools $WeakInterningPool.clinit(InterningPools.java:104) at com.google.appengine.repackaged.com.google.common.labs.misc.InterningPools.newWeakInterningPool (InterningPools.java:48) at com.google.appengine.repackaged.com.google.io.protocol.ProtocolSupport.clinit (ProtocolSupport.java:55) at com.google.apphosting.api.DatastorePb$PutRequest.freeze (DatastorePb.java:8452) at com.google.apphosting.api.DatastorePb$PutRequest$1.init (DatastorePb.java:8367) at com.google.apphosting.api.DatastorePb$PutRequest.clinit (DatastorePb.java:8364) at com.google.appengine.api.datastore.DatastoreServiceImpl.put (DatastoreServiceImpl.java:155) at com.google.appengine.api.datastore.DatastoreServiceImpl.put (DatastoreServiceImpl.java:147) at com.col.server.MDsIri.add(MDsIri.java:74) // please see the code snippet above at com.col.server.tool.DsWriter.writeIri(DsWriter.java:73) at com.col.server.CAdmin.doIriWriteIri(CAdmin.java:165) at com.col.server.CAdmin.doGet(CAdmin.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: 487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1093) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter
[appengine-java] Re: UnsupportedDatastoreFeatureException
Multiple calls to setFilter will overwrite the previous value. Do you really want to do that? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] memcache in hosted mode?
There are a few threads that mention using memcache in hosted mode, and having to set certain properties or configure persistence.xml, but there does not seem to be a concrete example of what / where / or how to set the parameters. Currently I have to redeploy my app to App Engine every time to see a change on the servlet, because it uses memcache and my hosted mode is not supporting it. Stuart --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Java namespace for entity in bulkloader?
I am using Nick's excellent tutorials on bulk loading, and was able to push a huge pile of entities up to production. Problem is, they looked like this: MySpecialEntity in my custom python bulkloader class and in production. The gotcha is my application is Java, and queries for: SELECT FROM org.domain.app.MySpecialEntity fail because the Java namespace was not part of the python bulkloader. Anyone know a workaround? Stuart --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Maximum data size of image sent to service is not 1Mb, but 512Kb?
Hi Esteban. Please file any discrepancies between the development and production environments as bugs in the public issue tracker: http://code.google.com/p/googleappengine/issues/list Can you attach or link to an image that I can use to reproduce the error? Thanks, - Jason On Sat, Oct 31, 2009 at 10:41 AM, Esteban Ignacio Masoero emaso...@getsense.com.ar wrote: Hi there: I am using the ImagesService as this page ( http://code.google.com/intl/en/appengine/docs/java/images/overview.html ) says, using exactly the code posted there, and found out that with images between 512Kb (aprox.) and 1Mb, a strange error occurs. Moreover, the exception thrown does not have the same text description (I asume this in particular has to do with the differences that still exist between development and production environment). Image: .png, 581Kb Development: Caused by: java.lang.IllegalArgumentException: Failed to read image at com.google.appengine.api.images.ImagesServiceImpl.applyTransform(ImagesServiceImpl.java:65) (...) Production: Caused by: java.lang.IllegalArgumentException: Unknown at com.google.appengine.api.images.ImagesServiceImpl.applyTransform(ImagesServiceImpl.java:65) (...) This error is different that the one that occurs when an 1Mb image is processed, which correctly says The request to API call images.Transform() was too large.. I tried with an .png/466Kb image, and it worked fine in both environments. I think we have two different issues here, the different error messages in dev/prod environments, and the apparently real restriction size, which seems to be 512Kb aprox. Has anyone had the same problem? What can google guys say about this? Thanks in advance, Esteban PD = the 581Kb png image was edited with mspaint to reach that size, would that have something to do with it? (I succesfully visualized in firefox browser, so think it's ok, but I mention it just in case) --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: PreparedQuery.countEntities() clarifications
I think you already arrived the recommended solution to the issue of counting entities. For reference, the reason that the production environment only returned at most 1,000 is an artifact of the query mechanism that App Engine uses which can only return up to 1,000 results per query. - Jason On Fri, Oct 30, 2009 at 9:07 AM, Pion onlee2...@gmail.com wrote: http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/PreparedQuery.html#countEntities%28%29 shows int countEntities() Retrieves the number of Entities that currently match this Query. I have the following method: protected int count(String kind) { Query query = new Query(kind); PreparedQuery preparedQuery = datastore.prepare(query); return preparedQuery.countEntities(); } On my Development Server, it returns the total number of the entities which is over 40,000 entities. But when deploying it on GAE, it always returns 1,000 entities. Is this because of this limitation http://code.google.com/appengine/docs/java/datastore/overview.html#Quotas_and_Limits ? If so, what is the best way to find total number of entities I have? Please correct me if my assumption is incorrect. Thanks in advance for your help. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: task queue limit 30 sec?
Hi Steve. Can you post the full stack trace of one of these exceptions? - Jason On Mon, Nov 2, 2009 at 4:30 AM, sproz stephane.spra...@gmail.comwrote: Meanwhile, could anyone let me know why I get these DeadlineExceededException ? Thanks, Steve www.sprosys.com On Oct 29, 9:55 pm, Jason (Google) apija...@google.com wrote: We'll get these reflected in the documentation very soon. - Jason On Wed, Oct 28, 2009 at 12:49 PM, Toby Reyelts to...@google.com wrote: The limits on tasks queues recently changed http://googleappengine.blogspot.com/2009/10/task-queue-quota-increase For example, the new total limit is 100K tasks/day for free apps and 1M default for billing enabled. On Wed, Oct 28, 2009 at 2:38 PM, Jason (Google) apija...@google.com wrote: All task queue quotas and limits are listed at http://code.google.com/appengine/docs/java/taskqueue/overview.html#Qu Note that you can currently insert up to 10,000 tasks per day, although billed applications may have a higher upper limit. - Jason On Tue, Oct 27, 2009 at 12:21 PM, James Cooper jamespcoo...@gmail.comwrote: Related question: Is there a limit to the number of pending tasks in a queue? Can you have a million items in there? thanks -- James On Oct 27, 12:07 pm, Jason (Google) apija...@google.com wrote: No, all individual tasks must complete in 30 seconds or less. For larger jobs, such as processing millions of entities, the recommended approach is to split these jobs and run them as multiple tasks. At the end of the current task, you can determine if more work needs to be accomplished and dynamically add new tasks to the queue until the job is completely finished. - Jason On Sun, Oct 25, 2009 at 1:59 PM, sproz stephane.spra...@gmail.com wrote: Is the limit duration of a task in a queue superior to 30 seconds? I receive a DeadlineExceededException all the time --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] thanking uuuuuuuuu
Thank for the java version Is there any plugin for netbeans IDE --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: A tiny framework for working with POJO's in GAE
I don't see a link, but if your framework is open source, feel free to submit it to the App Engine open source projects listing by following the instructions at http://groups.google.com/group/google-appengine/web/google-app-engine-open-source-projects . - Jason On Sun, Nov 1, 2009 at 12:35 AM, Lars Borup Jensen lbor...@gmail.comwrote: Hi GAE users. I've written (well it's still in-progress) a tiny framework to make it easier to work with GAE/J and plain POJO's but not hiding the many traps of GAE (a transaction can only span a single entity-group and so forth). I've posted one of my simple JUnit testcases on my blog if anyone want to take a look: http://lborupj.blogspot.com/ Regards, Lars Borup Jensen --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] UnsupportedDatastoreFeatureException
I cant wrap my head around this but i'm having an issue with doing a basic query. I have a user class that contains an embeddable class ContactInfo. ContactInfo has email, phone, and address String fields. @PersistenceCapable(identityType=IdentityType.APPLICATION) public class MyUser { @Persistent private ContactInfo contactInfo; @PersistenceCapable @EmbeddedOnly public class ContactInfo { When i wrote a simple authenticate query... Query query = pm.newQuery(MyUser.class); query.setFilter(email == emailParam); query.setFilter(password == passwordParam); query.declareParameters(String emailParam,String passwordParam); try { ListMyUser results = (ListMyUser) query.execute (email,password); I can successfully get back results with no errors. I have another class called Account that i want to link a user to. @PersistenceCapable(identityType=IdentityType.APPLICATION) public class Account { @Persistent private Key accountManager; In adding an account i need to first get the user from a form via a query Query query = pm.newQuery(MyUser.class); query.setFilter(email == emailParam); query.declareParameters(String emailParam); try { ListMyUser results = (ListMyUser) query.execute(email); Notice this looks exactly the same as the other query just without the password. In this call i get this error. org.datanucleus.store.appengine.query.DatastoreQuery $UnsupportedDatastoreFeatureException: Problem with query SELECT FROM net.project.model.MyUser WHERE email == emailParam PARAMETERS String emailParam: Unexpected expression type while parsing query: org.datanucleus.query.expression.VariableExpression If i change the filter to query.setFilter(name == emailParam); this works fine. I suspect that since name is an object in MyUser while email is an object in ContactInfo that is embedded in MyUser, this is failing. But then how come the Authentication query worked? Any help would be appreciated... --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Issue with com.google.appengine.api.datastore.Text?
Beats me. It seems to be some sort of pixie dust you'll often need to apply. You don't need it for String, Long, Date, and a variety of other jdk classes, but I think you will need it for your classes. I don't understand why it's not used in the GAE web site's documentation. Tito George wrote: Thanks, It is working. Is this an issue? Or is it specific to Text On Nov 3, 11:00 am, Rusty Wright rwright.li...@gmail.com wrote: What happens if you change @Persistent to @Persistent(defaultFetchGroup = true) ? Tito George wrote: Enviornment: Local I have a Text field in one Persistent capable object, @Persistent private com.google.appengine.api.datastore.Text event_Description; I am sure that i am not setting null into this field. But while operating on queried object event_Description.getValue() is throwing NullPointerException. I am quering like this. public static MapLong, Event getEvents(AppUser appUser){ PersistenceManager pm = PMF.getInstance().getPersistenceManager(); Query query = pm.newQuery(Event.class); query.setFilter(email == pEmail); query.declareParameters(String pEmail); ListEvent result = null; MapLong, Event eventsMap = null; try { result = (ListEvent) query.execute(appUser.getEmail()); eventsMap = new HashMapLong, Event(); for(Event e: result){ //LINE TO REPLACE eventsMap.put(e.getEvent_ID(), e); } } finally { pm.close(); query.closeAll(); } return eventsMap; } Its works fine if I replace above commented line(//LINE TO REPLACE) with String str = e.getEvent_Description(); or sop(e.getEvent_Description()); or e.getEvent_Description(); Any Comments??? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: UnsupportedDatastoreFeatureException
Andy has pinpointed the issue. You most likely don't have a field on your MyUser class named email but the error isn't being triggered on the first query because your second call to setFilter() is overwriting the reference to the nonexistent field. You'll need to pass the entire filter to setfilter() and you most likely want 'contactInfo.email' instead of 'email' Hope this helps, Max On Tue, Nov 3, 2009 at 12:00 PM, datanucleus andy_jeffer...@yahoo.comwrote: Multiple calls to setFilter will overwrite the previous value. Do you really want to do that? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] How to obtain a consumer key to access a gmail account in a java based application
Hello everyone! I'm new to the Google API so my questions are gonna sound really easy :P I'm trying to integrate a simple service of getting a specific gmail user's contacts from his google account. Whats the most useful API google can provide for me to access such methods? Also, i realize that for a user to access google services though a client application, its necessary to obtain a consumer key for authentication. Can anyonw please explain me how can i get a consumer key so i can login to gmail through my client application? Thank you in advance --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: DeadlineExceededException while executing a server method.
Hi Sanjith. All App Engine requests must return within 30 seconds or this exception will be thrown. If you have a larger task, you can divide it into several parts and execute these in separate tasks, but each task must also return in 30 seconds or less. - Jason On Sat, Oct 31, 2009 at 11:12 AM, Sanjith Chungath csanj...@gmail.comwrote: in another word, is there a way to execute a server action through a normal server call or by tasks which can run more than 30 seconds? -Sanjith On Sat, Oct 31, 2009 at 12:40 AM, Sanjith Chungath csanj...@gmail.comwrote: Hi all, While executing a server method which talks to another system and get details from there, I get a DeadlineExceededException at the appengine. I don't have much control on the time taken by the other system. I just call a method from an interface of that system and wait for the response. What is the best practice in these situations? Below are the exceptions that I got at server. javax.servlet.ServletContext log: Exception while dispatching incoming RPC call com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.sanchu.clicks.client.GreetingService.greetServer(java.lang.String)' threw an unexpected exception: com.google.apphosting.api.DeadlineExceededException: This request (e737f449255620d0) started at 2009/10/29 18:30:43.480 UTC and was still executing at 2009/10/29 18:31:12.207 UTC. at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:239) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5135) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5133) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363) at com.google.net.rpc.impl.Server$2.run(Server.java:814) at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:516) at com.google.net.rpc.impl.Server.startRpc(Server.java:769) at com.google.net.rpc.impl.Server.processRequest(Server.java:351) at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:437) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) at com.google.net.async.Connection.handleReadEvent(Connection.java:436) at
[appengine-java] Re: ClassCastException after changing PK from Long to String
Sessions are also stored in memcache. To clear this you can write a simple page that calls memcache.clearAll(); 2009/11/3 pgoetz pgo...@pgoetz.de Hi Jason, thank you very much for your answer. I think that you are right, but have to admit, that I cannot prove it. I have tested the application again after some time (browser has been closed in between), and everything worked fine. Is it possible, that sessions (javax.servlet.http.HttpSession) are not being killed between application deployments? I have deleted the data in my datastore via the Admin Console, just as you proposed, and no data had been left. But I remember one instance of this persistent object in the session (although I thought I would detach it from the datastore), and that could have been the one that caused this problem. I would very much appreciate the information, if the session data is being kept alive between deployments and if I can delete those as well. Thanks a lot! Greetings, Peter --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Problems with JDO Query.setCandidates(Collection)
App Engine's DataNucleus plugin doesn't support the setCandidates method for querying a select group of entities -- all queries currently target the full datastore. You're welcome to file a feature request in the datanucleus-appengine issue tracker, but this isn't likely to be prioritized in the very near future. I recommend finding another acceptable solution for now. Depending on the typical size of your result sets, you can sort in memory, for example. http://code.google.com/p/datanucleus-appengine/ - Jason On Fri, Oct 30, 2009 at 10:06 AM, Zach znconr...@gmail.com wrote: So I am trying to do 2 sequential queries in app-engine to get around the problem of only being able to primary sort on the property that an inequality is done on. The problem is that setCandidates(Collection) doesnt actually appear to set the candidates to query against. Pseudo- code below. Query ageQuery = persistenceManager.newQuery(PersistentObject.class); ageQuery.setFilter(age ageMax); ageQuery.declareParameters(Integer ageMax); QueryResult unsorted = ageQuery.execute(25); Query sortQuery = persistenceManager.newQuery(PersistentObject.class); sortQuery.setOrdering(dateCreated desc); sortQuery.setCandidates(unsorted); QueryResult sorted = sortQuery.execute(); Also, one can verify that setCandidates doesn't work with something like below Query query= persistenceManager.newQuery(PersistentObject.class); query.setCandidates(new ArrayList()); QueryResult sorted = qujery.execute(); because sorted.size()!=0. Has anyone else ran into this problem? Am i doing something wrong? Thanks in advance for the help. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Maximum data size of image sent to service is not 1Mb, but 512Kb?
Jason: I've created this issue: http://code.google.com/p/googleappengine/issues/detail?id=2353, so you can have all the info you need to test both problems. Thanks again! Esteban On Tue, Nov 3, 2009 at 4:35 PM, Jason (Google) apija...@google.com wrote: Hi Esteban. Please file any discrepancies between the development and production environments as bugs in the public issue tracker: http://code.google.com/p/googleappengine/issues/list Can you attach or link to an image that I can use to reproduce the error? Thanks, - Jason On Sat, Oct 31, 2009 at 10:41 AM, Esteban Ignacio Masoero emaso...@getsense.com.ar wrote: Hi there: I am using the ImagesService as this page ( http://code.google.com/intl/en/appengine/docs/java/images/overview.html ) says, using exactly the code posted there, and found out that with images between 512Kb (aprox.) and 1Mb, a strange error occurs. Moreover, the exception thrown does not have the same text description (I asume this in particular has to do with the differences that still exist between development and production environment). Image: .png, 581Kb Development: Caused by: java.lang.IllegalArgumentException: Failed to read image at com.google.appengine.api.images.ImagesServiceImpl.applyTransform(ImagesServiceImpl.java:65) (...) Production: Caused by: java.lang.IllegalArgumentException: Unknown at com.google.appengine.api.images.ImagesServiceImpl.applyTransform(ImagesServiceImpl.java:65) (...) This error is different that the one that occurs when an 1Mb image is processed, which correctly says The request to API call images.Transform() was too large.. I tried with an .png/466Kb image, and it worked fine in both environments. I think we have two different issues here, the different error messages in dev/prod environments, and the apparently real restriction size, which seems to be 512Kb aprox. Has anyone had the same problem? What can google guys say about this? Thanks in advance, Esteban PD = the 581Kb png image was edited with mspaint to reach that size, would that have something to do with it? (I succesfully visualized in firefox browser, so think it's ok, but I mention it just in case) --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Master/Detail relations and redundant data handling
Sounds good James. The owned relationship between Book and Chapter is just defined by the fact that Book has a collection of Chapter as a member variable. If the relationship is bi-directional (i.e. Chapter has a Book as a member variable) then you use the mappedBy field in the @Persistent annotation. Looking foreward to youre feedback. On Nov 3, 2009 1:22 PM, James H james.hollier...@gmail.com wrote: Ok Bryce...I'm back. Going to test with your ideas now. In my case, I tend to avoid generic column names like id in favor of bookId and chapterId so I should not have any naming conflicts (at least rarely). Also, my FK embedded classes should not have any collections though I have a feeling they may come up as I get further into it. I'll just test with Book and owned relation Chapter as you have it here. How do we tell JDO whether a relation is owned vs unowned by the way? Because I would like to have a child object of each for the testing. Thanks! On Oct 9, 12:06 pm, bryce cottam bcot...@gmail.com wrote: FYI, this video was hugely helpful fo... On Fri, Oct 9, 2009 at 10:46 AM, James H james.hollier...@gmail.com wrote:Ylmz, thats how... ... read more »- Hide quoted text - - Show quoted text - --~--~-~--~~-... --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Master/Detail relations and redundant data handling
Ok Bryce...I'm back. Going to test with your ideas now. In my case, I tend to avoid generic column names like id in favor of bookId and chapterId so I should not have any naming conflicts (at least rarely). Also, my FK embedded classes should not have any collections though I have a feeling they may come up as I get further into it. I'll just test with Book and owned relation Chapter as you have it here. How do we tell JDO whether a relation is owned vs unowned by the way? Because I would like to have a child object of each for the testing. Thanks! On Oct 9, 12:06 pm, bryce cottam bcot...@gmail.com wrote: FYI, this video was hugely helpful for me, and this information helps me decide how to structure my data model to run best on the app-engine, it's a Google I/O session on how the app-engine big table implementation works:http://www.youtube.com/watch?v=tx5gdoNpcZM On Fri, Oct 9, 2009 at 10:46 AM, James H james.hollier...@gmail.com wrote: Ylmz, thats how I see it too. Any significant data model will be riddled with FKs and since GAE datastore does not support Joins you have NO choice but to denormalize your data to meet the needs of your app queries. The Cottam Pattern above allows best management of source to accomplish this denormalization. I assume the simple example you are referring to either only stores the Keys in the physical table (which would be insufficient for app queries) or stores the whole record (which would be massive overkill). Does that make any sense? On Oct 8, 4:46 am, bryce cottam bcot...@gmail.com wrote: yes, I think the point that we are making is that we are trying to managed un-owned relationships :) You are describing owned relationships, which I use as well, but in many cases, I really want un-owned relationships. For a variety of reasons really, one of which is that the children I have in my collection get get rather big, and there is a cap on the number of writes that can happen on an entity group. So, in come cases it's better to model the relationships as foreign keys. The problem comes in when you try to manage your data. It's a pretty common suggestion from the app-engine team to denormalize, we're just trying to come up with a way to denormalize and minimize code duplication etc. Denormalizing will let you query better/faster etc. but can create headaches when trying to update a single field which is mirrored on several other entities. For instance, you could have an Employee that works for several departments in a company. It's the same Employee, so it should be a single record. So, in this case you'd have a Company, Division and Employee. A Company owns it's Divisions and it also owns it's Employees, yet a Division owns it's Employees as well. So, where does the collection of Employees live? On the Company, or the Division? If it's the Division, then you can't share employees with other divisions (unless you duplicate the Employee record). If the Company owns the Employee, then you have to make some way for the Division to know who's in it. You could do this by putting a collection of Division Key objects on an Employee record, or a collection of Employee Keys on a Division record. Yet, this doesn't allow for simple querying, like select all employees that work in a division located in New York and has less than 20 people in it. Or, select all divisions who have an employee named Fred. you can do queries like this if you denormalize the data though :) On Thu, Oct 8, 2009 at 3:35 AM, ylmz yilmazhuse...@gmail.com wrote: may I suggest different kind of desing http://code.google.com/appengine/docs/java/datastore/relationships.html, in this document it suggests to use collection types to design one to many relation ships. and it works pretty well actually. when you use a collection type. app engine does not really use the original colection type you used. instead it uses its own replacement. so if you want to add a new employee to the company you just add a new one to the list. it automatically added to datastore. and if I understand right, when you get a company you dont get all the employees inside. you only get a collection type which is actulally empty but look like it has employees inside. so when you get any element from collection type it pulls that record from datastore. there is also some collection types that excepts unique values. Is there a spesific reason you don't use collections that I didn't understand? On Oct 7, 4:16 am, James H james.hollier...@gmail.com wrote: Wow, this is majorly useful...can't wait to try it out!!! For the life of me I can't figure out why this problem domain has NOT already been exhausted in this Group since denormalization is a requirement with this technology for any significant business application! I believe your example should be
[appengine-java] Re: What defines a single transaction in JDO?
Can you try moving your query into the first transaction and report if this makes a difference? - Jason On Fri, Oct 30, 2009 at 7:10 PM, RoryD rory1doug...@gmail.com wrote: I'm aware of the restriction on operating on multiple entity groups in a single transaction, but I thought the following code would work (but it doesnt): Transaction tx = null; try { tx = pm.currentTransaction(); ClassA existing = getExistingByQuery(pm); if(existing != null) { // 1st transaction tx.begin(); existing.setStuff(yo); tx.commit(); if(existing.isDingBat()) { // 2nd transaction tx.begin(); ClassB other = new ClassB(); other.setStuff(wow); pm.makePersistent(other); // (***) tx.commit(); } } } catch (Exception e) { if(tx != null tx.isActive()) { tx.rollback(); } } However, I get an exception at the line marked (***): java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction. How do I get another transaction then? Do i need to create a new PersistenceManager for the second part? In this simplified example, I could forego the second transaction entirely, but that might not always be the case, so what's the general solution? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: task queue limit 30 sec?
Here's one I got a few days ago. It looks like it timed-out while just queuing up a task: Uncaught exception from servlet com.google.apphosting.api.DeadlineExceededException: This request (8b0dab1ffe61eb3f) started at 2009/10/31 16:30:47.041 UTC and was still executing at 2009/10/31 16:31:16.438 UTC. at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(Unknown Source) at java.util.concurrent.CountDownLatch.await(Unknown Source) at com.google.net.rpc.util.RpcWaiter.waitForRpcsToFinish(RpcWaiter.java:96) at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:108) at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:37) at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:75) at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:71) at java.security.AccessController.doPrivileged(Native Method) at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:71) at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:37) at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:79) at com.google.appengine.api.labs.taskqueue.QueueApiHelper.makeSyncCall(QueueApiHelper.java:24) at com.google.appengine.api.labs.taskqueue.QueueImpl.add(QueueImpl.java:220) at com.google.appengine.api.labs.taskqueue.QueueImpl.add(QueueImpl.java:210) at com.newatlanta.appengine.datastore.CachingDatastoreService.queueWatchDogTask(CachingDatastoreService.java:388) at com.newatlanta.appengine.datastore.CachingDatastoreService.doGet(CachingDatastoreService.java:374) at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:239) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5135) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5133) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363) at com.google.net.rpc.impl.Server$2.run(Server.java:814) at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:516) at com.google.net.rpc.impl.Server.startRpc(Server.java:769) at com.google.net.rpc.impl.Server.processRequest(Server.java:351) at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:437) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) at
[appengine-java] Re: Master/Detail relations and redundant data handling
Consider this test case. A Person belongs to 1 or more Institutions so there's 2 ways you would want to query this. Query #1: Given a particular Person then which Institutions does he belong to? Query #2: Given a particular Institution then which Persons are members? Assume entity Person and its associated child relations will form its own entity group and, likewise, entity Institution will form its own entity group related to its children. In order to accommodate large amounts of Person and Institution data, I submit that you would need owned relations of each. Therefore, you would need entity PersonInstitutions as an owned child relation with Person for Query #1. Similarly, you would need entity InstitutionPersons as an owned child relation with Institution for Query #2. Also, each of these 2 child entities would contain both a PersonFK and a InstitutionFK with appropriate redundant fields ancillary to the query requirement of the app. Again, the embedded FK class avoids extra queries that would kill search list performance, etc. For example with Query #2, give me all persons at Baylor that have first name James would only need the entity InstitutionPersons. So, we accept the fact the design requires redundant data in the embedded FK class but at least from a source code perspective we only have FK class to manage. Is it correct that we would need both owned relations or not? Say you had Persons and Institutions from around the world. I can't imagine satisfying the above 2 queries without both owned relations. Of course, this means updates to both relations are across 2 entity groups and separate transactions. Another fact we have to accept in the design right? On Nov 3, 2:22 pm, James H james.hollier...@gmail.com wrote: Ok Bryce...I'm back. Going to test with your ideas now. In my case, I tend to avoid generic column names like id in favor of bookId and chapterId so I should not have any naming conflicts (at least rarely). Also, my FK embedded classes should not have any collections though I have a feeling they may come up as I get further into it. I'll just test with Book and owned relation Chapter as you have it here. How do we tell JDO whether a relation is owned vs unowned by the way? Because I would like to have a child object of each for the testing. Thanks! On Oct 9, 12:06 pm, bryce cottam bcot...@gmail.com wrote: FYI, this video was hugely helpful for me, and this information helps me decide how to structure my data model to run best on the app-engine, it's a Google I/O session on how the app-engine big table implementation works:http://www.youtube.com/watch?v=tx5gdoNpcZM On Fri, Oct 9, 2009 at 10:46 AM, James H james.hollier...@gmail.com wrote: Ylmz, thats how I see it too. Any significant data model will be riddled with FKs and since GAE datastore does not support Joins you have NO choice but to denormalize your data to meet the needs of your app queries. The Cottam Pattern above allows best management of source to accomplish this denormalization. I assume the simple example you are referring to either only stores the Keys in the physical table (which would be insufficient for app queries) or stores the whole record (which would be massive overkill). Does that make any sense? On Oct 8, 4:46 am, bryce cottam bcot...@gmail.com wrote: yes, I think the point that we are making is that we are trying to managed un-owned relationships :) You are describing owned relationships, which I use as well, but in many cases, I really want un-owned relationships. For a variety of reasons really, one of which is that the children I have in my collection get get rather big, and there is a cap on the number of writes that can happen on an entity group. So, in come cases it's better to model the relationships as foreign keys. The problem comes in when you try to manage your data. It's a pretty common suggestion from the app-engine team to denormalize, we're just trying to come up with a way to denormalize and minimize code duplication etc. Denormalizing will let you query better/faster etc. but can create headaches when trying to update a single field which is mirrored on several other entities. For instance, you could have an Employee that works for several departments in a company. It's the same Employee, so it should be a single record. So, in this case you'd have a Company, Division and Employee. A Company owns it's Divisions and it also owns it's Employees, yet a Division owns it's Employees as well. So, where does the collection of Employees live? On the Company, or the Division? If it's the Division, then you can't share employees with other divisions (unless you duplicate the Employee record). If the Company owns the Employee, then you have to make some way for the Division to know who's in it. You could do this by putting a
[appengine-java] Re: using maven with jpa
I don't know if this will help (maybe it's the datanucleus-core dependency with a scope of runtime), but here's my pom for jdo. This is a dependency pom; it encapsulates the dependencies for app engine datanucleus jdo. Put it in a directory by itself, create a src dir (not sure if that part is necessary) and then run mvn install and it will install the pom in your personal maven repo and then you can use it as a dependency (i.e., as if it was a fat jar full of what's listed in it). Then in your real project you can use it with dependency groupIdorg.objecteffects/groupId artifactIddependencies-appengine/artifactId version1.2.6/version typepom/type /dependency Note that the type pom is important. You can change the groupId, artifactId, version, etc. to whatever you want (in both poms). ?xml version=1.0 encoding=ISO-8859-1 ? project xmlns=http://maven.apache.org/POM/4.0.0; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance; xsi:schemaLocation= http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd; modelVersion4.0.0/modelVersion groupIdorg.objecteffects/groupId artifactIddependencies-appengine/artifactId packagingpom/packaging namegoogle app engine jdo dependencies/name version1.2.6/version descriptiongoogle app engine jdo dependencies module/description dependencies dependency groupIdcom.google.appengine.orm/groupId artifactIddatanucleus-appengine/artifactId version${version.google-datanucleus-appengine}/version /dependency dependency groupIdorg.datanucleus/groupId artifactIddatanucleus-core/artifactId version${version.datanucleus-core}/version scoperuntime/scope /dependency dependency groupIdjavax.jdo/groupId artifactIdjdo2-api/artifactId version${version.jdo}/version /dependency dependency groupIdjavax.transaction/groupId artifactIdjta/artifactId version${version.jta}/version /dependency dependency groupIdorg.datanucleus/groupId artifactIddatanucleus-jpa/artifactId version${version.datanucleus-jpa}/version /dependency /dependencies repositories repository idgoogle-maven-repo/id urlhttp://google-maven-repository.googlecode.com/svn/repository//url /repository /repositories properties version.google-appengine1.2.6/version.google-appengine version.google-datanucleus-appengine1.0.3/version.google-datanucleus-appengine version.datanucleus-core1.1.6/version.datanucleus-core version.datanucleus-jpa1.1.5/version.datanucleus-jpa version.datanucleus-springframework1.0.0/version.datanucleus-springframework version.jdo2.3-eb/version.jdo version.jta1.1/version.jta /properties /project alexh wrote: I was wondering if anyone has a working Maven pom.xml they would be willing to share. I've looked at a number of older posts and blogs concerning this topic and have run into a slew of various issues trying to create my own. I know you can shell out to an Ant task but I'd like to use the maven-datanucleus-plugin if possible. Or, maybe that's the problem? Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Master/Detail relations and redundant data handling
I don't know if this will help, but I finally figured out how to do parent queries using the parent's primary key. At the moment I don't see what advantage there is if you're storing a reference to the parent object in the child and using mappedBy in the parent, but here's what I have, in case it might be useful. Here's the child class; note its parentId field and its @Extension. It fills in this field automatically but you have to use either Key or the encoded String for the parent's primary key. Maybe this extension was necessary before they added the capability to have a direct reference to the parent (i.e., the latter is recent)? @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = true) public class Platform implements Serializable, ComparablePlatform { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName = datanucleus, key = gae.encoded-pk, value = true) private String id; @Persistent private String name; @Persistent private Short ordinal; @Persistent(defaultFetchGroup = true) private Facility facility; @Element(dependent = true) @Persistent(defaultFetchGroup = true, mappedBy = platform) private SetHost hosts = new HashSetHost(0); @Element(dependent = true) @Persistent(defaultFetchGroup = true, mappedBy = platform) private SetWaitlistEntry waitlistEntries = new HashSetWaitlistEntry(0); @Persistent(defaultFetchGroup = true) @Extension(vendorName = datanucleus, key = gae.parent-pk, value = true) private String parentId; The parent class is unremarkable: @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = true) public class Facility implements Serializable, ComparableFacility { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName = datanucleus, key = gae.encoded-pk, value = true) private String id; @Persistent private String name; @Persistent private Boolean waitlistEnabled; @Element(dependent = true) @Persistent(defaultFetchGroup = true, mappedBy = facility) private SetPlatform platforms = new HashSetPlatform(0); Then the Platform dao looks like public ListPlatform findByFacility(final Facility facility) { final Query query = newQuery(parentId == :parentIdParam); query.setOrdering(ordinal asc); final ListPlatform results = findByQuery(query, facility.getId()); You can probably figure out what it looks like when you use the Facility object rather than its id. James H wrote: Consider this test case. A Person belongs to 1 or more Institutions so there's 2 ways you would want to query this. Query #1: Given a particular Person then which Institutions does he belong to? Query #2: Given a particular Institution then which Persons are members? Assume entity Person and its associated child relations will form its own entity group and, likewise, entity Institution will form its own entity group related to its children. In order to accommodate large amounts of Person and Institution data, I submit that you would need owned relations of each. Therefore, you would need entity PersonInstitutions as an owned child relation with Person for Query #1. Similarly, you would need entity InstitutionPersons as an owned child relation with Institution for Query #2. Also, each of these 2 child entities would contain both a PersonFK and a InstitutionFK with appropriate redundant fields ancillary to the query requirement of the app. Again, the embedded FK class avoids extra queries that would kill search list performance, etc. For example with Query #2, give me all persons at Baylor that have first name James would only need the entity InstitutionPersons. So, we accept the fact the design requires redundant data in the embedded FK class but at least from a source code perspective we only have FK class to manage. Is it correct that we would need both owned relations or not? Say you had Persons and Institutions from around the world. I can't imagine satisfying the above 2 queries without both owned relations. Of course, this means updates to both relations are across 2 entity groups and separate transactions. Another fact we have to accept in the design right? On Nov 3, 2:22 pm, James H james.hollier...@gmail.com wrote: Ok Bryce...I'm back. Going to test with your ideas now. In my case, I tend to avoid generic column names like id in favor of bookId and chapterId so I should not have any naming conflicts (at least rarely). Also, my FK embedded classes should not have any collections though I have a feeling they may come up as I get further into it. I'll just test with Book and owned relation Chapter as you have it here. How do we tell JDO whether a relation is owned vs unowned by the way? Because I would like to have a child object of each for the testing.
[appengine-java] Re: managing root / parent objects
Great, thanks for answering that question. It's nice to know it's a possible solution; as we can see from the Bryce Cottam, James H, Diana Cruise, et. al. thread, dealing with these unowned child objects that are in various places, it's a puzzle. My latest thinking is that using clone() for this probably isn't a good idea; later on I may need a real clone, and for this my clone would probably not do a deep copy. Jason (Google) wrote: The overhead of having to fetch the inner object is negligible since you're using a direct fetch by key. You can set a @NotPersistent property of the intended type and modify your DAO methods to fetch both objects (User and FavoriteFood) and set the @NotPersistent property of the User to this fetched object. It's a few extra lines but you get the convenience of being able to access the inner object directly without polluting your datastore with cloned objects. - Jason On Sat, Oct 31, 2009 at 4:21 PM, Rusty Wright rwright.li...@gmail.com mailto:rwright.li...@gmail.com wrote: Yes, that's the point. My thinking is that (correct me if I'm wrong) if I store the object's key, when I fetch the outer containing object that has its key, I'll need to use the key to fetch the object. By cloning it, I don't need to do that, I just fetch the outer object and the inner object will get fetched along with it (assuming it's in the default fetch group). Whenever I want the outer object I'll also want its inner objects. If I store the key in the outer object, when I fetch the outer object it seems to me that I'll then need to fetch the contained object. And I'll have two fields on the outer object; using my FavoriteFood example, I'll need a field favoriteFoodKey, type Key, which is persisted, and a favoriteFood, type FavoriteFood, which is transient, and not persisted. Then my jsp would use the getter for the favoriteFood field. This is why I'm asking; it seems a bit complicated. Perhaps there's a simpler way that I could use. In my case, there isn't a lot of data so the duplication of objects isn't a big issue. John Patterson wrote: Why are you cloning instead of setting the original object? JDO will store the clone as a separate entity in the datastore. 2009/11/1 Rusty Wright rwright.li...@gmail.com mailto:rwright.li...@gmail.com mailto:rwright.li...@gmail.com mailto:rwright.li...@gmail.com I'm trying to figure out the best way to manage root objects that are used with different objects. For a semi concrete example, suppose you have a web page with a drop down list of Favorite Foods, and a User object may have a reference to a FavoriteFood, and other objects will have references to FavoriteFood objects as well. It seems to me that if individual FavoriteFood objects don't change, but the list (table) of FavoriteFood objects can grow, you could make them Cloneable and use the clone, making it a child, for example: FavoriteFood fav = favoriteFoodDao.findByStringId(stringId); user.addFavoriteFood(fav.clone()); Google's examples usually (always?) store the subordinate object's Key rather than a clone of the object. I can see problems with using clones; even though I'm sure they won't, they may change. Similarly, items may need to be deleted from the master FavoriteFood list/table. There may be other problems that I haven't thought of. Anyhow, I'm wondering if others have gone done this road or investigated it and can offer advise. Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Issue with com.google.appengine.api.datastore.Text?
Thanks Rusty. I will keep this in mind.. On Nov 4, 12:13 am, Rusty Wright rwright.li...@gmail.com wrote: Beats me. It seems to be some sort of pixie dust you'll often need to apply. You don't need it for String, Long, Date, and a variety of other jdk classes, but I think you will need it for your classes. I don't understand why it's not used in the GAE web site's documentation. Tito George wrote: Thanks, It is working. Is this an issue? Or is it specific to Text On Nov 3, 11:00 am, Rusty Wright rwright.li...@gmail.com wrote: What happens if you change @Persistent to @Persistent(defaultFetchGroup = true) ? Tito George wrote: Enviornment: Local I have a Text field in one Persistent capable object, @Persistent private com.google.appengine.api.datastore.Text event_Description; I am sure that i am not setting null into this field. But while operating on queried object event_Description.getValue() is throwing NullPointerException. I am quering like this. public static MapLong, Event getEvents(AppUser appUser){ PersistenceManager pm = PMF.getInstance().getPersistenceManager(); Query query = pm.newQuery(Event.class); query.setFilter(email == pEmail); query.declareParameters(String pEmail); ListEvent result = null; MapLong, Event eventsMap = null; try { result = (ListEvent) query.execute(appUser.getEmail()); eventsMap = new HashMapLong, Event(); for(Event e: result){ //LINE TO REPLACE eventsMap.put(e.getEvent_ID(), e); } } finally { pm.close(); query.closeAll(); } return eventsMap; } Its works fine if I replace above commented line(//LINE TO REPLACE) with String str = e.getEvent_Description(); or sop(e.getEvent_Description()); or e.getEvent_Description(); Any Comments??? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: ClassCastException after changing PK from Long to String
Thank you very much! I will do that just as a backup solution for the next time I want to clear the sessions. On Nov 3, 7:05 pm, John Patterson jdpatter...@gmail.com wrote: Sessions are also stored in memcache. To clear this you can write a simple page that calls memcache.clearAll(); 2009/11/3 pgoetz pgo...@pgoetz.de Hi Jason, thank you very much for your answer. I think that you are right, but have to admit, that I cannot prove it. I have tested the application again after some time (browser has been closed in between), and everything worked fine. Is it possible, that sessions (javax.servlet.http.HttpSession) are not being killed between application deployments? I have deleted the data in my datastore via the Admin Console, just as you proposed, and no data had been left. But I remember one instance of this persistent object in the session (although I thought I would detach it from the datastore), and that could have been the one that caused this problem. I would very much appreciate the information, if the session data is being kept alive between deployments and if I can delete those as well. Thanks a lot! Greetings, Peter --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: AppEngine Java stability concerns
Hi Ross, Thank you for your response. I will monitor the downtime notify group from now on. Even though this was a planned outage, I am still quite concerned that a complete downtime of over 1h is necessary on your infrastructure... What is the strategy you suggest to your customers to handle this type of downtime? How often should we expect to be completely down (the data store being read only is a total downtime for most web apps)? Regarding my other question about short outages we have been noticing through out the day: what is the best way to report these to you such as we can help your team understand and debug short issues? Thank you. Jerome On Nov 3, 8:21 pm, Max Ross (Google) maxr+appeng...@google.com wrote: Hi Jerome, There is planned maintenance going on right now. I'd strongly encourage you to subscribe to the App Engine Downtime Notify group where you can learn about these things in advance: http://groups.google.com/group/google-appengine-downtime-notify Thanks, Max On Tue, Nov 3, 2009 at 6:18 PM, Jerome jerome.mou...@gmail.com wrote: Hello, Our app has been running on AppEngine Java for 2 months. We are now ramping up on traffic and have enabled the billing feature. We are seeing on a daily basis short (1-2 minutes) outages. Most of the time, this is on the datastore, but these short outages sometimes affect other areas as well, like for instance serving static content. Today, we are seeing a data store in anomaly. This has been going on for over an our now: Uncaught exception from servlet com.google.apphosting.api.ApiProxy$CapabilityDisabledException: The API call datastore_v3.Put() is temporarily unavailable. We are completely dead in the water... My 2 questions are: - how/where can we report short outages that are usually not reflected on the AppEngine system status? - what is the AppEngine team plan to ensure a reliable service Jerome --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---
[appengine-java] Re: Master/Detail relations and redundant data handling
Hi James, sorry for the delay, My design is currently similar to what you proposed. However, in your example, I'd probably make 2 classes: PersonFK and InstitutionFK.: public class PersonFK { private Key id; private String firstName; private String lastName; private String city; } public class InstitutionFK { private Key id; private String name; private String city; } Then in Person you would have: public class Person { private ListInstitutionFK institutions; } and in Institutions you would have: public class Institution { private ListPersonFK persons; } (I'm leaving out the annotations for brevity). each of these member fields (institutions and persons) are owned by their containing instance of Person and Institutions. Thus, the relationship is defined by who owns it (i.e we don't need the Institution's id, name, city etc. on the persons collection because we already know what Institution the PersonFK's are linked to) So, yes, anytime you want to do something like update the Person.city field, you'd want to get all PersonFK instances with your person-Id, then update each instance with the new city value. Of course, this only matters if you plan on querying Institutions based off of the city field of a Person. That generally would imply multiple transactions, however there is the Wilkerson distributed transaction model, which makes global transactions on GAE possible. So, if your writes really do need to be transactional, then you can do an all or nothing operation on multiple entity groups with this approach. here is a video from Google I/O about distributed transactions on the GAE: http://www.youtube.com/watch?v=IOtBlzsx0m8 On Tue, Nov 3, 2009 at 1:50 PM, James H james.hollier...@gmail.com wrote: Consider this test case. A Person belongs to 1 or more Institutions so there's 2 ways you would want to query this. Query #1: Given a particular Person then which Institutions does he belong to? Query #2: Given a particular Institution then which Persons are members? Assume entity Person and its associated child relations will form its own entity group and, likewise, entity Institution will form its own entity group related to its children. In order to accommodate large amounts of Person and Institution data, I submit that you would need owned relations of each. Therefore, you would need entity PersonInstitutions as an owned child relation with Person for Query #1. Similarly, you would need entity InstitutionPersons as an owned child relation with Institution for Query #2. Also, each of these 2 child entities would contain both a PersonFK and a InstitutionFK with appropriate redundant fields ancillary to the query requirement of the app. Again, the embedded FK class avoids extra queries that would kill search list performance, etc. For example with Query #2, give me all persons at Baylor that have first name James would only need the entity InstitutionPersons. So, we accept the fact the design requires redundant data in the embedded FK class but at least from a source code perspective we only have FK class to manage. Is it correct that we would need both owned relations or not? Say you had Persons and Institutions from around the world. I can't imagine satisfying the above 2 queries without both owned relations. Of course, this means updates to both relations are across 2 entity groups and separate transactions. Another fact we have to accept in the design right? On Nov 3, 2:22 pm, James H james.hollier...@gmail.com wrote: Ok Bryce...I'm back. Going to test with your ideas now. In my case, I tend to avoid generic column names like id in favor of bookId and chapterId so I should not have any naming conflicts (at least rarely). Also, my FK embedded classes should not have any collections though I have a feeling they may come up as I get further into it. I'll just test with Book and owned relation Chapter as you have it here. How do we tell JDO whether a relation is owned vs unowned by the way? Because I would like to have a child object of each for the testing. Thanks! On Oct 9, 12:06 pm, bryce cottam bcot...@gmail.com wrote: FYI, this video was hugely helpful for me, and this information helps me decide how to structure my data model to run best on the app-engine, it's a Google I/O session on how the app-engine big table implementation works:http://www.youtube.com/watch?v=tx5gdoNpcZM On Fri, Oct 9, 2009 at 10:46 AM, James H james.hollier...@gmail.com wrote: Ylmz, thats how I see it too. Any significant data model will be riddled with FKs and since GAE datastore does not support Joins you have NO choice but to denormalize your data to meet the needs of your app queries. The Cottam Pattern above allows best management of source to accomplish this denormalization. I assume the simple example you are referring to either only stores
[google-appengine] Download Accelerator Plus Premium 9.1.1.1
DAP Premium: Extreme acceleration, powerful privacy features, and advanced downloading tools. Download Accelerator Plus (DAP Premium) accelerates the speed with which you can receive files over the Internet using FTP and HTTP protocols, by simultaneously downloading several file segments from the same or different servers. The application enables you to pause and resume downloads, and to recover from a dropped internet connection. In addition, DAP searches for mirror sites and implements the downloads from the best or most responsive mirrors. It is configured by default to automatically integrate into your Internet Explorer, Firefox, Opera or Netscape browser when it is installed, and to self-activate each time a download is performed. No further configuration or action is required on your part - simply use your browser to access the desired site, click on the download file, and respond to the self-explanatory DAP dialogs that appear. DAP's advanced options enable you to tailor the operation of the application to your needs. You can choose to trigger specific responses including messages, queue update, and closing the application and disconnecting after the download completes or is unavailable. Accelerator --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Support for Protocol buffers
thanks That's the solution with putting code in the project though (I should probably included the project URL). On 29 Okt., 12:38, Stephen sdea...@gmail.com wrote: On Oct 28, 3:55 pm, Tonny mezz...@gmail.com wrote: Will there be official support for protocol buffers. http://code.google.com/p/googleappengine/issues/detail?id=571 --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] fishiness in localhost inbound mail handler
Using the code in http://pastie.org/680280 (top) I get the error AttributeError: Message instance has no attribute 'read' (full traceback in pastie) referring to google.appengine.api.mail.py, function _parse_mime_message (mime_message). (also in pastie, bottom) This function checks if input mime_message is email.Message.Message, if not, it checks if it's a basestring, if neither, it must be a file! So it happily calls email.message_from_file(mime_message) Whence the error: input is not a file, so doesn't have the method read If I insert a line loggin.debug(str(type(mime_message))) right after the comment in mail.py (ie in pastie, line 60) and restart my localhost logging prints type 'str' type 'instance' type 'instance' ..and then it seems to start working - no more AttributeError. But if I change my test file (the code in pastie) to start doing some work, the error appears again. At this point I gave up trying to use google api.mail package and just pase the post with Python builtin email module. You may want to review the code. Regards, re --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Significant performance degredation over the last week
Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? It does However you are not guarunteed to find anything in the cache, and I think its indicative of a capacity problem in the early morning US time that startup times that normally are around 3-4 sec, blow out to 30 sec are occuring very frequently. So the best example of this problem is one that doesn't load a big stack and still blows out instance startup time, as per the OP's post. Rgds T On Nov 3, 5:53 am, William Montgomery w.k.r.montgom...@googlemail.com wrote: Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? Will. 2009/11/2 Jason C jason.a.coll...@gmail.com We have a webapp application that occasionally gets DeadlineExceededErrors on cold start (i.e., 30s!). This is a regular occurrence on our Django-based apps. Happens at the usual times: say, 6-9a PST. j On Nov 2, 2:17 pm, Brandon Thomson gra...@gmail.com wrote: For a simple webapp app, even cold start should be not more than 50-100ms extra. One thing you might be affected by is slow import bug; you may want to add more logging statements to see if that is the cause. Either way try to bring it to the attention of googlers so they can look into it as there is probably nothing you can do. On Nov 1, 5:48 pm, Blake blake.commag...@gmail.com wrote: Hi - I have a relatively simple app and I've noticed significant performance degredation over the last week. Even on extremely simple pages like the about page which has the following code: class About(webapp.RequestHandler): def get(self): template_values = {} path = os.path.join(os.path.dirname(__file__), '../views/ about.html') self.response.out.write(template.render(path, template_values)) Yesterday, requests to this page were taking anywhere from 10-15 seconds to display from the time appengine first recorded the request arrival - just to verify I adding some logging and it was almost the entire time of the request before flow control was in my class. Naturally once my code was executing it finished very quickly as all it does is render a static html file. Some requests finished almost instantaneously, but consistently I ran into the enormous delay. This pattern leads me to believe that I'm being affected by the cold start phenomenon but I would expect that as I continued to hit refresh to generate logging data that all subsequent loads would be fast, but many were not. Any insights? -Blake --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
Hi Have you tried this? For starters you can't assign values to numbers. ie no matter what you do you can't assign 2009 = 'abc' You would need to use some other identifier as you mentioned and then specify something like year_2009 = db.IntegerProperty(name=2009) or something similiar. I also see a problem with this strategy with regard to index definitions. Whilst running the SDK the indexes will get created as you define data however once you are running in real google environment you will need to make sure you have already defined all possible indexes that you plan to use before you create any new data (or reindex everything), which means indexes for all years you plan to hold data for and search, and months, and combinations of the two. I am not sure this is a particularly good approach, but then I am not sure I get what you are actually doing. Have you compared the performance of lookups between the two strategies, also remembering if you are actually interested in year/ month then you are actually using composite indexes, I wonder if you will ever use the month only index (apart from comparing months with months for all years in no particular order) Rgds T On Nov 3, 12:22 am, Eli eli.jo...@gmail.com wrote: Here's something I've been wondering about Expando. Say you define an Expando model like so: class meStats(db.Expando): meNumber = db.IntegerProperty(required=True) And, then you begin populating it like so: meEntity1 = meStats(meNumber = 200, June = 14, 2009 = 6) meEntity.put() meEntity2 = meStats(meNumber = 381, July = 21, 2009 = 7) meEntity2.put() ..and so on. The July column only has indexes for entities that have July defined.. correct? So, in effect, I am creating a partitioned index for a table that can grow indefinitely.. and each time I get to a new year/month combo, I am inserting into new indexes..? (instead of inserting into an ever increasing, monolithic Month column index..) Mainly, I'm packing the pertinent information into the column names and column values (instead of making the column name just some dummy value like Month).. this allows me to implicitly create the partitioned table/index (I think of it as a partitioned index since it is, schematically [as far as I'm concerned], one table.) You could give the columns better names.. maybe June_Day and maybe 2009_Month if you wanted... Does this make sense? Have I misunderstood how Expando handles indexes? Another way to word this question would be: Is there a difference between the indexes created for the June and July entries in the above Expando model and the below Model models: class meJune09Stats(db.Model): meNumber = db.IntegerProperty(required=True) June = db.IntegerProperty(required=True) 2009 = db.IntegerProperty(required=True) class meJuly09Stats(db.Model): meNumber = db.IntegerProperty(required=True) July = db.IntegerProperty(required=True) 2009 = db.IntegerProperty(required=True) Thanks for any information. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: fishiness in localhost inbound mail handler
I've found that you need to restart the local dev environment before doing any inbound mail testing. Otherwise, you'll get that read error. On Nov 3, 2009, at 5:13 AM, rasmus wrote: Using the code in http://pastie.org/680280 (top) I get the error AttributeError: Message instance has no attribute 'read' (full traceback in pastie) referring to google.appengine.api.mail.py, function _parse_mime_message (mime_message). (also in pastie, bottom) This function checks if input mime_message is email.Message.Message, if not, it checks if it's a basestring, if neither, it must be a file! So it happily calls email.message_from_file(mime_message) Whence the error: input is not a file, so doesn't have the method read If I insert a line loggin.debug(str(type(mime_message))) right after the comment in mail.py (ie in pastie, line 60) and restart my localhost logging prints type 'str' type 'instance' type 'instance' ..and then it seems to start working - no more AttributeError. But if I change my test file (the code in pastie) to start doing some work, the error appears again. At this point I gave up trying to use google api.mail package and just pase the post with Python builtin email module. You may want to review the code. Regards, re --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: More than 10 applications
That would mean that for each client I'd have to make a Google Account. While this could be a workaround it just seems a little strange that there isn't a way to add more apps to an account. On Nov 2, 1:38 pm, Eli eli.jo...@gmail.com wrote: A proper solution might be to sign up each client for an AppEngine account and set their application up under that. On Nov 1, 11:44 pm, Chris chris.slink...@gmail.com wrote: I'm looking to use Google App Engine to launch some GWT based solutions for clients. However, I can't help but see the inherent problem of running out of applications. Once I've hosted 10 applications how can I host the 11th? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Support for Protocol buffers
On 29 Okt., 12:38, Stephen sdea...@gmail.com wrote: On Oct 28, 3:55 pm, Tonny mezz...@gmail.com wrote: Will there be official support for protocol buffers. http://code.google.com/p/googleappengine/issues/detail?id=571 On Nov 3, 10:11 am, Tonny mezz...@gmail.com wrote: thanks That's the solution with putting code in the project though. Yeah, that's mentioned as a workaround. My impression though is this issue a feature request for official support for proto bufs, so you might want to star it so you can be notified if/when it is eventually added (or not, 'cos googlers don't read the issue tracker...) --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: fishiness in localhost inbound mail handler
Ah, I see it's under consideration. Hoping for a fix sometime soonish. http://code.google.com/p/googleappengine/issues/detail?id=2287 --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
I haven't done any testing on this yet since I'd have to fill up tens of gigs of information to see real live performance numbers. I'm hoping the implicit partitioning makes it so that one doesn't need manually created indexes (just thedefault ones.) The example I showed would be a schema for storing a daily int statistic. The 'June' column entries would show the day of that month and the 'y2009' column would have the 6 value since June is the 6th month of the year. If I wanted stats for June, my select would look like this: Select * From meStats Where y2009 = 6 AND June 15 This would/should implicitly hit the june rows for 2009 and get the stats for every day after the 15th. You could munge around your column names and the values inserted to get different data reporting behaviour.. The main, potential value is the implicit partitioning (where you don't need to manually define a bunch of schemas up front). On 11/3/09, Tim Hoffman zutes...@gmail.com wrote: Hi Have you tried this? For starters you can't assign values to numbers. ie no matter what you do you can't assign 2009 = 'abc' You would need to use some other identifier as you mentioned and then specify something like year_2009 = db.IntegerProperty(name=2009) or something similiar. I also see a problem with this strategy with regard to index definitions. Whilst running the SDK the indexes will get created as you define data however once you are running in real google environment you will need to make sure you have already defined all possible indexes that you plan to use before you create any new data (or reindex everything), which means indexes for all years you plan to hold data for and search, and months, and combinations of the two. I am not sure this is a particularly good approach, but then I am not sure I get what you are actually doing. Have you compared the performance of lookups between the two strategies, also remembering if you are actually interested in year/ month then you are actually using composite indexes, I wonder if you will ever use the month only index (apart from comparing months with months for all years in no particular order) Rgds T On Nov 3, 12:22 am, Eli eli.jo...@gmail.com wrote: Here's something I've been wondering about Expando. Say you define an Expando model like so: class meStats(db.Expando): meNumber = db.IntegerProperty(required=True) And, then you begin populating it like so: meEntity1 = meStats(meNumber = 200, June = 14, 2009 = 6) meEntity.put() meEntity2 = meStats(meNumber = 381, July = 21, 2009 = 7) meEntity2.put() ..and so on. The July column only has indexes for entities that have July defined.. correct? So, in effect, I am creating a partitioned index for a table that can grow indefinitely.. and each time I get to a new year/month combo, I am inserting into new indexes..? (instead of inserting into an ever increasing, monolithic Month column index..) Mainly, I'm packing the pertinent information into the column names and column values (instead of making the column name just some dummy value like Month).. this allows me to implicitly create the partitioned table/index (I think of it as a partitioned index since it is, schematically [as far as I'm concerned], one table.) You could give the columns better names.. maybe June_Day and maybe 2009_Month if you wanted... Does this make sense? Have I misunderstood how Expando handles indexes? Another way to word this question would be: Is there a difference between the indexes created for the June and July entries in the above Expando model and the below Model models: class meJune09Stats(db.Model): meNumber = db.IntegerProperty(required=True) June = db.IntegerProperty(required=True) 2009 = db.IntegerProperty(required=True) class meJuly09Stats(db.Model): meNumber = db.IntegerProperty(required=True) July = db.IntegerProperty(required=True) 2009 = db.IntegerProperty(required=True) Thanks for any information. -- Sent from my mobile device --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Significant performance degredation over the last week
Yes, we are now seeing the occasional deadline exceeded in the AM US time for a small-stack app as well. On Nov 3, 6:18 am, Tim Hoffman zutes...@gmail.com wrote: Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? It does However you are not guarunteed to find anything in the cache, and I think its indicative of a capacity problem in the early morning US time that startup times that normally are around 3-4 sec, blow out to 30 sec are occuring very frequently. So the best example of this problem is one that doesn't load a big stack and still blows out instance startup time, as per the OP's post. Rgds T On Nov 3, 5:53 am, William Montgomery w.k.r.montgom...@googlemail.com wrote: Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? Will. 2009/11/2 Jason C jason.a.coll...@gmail.com We have a webapp application that occasionally gets DeadlineExceededErrors on cold start (i.e., 30s!). This is a regular occurrence on our Django-based apps. Happens at the usual times: say, 6-9a PST. j On Nov 2, 2:17 pm, Brandon Thomson gra...@gmail.com wrote: For a simple webapp app, even cold start should be not more than 50-100ms extra. One thing you might be affected by is slow import bug; you may want to add more logging statements to see if that is the cause. Either way try to bring it to the attention of googlers so they can look into it as there is probably nothing you can do. On Nov 1, 5:48 pm, Blake blake.commag...@gmail.com wrote: Hi - I have a relatively simple app and I've noticed significant performance degredation over the last week. Even on extremely simple pages like the about page which has the following code: class About(webapp.RequestHandler): def get(self): template_values = {} path = os.path.join(os.path.dirname(__file__), '../views/ about.html') self.response.out.write(template.render(path, template_values)) Yesterday, requests to this page were taking anywhere from 10-15 seconds to display from the time appengine first recorded the request arrival - just to verify I adding some logging and it was almost the entire time of the request before flow control was in my class. Naturally once my code was executing it finished very quickly as all it does is render a static html file. Some requests finished almost instantaneously, but consistently I ran into the enormous delay. This pattern leads me to believe that I'm being affected by the cold start phenomenon but I would expect that as I continued to hit refresh to generate logging data that all subsequent loads would be fast, but many were not. Any insights? -Blake --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: huge latency on all requests
its happening again today, same time as yesterday On Nov 2, 10:17 am, bFlood bflood...@gmail.com wrote: yea, seems back to normal now. that was a bad one On Nov 2, 10:14 am, Brandon Thomson gra...@gmail.com wrote: looks like it might be fixed now On Nov 2, 9:59 am, bFlood bflood...@gmail.com wrote: anyone else seeing this (11/02 - 10am EST) --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: More than 10 applications
If you have a genuine use case (ie not just abusing the system) Google will increase the 10 app limit. The only issue is currently have to wait until a developer spots your request in this group. (well they have in the past) 2009/11/2 Chris chris.slink...@gmail.com: I'm looking to use Google App Engine to launch some GWT based solutions for clients. However, I can't help but see the inherent problem of running out of applications. Once I've hosted 10 applications how can I host the 11th? -- Barry - www.nearby.org.uk - www.geograph.org.uk - --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: huge latency on all requests
Yep, seeing this too. Didn't notice yesterday, but noticing now :) Seeing very high latency and cpu usage on requests that yesterday where maybe 20ms..now 2 seconds to ...phhh..15 seconds in some cases! Also seeing timeouts and warnings about requests not being handled because of high latency, likely due to being over quota, despite quota showing everything to be 'okay'. A look at the status currently shows anomalys in python and memcache... but no detail beyond that. On Nov 3, 2:41 pm, bFlood bflood...@gmail.com wrote: its happening again today, same time as yesterday On Nov 2, 10:17 am, bFlood bflood...@gmail.com wrote: yea, seems back to normal now. that was a bad one On Nov 2, 10:14 am, Brandon Thomson gra...@gmail.com wrote: looks like it might be fixed now On Nov 2, 9:59 am, bFlood bflood...@gmail.com wrote: anyone else seeing this (11/02 - 10am EST) --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: huge latency on all requests
I have the same problem right now. Average response time is over 2 seconds. App id: sovpad Looks like a problem from September. On Nov 3, 4:44 pm, peterk peter.ke...@gmail.com wrote: Yep, seeing this too. Didn't notice yesterday, but noticing now :) Seeing very high latency and cpu usage on requests that yesterday where maybe 20ms..now 2 seconds to ...phhh..15 seconds in some cases! Also seeing timeouts and warnings about requests not being handled because of high latency, likely due to being over quota, despite quota showing everything to be 'okay'. A look at the status currently shows anomalys in python and memcache... but no detail beyond that. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] import os
Hi, Im getting a google.appengine.runtime.DeadlineExceededError error when I call import os. Is this an error? -- Jairo Vasquez Moreno Mentez Developer www.mentez.com Medellin - Colombia --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
Hi On Nov 3, 10:26 pm, Eli Jones eli.jo...@gmail.com wrote: I haven't done any testing on this yet since I'd have to fill up tens of gigs of information to see real live performance numbers. I'm hoping the implicit partitioning makes it so that one doesn't need manually created indexes (just thedefault ones.) The example I showed would be a schema for storing a daily int statistic. The 'June' column entries would show the day of that month and the 'y2009' column would have the 6 value since June is the 6th month of the year. If I wanted stats for June, my select would look like this: Select * From meStats Where y2009 = 6 AND June 15 But the minute you do this you will then need an index that looks like - kind: meStats properties: - name: y2009 - name: June and so on for every year month combination where you do a comparison. I think you should have a read about how indexes are created and accessed before you try optimising something that probably doesn't need it. Note the rules from defining index doc http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Defining_Indexes_With_Configuration Other forms of queries require their indexes to be specified in index.yaml, including: * queries with multiple sort orders * queries with a sort order on keys in descending order * queries with one or more inequality filters on a property and one or more equality filters over other properties * queries with inequality filters and ancestor filters You fall into the third rule. Which as I said eariler will mean you need to manually specify in index.yaml a massive number of indexes Rgds T This would/should implicitly hit the june rows for 2009 and get the stats for every day after the 15th. You could munge around your column names and the values inserted to get different data reporting behaviour.. The main, potential value is the implicit partitioning (where you don't need to manually define a bunch of schemas up front). On 11/3/09, Tim Hoffman zutes...@gmail.com wrote: Hi Have you tried this? For starters you can't assign values to numbers. ie no matter what you do you can't assign 2009 = 'abc' You would need to use some other identifier as you mentioned and then specify something like year_2009 = db.IntegerProperty(name=2009) or something similiar. I also see a problem with this strategy with regard to index definitions. Whilst running the SDK the indexes will get created as you define data however once you are running in real google environment you will need to make sure you have already defined all possible indexes that you plan to use before you create any new data (or reindex everything), which means indexes for all years you plan to hold data for and search, and months, and combinations of the two. I am not sure this is a particularly good approach, but then I am not sure I get what you are actually doing. Have you compared the performance of lookups between the two strategies, also remembering if you are actually interested in year/ month then you are actually using composite indexes, I wonder if you will ever use the month only index (apart from comparing months with months for all years in no particular order) Rgds T On Nov 3, 12:22 am, Eli eli.jo...@gmail.com wrote: Here's something I've been wondering about Expando. Say you define an Expando model like so: class meStats(db.Expando): meNumber = db.IntegerProperty(required=True) And, then you begin populating it like so: meEntity1 = meStats(meNumber = 200, June = 14, 2009 = 6) meEntity.put() meEntity2 = meStats(meNumber = 381, July = 21, 2009 = 7) meEntity2.put() ..and so on. The July column only has indexes for entities that have July defined.. correct? So, in effect, I am creating a partitioned index for a table that can grow indefinitely.. and each time I get to a new year/month combo, I am inserting into new indexes..? (instead of inserting into an ever increasing, monolithic Month column index..) Mainly, I'm packing the pertinent information into the column names and column values (instead of making the column name just some dummy value like Month).. this allows me to implicitly create the partitioned table/index (I think of it as a partitioned index since it is, schematically [as far as I'm concerned], one table.) You could give the columns better names.. maybe June_Day and maybe 2009_Month if you wanted... Does this make sense? Have I misunderstood how Expando handles indexes? Another way to word this question would be: Is there a difference between the indexes created for the June and July entries in the above Expando model and the below Model models:
[google-appengine] DeadlineExceededErrors killing us
Will there ever be a solution? We cannot host a website in GAE if a sizable percentage of the visitors cannot connect. I am sure there is a solution for this. Can someone from Google please address this? It seems to be mainly when we import Django 1.1, but not always. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Querying owned many-to-one related objects
In a scenario that there is a parent persisted object that has many persisted children objects, is it possible to perform the following query on the children with jdo? Select * from childobjectclass where someval == 'something' parent == 'parentobject1' rjaxin --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: 500 Error When Trying to appcfg.py update
I'm currently getting these errors as well. It would be nice to have a separate row for deployments status on http://code.google.com/status/appengine On Nov 4, 3:22 am, Kortina kort...@gmail.com wrote: Hi, I'm getting the following error when I try to update my app: Server: appengine.google.com. Scanning files on local disk. Initiating update. Error 500: --- begin server output --- Server Error (500) A server error has occurred. --- end server output --- I just updated the app 30 minutes ago and it worked fine, but now I get this error when I try to update. I also get an update when I try to rollback. Is there some sort of system maintenance going on preventing application updates? The error message is too generic for me to understand if there is a problem on my end. Any help would be greatly appreciated. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Seeking any Good Opinions / Design Pattern Input
I'm still plugging away on this, but haven't gotten it to work yet. I think the problem that I am having is that I should not be trying to store part of the object straight into the array, but maybe i need to actually create a new array first? Anyway, here's the progress I have so far: class mwProfile(db.Model): title=db.StringProperty() name=db.StringProperty() charclass=db.StringProperty() level=db.IntegerProperty() fb_sig_id=db.StringProperty() date=db.DateTimeProperty(auto_now_add=True) titles=db.BlobProperty() stats=db.BlobProperty() skills=db.BlobProperty() weapons=db.BlobProperty() armor=db.BlobProperty() vehicles=db.BlobProperty() boosts=db.BlobProperty() lots=db.BlobProperty() props=db.BlobProperty() #titles=[],stats=[],skills=[] #weapons=[],armor=[],vehicles=[] #boosts=[],lots=[];properties=[] def sync(self,obj): retcode=0 try: thisProfile=self self.title = obj[title] self.name = obj[name] self.charclass = obj[charclass] self.level = int(obj[level]) self.fb_sig_id=str(obj[fb_sig_id]) self.titles=obj[titles] self.stats=obj[stats] self.skills=obj[skills] self.weapons=obj[weapons] self.armor=obj[armor] self.vehicles=obj[vehicles] self.boosts=obj[boosts] self.lots=obj[lots] self.props=obj[props] self.put() retcode=1 except: logging.error('problem in mwProfile.sync()') finally: return retcode #mws=mwStats() #rc_mws=mws.newEntry(object.stats,thisProfile) def getDict(self): return { fb_sig_id:self.fb_sig_id, id:str(self.key().id()),key:str(self.key()), title:self.title,name:self.name, charclass:self.charclass,level:str(self.level), date:str(self.date) } def getRecord(self): return { fb_sig_id:self.fb_sig_id, id:str(self.key().id()),key:str(self.key()), title:self.title,name:self.name, charclass:self.charclass,level:str(self.level), date:str(self.date), titles:self.titles,stats:self.stats,skills:self.skills, weapons:self.weapons,armor:self.armor,vehicles:self.vehicles, boosts:self.boosts,lots:self.lots,props:self.props } --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] TheWorld Browser 3.0.7.8 finale
TheWorld Browser is compatible with Internet Explorer and it can run in most Miscrosoft Windows OSs. It has a new, powerful multi-threaded window frame, which can avoid web page being out of response. TheWorld Browser is optimized to avoid any case of out of response. In any test case, if a web page's browser window is out of response, the other windows will not be infected. With experience of TheWorld Browser serious, all code rewritten, all module rebuild, the new frame can take more effective experience. Browser --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Significant performance degredation over the last week
Brandon - That's an excellent suggestion. It presently isn't happening (no code change on my part, so it may be that google fixed the prob), but if it ever does occur, I should be able to determine whether it is an import prob. Thanks again! -Blake On Nov 2, 12:17 pm, Brandon Thomson gra...@gmail.com wrote: For a simple webapp app, even cold start should be not more than 50-100ms extra. One thing you might be affected by is slow import bug; you may want to add more logging statements to see if that is the cause. Either way try to bring it to the attention of googlers so they can look into it as there is probably nothing you can do. On Nov 1, 5:48 pm, Blake blake.commag...@gmail.com wrote: Hi - I have a relatively simple app and I've noticed significant performance degredation over the last week. Even on extremely simple pages like the about page which has the following code: class About(webapp.RequestHandler): def get(self): template_values = {} path = os.path.join(os.path.dirname(__file__), '../views/ about.html') self.response.out.write(template.render(path, template_values)) Yesterday, requests to this page were taking anywhere from 10-15 seconds to display from the time appengine first recorded the request arrival - just to verify I adding some logging and it was almost the entire time of the request before flow control was in my class. Naturally once my code was executing it finished very quickly as all it does is render a static html file. Some requests finished almost instantaneously, but consistently I ran into the enormous delay. This pattern leads me to believe that I'm being affected by the cold start phenomenon but I would expect that as I continued to hit refresh to generate logging data that all subsequent loads would be fast, but many were not. Any insights? -Blake --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Querying owned many-to-one related objects
Ahh... got around it... specified the parent in the query as Key type -rjaxin On Nov 3, 10:04 am, rjaxin rja...@gmail.com wrote: In a scenario that there is a parent persisted object that has many persisted children objects, is it possible to perform the following query on the children with jdo? Select * from childobjectclass where someval == 'something' parent == 'parentobject1' rjaxin --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] AVG 9.0 PRO Anti-Virus. With working Keys for 9 years
AVG 9.0 PRO Anti-Virus. With working Keys for 9 years AVG --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Seeking any Good Opinions / Design Pattern Input
Stephen, Thank you very much for the feedback. For the most part, I don't need/ want to be able to query within the data, but i do need to query by date to get entries. For instance, assume I am showing a google visualization for Fights Won plotted over the last 30 days. Therefore, all I would need to be able to do is to query all mwProfile objects for the past 30 days and return ALL the data (after I shape it using the python visualization api of course). The other advantage to this approach that I can see is that the data isn't that huge, so manipulating on the client-side is very easy. For instance, after plotting all my Fights Won, let's say I also wanted to plot Fights Lost on the same graph, I already have the data client-side, along with any other data I may need. It is somewhat risky though, this type of development. Success hinges upon being able to see the end result very clearly before laying down the app foundation, or one could find oneself having to recode almost everything...anyway, thanks for the input :) class mwProfile(db.Model): title=db.StringProperty() name=db.StringProperty() charclass=db.StringProperty() level=db.IntegerProperty() fb_sig_id=db.StringProperty() date=db.DateTimeProperty(auto_now_add=True) page=db.TextProperty(); def sync(self,obj): retcode=0 try: thisProfile=self self.title = obj[title] self.name = obj[name] self.charclass = obj[charclass] self.level = int(obj[level]) self.fb_sig_id=str(obj[fb_sig_id]) logging.info('made it past the first 5 static properties') self.page = simplejson.dumps(obj[page]) self.put() retcode=1 except: logging.error('problem in mwProfile.sync():'+ str (sys.exc_info()[0])) finally: return retcode def getDict(self): return { fb_sig_id:self.fb_sig_id, id:str(self.key().id()),key:str(self.key()), title:self.title,name:self.name, charclass:self.charclass,level:str(self.level), date:str(self.date) } def getRecord(self): return { fb_sig_id:self.fb_sig_id, id:str(self.key().id()),key:str(self.key()), title:self.title,name:self.name, charclass:self.charclass,level:str(self.level), date:str(self.date),page:simplejson.loads (self.page) } --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: 500 Error When Trying to appcfg.py update
I'm receiving the exact same error, I also receive the error when I try to set a default version in my google app admin console. On Nov 3, 5:22 pm, Kortina kort...@gmail.com wrote: Hi, I'm getting the following error when I try to update my app: Server: appengine.google.com. Scanning files on local disk. Initiating update. Error 500: --- begin server output --- Server Error (500) A server error has occurred. --- end server output --- I just updated the app 30 minutes ago and it worked fine, but now I get this error when I try to update. I also get an update when I try to rollback. Is there some sort of system maintenance going on preventing application updates? The error message is too generic for me to understand if there is a problem on my end. Any help would be greatly appreciated. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Datastore writes are temporarily unavailable
yes. Nothing useful out of status On Nov 3, 8:31 pm, RollingCircle e.j.hard...@gmail.com wrote: Datastore writes are temporarily unavailable. Please seehttp://code.google.com/status/appenginefor more information. 11-03 05:21PM 32.889 , application metutil. Hordes of the blighters. The status page was apparently repeating some mantra about everything being OK, despite everything being clearly Pete Tong on the App Engine datastore front. Anyone else? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Datastore writes are temporarily unavailable
Yes. No fix still, and no good status On Nov 3, 8:31 pm, RollingCircle e.j.hard...@gmail.com wrote: Datastore writes are temporarily unavailable. Please seehttp://code.google.com/status/appenginefor more information. 11-03 05:21PM 32.889 , application metutil. Hordes of the blighters. The status page was apparently repeating some mantra about everything being OK, despite everything being clearly Pete Tong on the App Engine datastore front. Anyone else? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] I am unable to update my cron.yaml
Hi, I wrote the following cron.yaml file, but it is not being updated to the server. I have updated the folder with appcfg.py update foldername. I have also tried appcfg.py update-cron, but it has failed by saying 'unknown action'. Could some one please help me with this. cron.yaml: cron: - description: update the datastrore url: /newPuddle schedule: every 1 min app.yaml: application: appid version: 1 runtime: python api_version: 1 handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico - url: /.* script: pu.py --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] 500 Error When Trying to appcfg.py update
Hi, I'm getting the following error when I try to update my app: Server: appengine.google.com. Scanning files on local disk. Initiating update. Error 500: --- begin server output --- Server Error (500) A server error has occurred. --- end server output --- I just updated the app 30 minutes ago and it worked fine, but now I get this error when I try to update. I also get an update when I try to rollback. Is there some sort of system maintenance going on preventing application updates? The error message is too generic for me to understand if there is a problem on my end. Any help would be greatly appreciated. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Flash and app engine
Hi all. I have what i think should be a straightforward question, but am struggling to find a clear answer on the web. I would very much like to begin using app engine to develop some web applications. However, my apps require flash in some places and the flash apps need to be able to interact with user data on the server. Will app engine support this? thanks for any help. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Flash and app engine
Flash apps can be made to invoke ajax requests which gae supports. If you want rtmp your sol as gae does not persist socket connections. You might be able to get around it by allowing a trusted server that does support rtmp but that is the best you can do. -Tim On Tue, Nov 3, 2009 at 12:37 AM, j to the oh no jmac...@hotmail.com wrote: Hi all. I have what i think should be a straightforward question, but am struggling to find a clear answer on the web. I would very much like to begin using app engine to develop some web applications. However, my apps require flash in some places and the flash apps need to be able to interact with user data on the server. Will app engine support this? thanks for any help. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
HI Eli Thats true there are many cases where you don't need composite indexes, as per the documentation I provided a link to. However the specific example you gave does. (Now maybe you don't actually plan to use the specific example you provided but I don't have anything else to go on) Now I did actually try it myself before posting \ and the specific indexes I mentioned get created in index.yaml. And if you run the dev_server with --require_indexes and the indexes in question are not present You get NeedIndexError: This query requires a composite index that is not defined. You must update the index.yaml file in your application root. This query needs this index: meStats properties: - name: y2009 - name: June Rgds T On Nov 4, 5:37 am, Eli eli.jo...@gmail.com wrote: I suggest you watch the IO talk where Brett Slatkin discusses Merge Joins and pre-computing ranges. http://www.youtube.com/watch?v=AgaL6NGpkB8 Watch the last half (past 34 min).. and maybe pay attention to the section that's just after (41 minutes). This implies you do not need composite indexes (or to create any new indexes beyond the default ones) for all sorts of queries if you construct your data in the right way. I will test this out tonight to provide a proof of concept. On Nov 3, 10:12 am, Tim Hoffman zutes...@gmail.com wrote: Hi On Nov 3, 10:26 pm, Eli Jones eli.jo...@gmail.com wrote: I haven't done any testing on this yet since I'd have to fill up tens of gigs of information to see real live performance numbers. I'm hoping the implicit partitioning makes it so that one doesn't need manually created indexes (just thedefault ones.) The example I showed would be a schema for storing a daily int statistic. The 'June' column entries would show the day of that month and the 'y2009' column would have the 6 value since June is the 6th month of the year. If I wanted stats for June, my select would look like this: Select * From meStats Where y2009 = 6 AND June 15 But the minute you do this you will then need an index that looks like - kind: meStats properties: - name: y2009 - name: June and so on for every year month combination where you do a comparison. I think you should have a read about how indexes are created and accessed before you try optimising something that probably doesn't need it. Note the rules from defining index dochttp://code.google.com/appengine/docs/python/datastore/queriesandinde... Other forms of queries require their indexes to be specified in index.yaml, including: * queries with multiple sort orders * queries with a sort order on keys in descending order * queries with one or more inequality filters on a property and one or more equality filters over other properties * queries with inequality filters and ancestor filters You fall into the third rule. Which as I said eariler will mean you need to manually specify in index.yaml a massive number of indexes Rgds T This would/should implicitly hit the june rows for 2009 and get the stats for every day after the 15th. You could munge around your column names and the values inserted to get different data reporting behaviour.. The main, potential value is the implicit partitioning (where you don't need to manually define a bunch of schemas up front). On 11/3/09, Tim Hoffman zutes...@gmail.com wrote: Hi Have you tried this? For starters you can't assign values to numbers. ie no matter what you do you can't assign 2009 = 'abc' You would need to use some other identifier as you mentioned and then specify something like year_2009 = db.IntegerProperty(name=2009) or something similiar. I also see a problem with this strategy with regard to index definitions. Whilst running the SDK the indexes will get created as you define data however once you are running in real google environment you will need to make sure you have already defined all possible indexes that you plan to use before you create any new data (or reindex everything), which means indexes for all years you plan to hold data for and search, and months, and combinations of the two. I am not sure this is a particularly good approach, but then I am not sure I get what you are actually doing. Have you compared the performance of lookups between the two strategies, also remembering if you are actually interested in year/ month then you are actually using composite indexes, I wonder if you will ever use the month only index (apart from comparing months with months for all years in no particular order) Rgds T On Nov 3, 12:22 am, Eli eli.jo...@gmail.com wrote: Here's something I've been wondering about Expando. Say you define an Expando model like so: class meStats(db.Expando): meNumber =
[google-appengine] Re: More than 10 applications
there is a Google guy Nick Johnson who answers these requests. (You can find him by searching the archives.) I have emailed him about expanding my app limit and will let you know what happens. Richard On Nov 2, 3:44 pm, Chris chris.slink...@gmail.com wrote: I'm looking to use Google App Engine to launch some GWT based solutions for clients. However, I can't help but see the inherent problem of running out of applications. Once I've hosted 10 applications how can I host the 11th? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Store Image in Google Apps Engine database
Hi! I try to store a image in my google app engine application. I followed this documentation: http://code.google.com/appengine/docs/python/images/usingimages.html My db.Model: class Image(db.Model): image = db.BlobProperty() name = db.StringProperty() My Form: pform action=/insertImage enctype=multipart/form-data method=post pName:br/input name=name type=text size =30/p pImage:br/input name=file type=file//p divinput type=submit value=Insert/div/form/p My insertImage class: class insertImage(webapp.RequestHandler): def post(self): name = self.request.get('name') image = self.request.get('file') setImage(name, image) self.redirect('/') def setImage(name, image): dbm = MyDbModel.Image() dbm.image = db.Blob(image) dbm.name = name dbm.put() But after I click the submit-button of my online form I get this error message: google_appengine/google/appengine/api/datastore_types.py, line 1057, in __new__ type(arg).__name__) TypeError: Blob() argument should be str instance, not unicode I also tried dbm.image = db.Blob(open(image).read()) in my setImage class. Which I found here: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#Blob But this result in this error: google_appengine/google/appengine/tools/dev_appserver.py, line 1079, in __init__ super(FakeFile, self).__init__(filename, mode, bufsize, **kwargs) IOError: [Errno 2] No such file or directory: u'MyImage.jpg' Do you have an idea what's wrong? Thanks a lot! Markus --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Significant performance degredation over the last week
Actually, read my post again - the vast majority of the time to process the request occurred prior to entering the code for the About class. Using memcache to save me a few milliseconds on rendering such a tiny page is not a priority when it's 10-15 seconds before memcache can even do a lookup. -Blake On Nov 2, 1:53 pm, William Montgomery w.k.r.montgom...@googlemail.com wrote: Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? Will. 2009/11/2 Jason C jason.a.coll...@gmail.com We have a webapp application that occasionally gets DeadlineExceededErrors on cold start (i.e., 30s!). This is a regular occurrence on our Django-based apps. Happens at the usual times: say, 6-9a PST. j On Nov 2, 2:17 pm, Brandon Thomson gra...@gmail.com wrote: For a simple webapp app, even cold start should be not more than 50-100ms extra. One thing you might be affected by is slow import bug; you may want to add more logging statements to see if that is the cause. Either way try to bring it to the attention of googlers so they can look into it as there is probably nothing you can do. On Nov 1, 5:48 pm, Blake blake.commag...@gmail.com wrote: Hi - I have a relatively simple app and I've noticed significant performance degredation over the last week. Even on extremely simple pages like the about page which has the following code: class About(webapp.RequestHandler): def get(self): template_values = {} path = os.path.join(os.path.dirname(__file__), '../views/ about.html') self.response.out.write(template.render(path, template_values)) Yesterday, requests to this page were taking anywhere from 10-15 seconds to display from the time appengine first recorded the request arrival - just to verify I adding some logging and it was almost the entire time of the request before flow control was in my class. Naturally once my code was executing it finished very quickly as all it does is render a static html file. Some requests finished almost instantaneously, but consistently I ran into the enormous delay. This pattern leads me to believe that I'm being affected by the cold start phenomenon but I would expect that as I continued to hit refresh to generate logging data that all subsequent loads would be fast, but many were not. Any insights? -Blake --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] ASK - Can we develop custom portal in Google App Engine?
Hi, I build a custom jsr168 portal using JBoss latest portlet container (not the portal) is it possible for me to deploy it in Google App Engine? Bromo --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: 500 Error When Trying to appcfg.py update
Same here! Gezim Hoxha (aka Gizmo) http://www.gizmobooks.com -- buy/sell your textbooks On Tue, Nov 3, 2009 at 7:09 PM, Silicon Dragon sdr...@gmail.com wrote: Experiencing the same issue; also found this notification: http://groups.google.com/group/google-appengine-downtime-notify/browse_thread/thread/8bdc6a55bb01d28c http://groups.google.com/group/google-appengine-downtime-notify/browse_thread/thread/8bdc6a55bb01d28c -SDr On Wed, Nov 4, 2009 at 1:30 AM, john.ra...@gmail.com john.ra...@gmail.com wrote: I'm receiving the exact same error, I also receive the error when I try to set a default version in my google app admin console. On Nov 3, 5:22 pm, Kortina kort...@gmail.com wrote: Hi, I'm getting the following error when I try to update my app: Server: appengine.google.com. Scanning files on local disk. Initiating update. Error 500: --- begin server output --- Server Error (500) A server error has occurred. --- end server output --- I just updated the app 30 minutes ago and it worked fine, but now I get this error when I try to update. I also get an update when I try to rollback. Is there some sort of system maintenance going on preventing application updates? The error message is too generic for me to understand if there is a problem on my end. Any help would be greatly appreciated. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Tragedy of the Commons, and Cold Starts
Any instance can, then static can. Or please availabilize counterexample. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Flash and app engine
Yes, the requests that flash makes are like the normal Ajax calls. You write a handler for them and return the right response. 2009/11/3 j to the oh no jmac...@hotmail.com: Hi all. I have what i think should be a straightforward question, but am struggling to find a clear answer on the web. I would very much like to begin using app engine to develop some web applications. However, my apps require flash in some places and the flash apps need to be able to interact with user data on the server. Will app engine support this? thanks for any help. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Datastore writes are temporarily unavailable
Datastore writes are temporarily unavailable. Please see http://code.google.com/status/appengine for more information. 11-03 05:21PM 32.889 , application metutil. Hordes of the blighters. The status page was apparently repeating some mantra about everything being OK, despite everything being clearly Pete Tong on the App Engine datastore front. Anyone else? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Error on login page
Hi! I'm having problem with my very simple app: I get 500 Server Error on all requests to login page: http://tasklight.appspot.com/_ah/login?continue=http://tasklight.appspot.com/ gives: === Error: Server Error The server encountered an error and could not complete your request. If the problem persists, please report your problem and mention this error message and the query that caused it. === I created login url with users.create_login_url('') and clicked it. Can someone help me with this? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Store Image in Google Apps Engine database
Have a look at http://code.google.com/p/google-app-engine-samples/ And the image examples. That worked for me. 2009/11/4 Markus pinky0...@googlemail.com: Hi! I try to store a image in my google app engine application. I followed this documentation: http://code.google.com/appengine/docs/python/images/usingimages.html My db.Model: class Image(db.Model): image = db.BlobProperty() name = db.StringProperty() My Form: pform action=/insertImage enctype=multipart/form-data method=post pName:br/input name=name type=text size =30/p pImage:br/input name=file type=file//p divinput type=submit value=Insert/div/form/p My insertImage class: class insertImage(webapp.RequestHandler): def post(self): name = self.request.get('name') image = self.request.get('file') setImage(name, image) self.redirect('/') def setImage(name, image): dbm = MyDbModel.Image() dbm.image = db.Blob(image) dbm.name = name dbm.put() But after I click the submit-button of my online form I get this error message: google_appengine/google/appengine/api/datastore_types.py, line 1057, in __new__ type(arg).__name__) TypeError: Blob() argument should be str instance, not unicode I also tried dbm.image = db.Blob(open(image).read()) in my setImage class. Which I found here: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#Blob But this result in this error: google_appengine/google/appengine/tools/dev_appserver.py, line 1079, in __init__ super(FakeFile, self).__init__(filename, mode, bufsize, **kwargs) IOError: [Errno 2] No such file or directory: u'MyImage.jpg' Do you have an idea what's wrong? Thanks a lot! Markus --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Domain error after 11 days working -- Please help
Domain: www.patsnet.com Google App: patssoccer.appspot.com I have completed to verify domain (patsnet.com) ownership and www.patsnet.com was succesfully pointed to patssoccer.appspot.com and was up and running since 10/22. Now today (11/02/09) www.patnets.com shows: Google Error Not Found The requested URL / was not found on this server. I used custom URL: CNAME record to verify ownership by using: www ghs.google.com What is going on ?? Please help ASAP .. I really appreciate . Dennis --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
yes, I guess the inequality borks it.. I would have to pre-compute day ranges.. This specific technique would probably be most useful for collecting hit stats.. where each individual hit was inserted into the Expando table. So along with these columns (for june 2009): Number,June,y2009 You would also have (maybe): Yahoo,Hour And it would look like this for an entry from the 15th: Number,June,y2009,Hour,Yahoo 389, 15, 6, 1400, 1 so.. to get the hit count from Yahoo on June 15th 2009 you would do: Select * from meStats Where y2009 = 6 AND June = 15 AND Yahoo = 1 Now, I could go all nutty and precompute date ranges to insert along with the entries as well... but it might not be too much work to just grab all the June days and pull the ones you wanted. (This is just the first usage example that comes to mind. This row naming method could be used for all sorts of set intersection stuff, and would cut down on insert times due to the fact that it should partition out the indexes when dealing with humongous datasets). I already figured out the nutty way I'd use exec to run the variable put method (tested and works on my dev and live appengine).. I just hacked this out real fast to see if I could get it to work.. num,monthStr,dayNum etc... are all variables fed into the function that builds and execs this meStr string (I didn't incorporate the Yahoo and Hour parts): meStr = meEntity = meStats(meNumber = + str(num) + , + monthStr + = + str(dayNum) + , + yearStr + = + str(monthNum) + ) \nmeEntity.put()\n exec meStr Anyway, this was just a side thought I had while wondering what the point of Expando was.. since it's so unstructured.. I couldn't imagine why someone would want such an undependable datasource.. but, I can see this method as being highly useful in a number of cases.. (again, the main ultimate benefit I see is reducing insert times). On Nov 3, 5:57 pm, Tim Hoffman zutes...@gmail.com wrote: HI Eli Thats true there are many cases where you don't need composite indexes, as per the documentation I provided a link to. However the specific example you gave does. (Now maybe you don't actually plan to use the specific example you provided but I don't have anything else to go on) Now I did actually try it myself before posting \ and the specific indexes I mentioned get created in index.yaml. And if you run the dev_server with --require_indexes and the indexes in question are not present You get NeedIndexError: This query requires a composite index that is not defined. You must update the index.yaml file in your application root. This query needs this index: meStats properties: - name: y2009 - name: June Rgds T On Nov 4, 5:37 am, Eli eli.jo...@gmail.com wrote: I suggest you watch the IO talk where Brett Slatkin discusses Merge Joins and pre-computing ranges. http://www.youtube.com/watch?v=AgaL6NGpkB8 Watch the last half (past 34 min).. and maybe pay attention to the section that's just after (41 minutes). This implies you do not need composite indexes (or to create any new indexes beyond the default ones) for all sorts of queries if you construct your data in the right way. I will test this out tonight to provide a proof of concept. On Nov 3, 10:12 am, Tim Hoffman zutes...@gmail.com wrote: Hi On Nov 3, 10:26 pm, Eli Jones eli.jo...@gmail.com wrote: I haven't done any testing on this yet since I'd have to fill up tens of gigs of information to see real live performance numbers. I'm hoping the implicit partitioning makes it so that one doesn't need manually created indexes (just thedefault ones.) The example I showed would be a schema for storing a daily int statistic. The 'June' column entries would show the day of that month and the 'y2009' column would have the 6 value since June is the 6th month of the year. If I wanted stats for June, my select would look like this: Select * From meStats Where y2009 = 6 AND June 15 But the minute you do this you will then need an index that looks like - kind: meStats properties: - name: y2009 - name: June and so on for every year month combination where you do a comparison. I think you should have a read about how indexes are created and accessed before you try optimising something that probably doesn't need it. Note the rules from defining index dochttp://code.google.com/appengine/docs/python/datastore/queriesandinde... Other forms of queries require their indexes to be specified in index.yaml, including: * queries with multiple sort orders * queries with a sort order on keys in descending order * queries with one or more inequality filters on a property and one or more equality filters over other properties * queries with inequality filters and ancestor filters You fall into the third rule. Which as I said eariler
[google-appengine] Re: Seeking any Good Opinions / Design Pattern Input
With App Engine, I don't think you can ask Here is my data, what shape should it be? You could ask this question if this were a relational db because it has the freedom to perform any kind of query: full table scans, joins, aggregates etc. As App Engine is very limited in the kinds of queries it can run you have to shape your data ahead of time to allow those queries. Therefore you will have to think of all the queries you want to run before you can know how to arrange your data into Model classes. The most basic model would be: class MafiaWars(db.Model): json = db.TextProperty() Keyed on user_id, this would be more efficient in storage space and query time than your examples: multiple entities or multiple properties on a single entity; but you could only ask the question give me all the data for user X. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Expando and Index partitioning
I suggest you watch the IO talk where Brett Slatkin discusses Merge Joins and pre-computing ranges. http://www.youtube.com/watch?v=AgaL6NGpkB8 Watch the last half (past 34 min).. and maybe pay attention to the section that's just after (41 minutes). This implies you do not need composite indexes (or to create any new indexes beyond the default ones) for all sorts of queries if you construct your data in the right way. I will test this out tonight to provide a proof of concept. On Nov 3, 10:12 am, Tim Hoffman zutes...@gmail.com wrote: Hi On Nov 3, 10:26 pm, Eli Jones eli.jo...@gmail.com wrote: I haven't done any testing on this yet since I'd have to fill up tens of gigs of information to see real live performance numbers. I'm hoping the implicit partitioning makes it so that one doesn't need manually created indexes (just thedefault ones.) The example I showed would be a schema for storing a daily int statistic. The 'June' column entries would show the day of that month and the 'y2009' column would have the 6 value since June is the 6th month of the year. If I wanted stats for June, my select would look like this: Select * From meStats Where y2009 = 6 AND June 15 But the minute you do this you will then need an index that looks like - kind: meStats properties: - name: y2009 - name: June and so on for every year month combination where you do a comparison. I think you should have a read about how indexes are created and accessed before you try optimising something that probably doesn't need it. Note the rules from defining index dochttp://code.google.com/appengine/docs/python/datastore/queriesandinde... Other forms of queries require their indexes to be specified in index.yaml, including: * queries with multiple sort orders * queries with a sort order on keys in descending order * queries with one or more inequality filters on a property and one or more equality filters over other properties * queries with inequality filters and ancestor filters You fall into the third rule. Which as I said eariler will mean you need to manually specify in index.yaml a massive number of indexes Rgds T This would/should implicitly hit the june rows for 2009 and get the stats for every day after the 15th. You could munge around your column names and the values inserted to get different data reporting behaviour.. The main, potential value is the implicit partitioning (where you don't need to manually define a bunch of schemas up front). On 11/3/09, Tim Hoffman zutes...@gmail.com wrote: Hi Have you tried this? For starters you can't assign values to numbers. ie no matter what you do you can't assign 2009 = 'abc' You would need to use some other identifier as you mentioned and then specify something like year_2009 = db.IntegerProperty(name=2009) or something similiar. I also see a problem with this strategy with regard to index definitions. Whilst running the SDK the indexes will get created as you define data however once you are running in real google environment you will need to make sure you have already defined all possible indexes that you plan to use before you create any new data (or reindex everything), which means indexes for all years you plan to hold data for and search, and months, and combinations of the two. I am not sure this is a particularly good approach, but then I am not sure I get what you are actually doing. Have you compared the performance of lookups between the two strategies, also remembering if you are actually interested in year/ month then you are actually using composite indexes, I wonder if you will ever use the month only index (apart from comparing months with months for all years in no particular order) Rgds T On Nov 3, 12:22 am, Eli eli.jo...@gmail.com wrote: Here's something I've been wondering about Expando. Say you define an Expando model like so: class meStats(db.Expando): meNumber = db.IntegerProperty(required=True) And, then you begin populating it like so: meEntity1 = meStats(meNumber = 200, June = 14, 2009 = 6) meEntity.put() meEntity2 = meStats(meNumber = 381, July = 21, 2009 = 7) meEntity2.put() ..and so on. The July column only has indexes for entities that have July defined.. correct? So, in effect, I am creating a partitioned index for a table that can grow indefinitely.. and each time I get to a new year/month combo, I am inserting into new indexes..? (instead of inserting into an ever increasing, monolithic Month column index..) Mainly, I'm packing the pertinent information into the column names and column values (instead of
[google-appengine] Re: 500 Error When Trying to appcfg.py update
Experiencing the same issue; also found this notification: http://groups.google.com/group/google-appengine-downtime-notify/browse_thread/thread/8bdc6a55bb01d28c http://groups.google.com/group/google-appengine-downtime-notify/browse_thread/thread/8bdc6a55bb01d28c -SDr On Wed, Nov 4, 2009 at 1:30 AM, john.ra...@gmail.com john.ra...@gmail.comwrote: I'm receiving the exact same error, I also receive the error when I try to set a default version in my google app admin console. On Nov 3, 5:22 pm, Kortina kort...@gmail.com wrote: Hi, I'm getting the following error when I try to update my app: Server: appengine.google.com. Scanning files on local disk. Initiating update. Error 500: --- begin server output --- Server Error (500) A server error has occurred. --- end server output --- I just updated the app 30 minutes ago and it worked fine, but now I get this error when I try to update. I also get an update when I try to rollback. Is there some sort of system maintenance going on preventing application updates? The error message is too generic for me to understand if there is a problem on my end. Any help would be greatly appreciated. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Seeking any Good Opinions / Design Pattern Input
Just thought I would seek out any good opinions before I proceed with my data-storage plan. Please forgive the length of this post, but I wanted to include enough data example for you to see exactly what i'm trying to do, so that you can give me good feedback. On the UI side, I have developed a small 'bookmarklet' that injects itself into the game Mafia Wars and parses the profile page into JSON. An example of the JSON is included below so you can see a full data example...Essentially, the structure of the JSON object is as follows: {title, name, charclass, level, titles[{t,v,o}], stats[{s,v}], skills [{s,v}], weapons[{i,c}], armor[{i,c}], vehicles[{i,c}], lots [{i,c}],properties[{i,c}]} Now one approach is to create objects for titles, stats, skills and all the other 'object arrays', but then that would mean everytime i capture a profile, I would have as many as 400-500 puts to the DB or more to save each item. Therefore, I was thinking on maybe just storing each value as a python array, in a blob field...in which case, my model would look something like this: class mwProfile(db.Model): title=db.StringProperty() name=db.StringProperty() charclass=db.StringProperty() level=db.IntegerProperty() fb_sig_id=db.StringProperty() date=db.DateTimeProperty(auto_now_add=True) titles=db.BlobProperty() stats=db.BlobProperty() skills=db.BlobProperty() weapons=db.BlobProperty() armor=db.BlobProperty() vehicles=db.BlobProperty() lots=db.BlobProperty() properties=db.BlobProperty() so when the data comes into the handler, the handler would be able to create a new instance of mwProfile, set the appropriate values from the title, name, charclass, level and fb_sig_id, and then just create python lists of objects and store each list in the blob property... any suggestions? see the data below... {title:Brigadir,name:Nolybab Praetorius,charclass:Maniac,level:242,fb_sig_id:123456789, titles:[{t:Skilled Boss,v:26,o:1},{t:Boss,v:25,o:2}, {t:Master Underboss,v:24,o:3},{t:Skilled Underboss,v: 23,o:4},{t:Brigadir,v:52,o:5},{t:Umelyj Boets,v:50,o: 6},{t:Underboss,v:22,o:7},{t:Master Consigliere,v:21,o: 8},{t:Skilled Consigliere,v:20,o:9},{t:Boets,v:49,o: 10},{t:Matyoryj Baklan,v:48,o:11},{t:Consigliere,v: 19,o:12},{t:Umelyj Baklan,v:47,o:13},{t:Master Capo,v: 18,o:14},{t:Baklan,v:46,o:15},{t:Skilled Capo,v:17,o: 16},{t:Capo,v:16,o:17},{t:El Soldado Principal,v:30,o: 18},{t:El Soldado Experto,v:29,o:19},{t:El Soldado,v: 28,o:20},{t:Master Hitman,v:15,o:21},{t:Skilled Hitman,v:14,o:22},{t:Hitman,v:13,o:23},{t:Master Enforcer,v:12,o:24},{t:Skilled Enforcer,v:11,o:25}, {t:Enforcer,v:10,o:26},{t:Master Soldier,v:9,o:27}, {t:Skilled Soldier,v:8,o:28},{t:Master Associate,v:6,o: 29},{t:Skilled Associate,v:5,o:30},{t:Master Street Thug,v:3,o:31},{t:Skilled Street Thug,v:2,o:32}, {t:Soldier,v:7,o:33},{t:Associate,v:4,o:34}, {t:Street Thug,v:1,o:35}], stats:[{s:Jobs Completed,v:4988},{s:Job Assists,v:2995}, {s:Most consecutive days doing jobs,v:67},{s:Most jobs done in one day,v:227},{s:Fights Won,v:21291},{s:Fights Lost,v:4488},{s:Fights Won in Cuba,v:4941},{s:Death,v: 212},{s:Mobsters Iced,v:1721},{s:Mobsters Whacked,v:306}, {s:Hitlist Kills,v:7},{s:Longest Hitlist Survival,v:2}, {s:Successful Heist,v:1717},{s:Times Robbed,v:442}, {s:Gifts sent,v:16818},{s:Mega Casinos Sold,v:50}, {s:Wars Won,v:21},{s:Wars Lost,v:6},{s:Times Betrayed by Mafia,v:0},{s:War Assists,v:176}], skills:[{s:Attack,v:477},{s:Defense,v:501}, {s:Health,v:273},{s:Energy,v:629},{s:Stamina,v:88}], weapons:[{i:Crowbar,c:1},{i:Sawed-off Shotgun,c:10}, {i:Baseball Bat,c:1},{i:Machine Pistol,c:86},{i:.45 Cal Pistol,c:5},{i:Grenade,c:10},{i:Tommy Gun,c:11}, {i:Chain Gun,c:20},{i:Machete,c:2},{i:Lead Pipe,c: 18},{i:Hacksaw,c:1},{i:Hatchet,c:2},{i:RAS-29,c:26}, {i:Bonus weapon,c:10},{i:Dubina,c:6},{i:Pistolet Besshumnyj,c:12},{i:Boevoy Nozh,c:10},{i:Gadyuka-5 Pistol,c:14},{i:.308 Sniper Rifle,c:4},{i:Bazooka,c:8}, {i:Shturmovaya Vintovka,c:8},{i:RAS-28 SMG,c:3}, {i:Revolver,c:1},{i:.45 ACP Pistol,c:8},{i:Grach,c: 3},{i:.22 Pistol,c:511},{i:Grenade Launcher,c:81},{i:. 45 Revolver,c:167},{i:9mm Semi-Automatic,c:93}, {i:Butterfly Knife,c:544},{i:IZH-35m,c:1},{i:Brass Knuckles,c:592},{i:Claymore,c:239},{i:Tactical Shotgun,c:121},{i:PPSH 41 Submachine gun,c:4},{i:C4,c: 175},{i:Firebomb,c:102},{i:Automatic Rifle,c:154}, {i:Semi-Automatic Shotgun,c:66},{i:.50 Caliber Rifle,c:53}, {i:RPG Launcher,c:67},{i:Napalm,c:41},{i:Machine Gun Kelly's Gun,c:5},{i:Pretty Boy Floyd's .45,c:10},{i:Garza 9,c:59},{i:Baby Face Nelson's .351,c:3},{i:Ma Barker's Machine Gun,c:4},{i:M16A1,c:154},{i:Dillinger's Wooden Gun,c:1},{i:RA-92,c:36},{i:Ru-38 Pistol,c:78}, {i:Cane Knife,c:95},{i:TNT,c:178},{i:Gaff hook,c: 194},{i:Bookie's Holdout Pistol,c:94},{i:BA-12 Assault Rifle,c:101},{i:Canonazo,c:240},{i:Sodium Pentothal,c: 66},{i:Para 322,c:57},{i:Pro's 2 Iron,c:3},{i:Russian Bear,c:1},{i:Siberian Tiger,c:4},{i:Tora Assault
[google-appengine] Re: Tragedy of the Commons, and Cold Starts
I think paying to keep the instances warm is a great idea! Cheers, Scott --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Datastore writes are temporarily unavailable
Hi all, Apologies for the delay, the status site has been updated to mention this planned maintenance. Thank you, Jeff P.S. As noted in the following blog post, we also plan maintenance on December 1st. http://googleappengine.blogspot.com/2009/09/migration-to-better-datastore.html On Nov 3, 5:42 pm, AS stripe...@gmail.com wrote: Yes. No fix still, and no good status On Nov 3, 8:31 pm, RollingCircle e.j.hard...@gmail.com wrote: Datastore writes are temporarily unavailable. Please seehttp://code.google.com/status/appengineformore information. 11-03 05:21PM 32.889 , application metutil. Hordes of the blighters. The status page was apparently repeating some mantra about everything being OK, despite everything being clearly Pete Tong on the App Engine datastore front. Anyone else? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Permission to view, which way is more efficient?
Hi The app I am about to build is going to have some kind of profile page for each user. The user will then be able to select other users that is able to view his/her profile. (Like facebook, I guess) My question is, how should I store these permissions? Each user will most likely be giving permission to under 20 other users. Solution #1: Have one model looking something like this: viewer =user.id can_view = user.id And then simply look there to see if one user can view the other users profile. Solution #2: Since it is most likely be less than 20 users per user, then maybe one could just store it as CSV or a tuple, or something along with the users profile. I am thinking this wont be good for the (freakish) users that will have 200 users with permission, but would it be faster that solution #1? As that first model would eventually be huge, but does that matter on GAE? This is my first app, so I am still thinking like I am developing for en RDBM backend so that is why I am asking here. So to recap. 1st solution is more elegant in term of scaling permissions per user, but creates a huge datapile. The other solution solves this, but creates problems for the few users that will have more than normal amount of permitted friends Of course if you have an even better solution, then by all means, share it :) Many thanks in advance. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: frame/object control with login
How do you make sure that there is no impression of being phished? I would not trust such a construct and leave the site. 2009/11/2 reyelts reye...@gmail.com: I apologize if I'm posting to the wrong place, I don't know if this is a basic HTML question, a Python question, a GAE question, or some combination of the set... Since we can't have much impact on the use login window for Google App Engine (ie to change the language or add an image), I'm looking at embedding the login page, like so: from google.appengine.ext import webapp from google.appengine.api import users class main(webapp.RequestHandler): def get(self): user = users.get_current_user() if user == None: self.response.out.write('html\nbody\n') self.response.out.write('pMy intro text/p\n') self.response.out.write('hr\n') self.response.out.write('object\n') self.response.out.write(' data=' + users.create_login_url (self.request.uri) + '\n') self.response.out.write(' type=text/html\n') self.response.out.write(' width=100% height=50%\n') self.response.out.write('/object') self.response.out.write('hr\n') self.response.out.write('/body\n/html\n') else: self.response.out.write('html\nbody\n') self.response.out.write('p' + user.nickname() + 'is logged in!/p\n') self.response.out.write('/body\n/html\n') This works fine: I get My intro text at the top of the window followed by a pane with the login. However, when I login, the result (user is logged in) is written to the pane where the login occurred, vs. replacing the whole window. I tried this with the older iframe, and get the same result. Is there a way to re-take over the complete window (ie make the frame I created go away) on the redirect? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Getting error while running the Restlets in GAE
I'm using restlet to provide rest web service to my app enngine app and do so without any problems. So what you are doing is definitly possbile. Are you using reslet 2.0? that's the app engine version. I just used the first resource tutorial to get going and didn't do anything special to make it work. http://www.restlet.org/documentation/2.0/firstResource Good Luck On Oct 29, 4:09 am, Saurabh S ggtestlo...@gmail.com wrote: hi, I have created an application to test the restlets in GAE. The tutorial is defined in the following url:http://wiki.restlet.org/docs_1.2/13-restlet/275-restlet/252-restlet.html. I have included the jars and deployed it to the App Engine. When i try to run the application I am getting following error: Error: Server Error The server encountered an error and could not complete your request. If the problem persists, please report your problem and mention this error message and the query that caused it. Also, at console, I am getting that the class i have created are not a javax.servlet.Servlet. Can any one tell me where i am getting wrong. 1. Has anyone tried working on the restlets? Please let me know if there is any specific care i need to take while creating the application. --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] Re: Significant performance degredation over the last week
HI Blake The strategy I have taken (and this works most of the time) is in my main I import almost nothing except the bare minimum of app engine apis import logging logging.getLogger().setLevel(logging.DEBUG) import os, sys from google.appengine.ext.webapp import Request,RequestHandler, Response from google.appengine.api import users from google.appengine.api import memcache from google.appengine.runtime import DeadlineExceededError from google.appengine.ext.webapp.util import run_wsgi_app Thats it, Then in main I try and serve the page from memcache for anon users, if the page isn't present I then start my imports for the full application stack. I have found that if the page in question is in memcahce I never get the DeadLineExceededError, when they are occuring. and I know they are occuring, If a logged user at tries at the same time (they never get a cached page ) I am getting DeadLineExceededErrors. This behaviour is very consistent when we get hit with a long period of slow instance spin ups which result in deadlines exceeded. I am not using Django or webapp but my typical cold start time is around 4sec. So I am experiencing a bit of grief too. But almost never for a cached page. (Except when the system gets so bad that even static handlers fail with DeadLineExceeded) I am not sure how applicable this approach is for other app stacks. Rgds T On Nov 4, 2:02 am, Blake blake.commag...@gmail.com wrote: Actually, read my post again - the vast majority of the time to process the request occurred prior to entering the code for the About class. Using memcache to save me a few milliseconds on rendering such a tiny page is not a priority when it's 10-15 seconds before memcache can even do a lookup. -Blake On Nov 2, 1:53 pm, William Montgomery w.k.r.montgom...@googlemail.com wrote: Also for a static page such as about, does it not make sense to cache the rendered template in Memcache, to save the processing? Will. 2009/11/2 Jason C jason.a.coll...@gmail.com We have a webapp application that occasionally gets DeadlineExceededErrors on cold start (i.e., 30s!). This is a regular occurrence on our Django-based apps. Happens at the usual times: say, 6-9a PST. j On Nov 2, 2:17 pm, Brandon Thomson gra...@gmail.com wrote: For a simple webapp app, even cold start should be not more than 50-100ms extra. One thing you might be affected by is slow import bug; you may want to add more logging statements to see if that is the cause. Either way try to bring it to the attention of googlers so they can look into it as there is probably nothing you can do. On Nov 1, 5:48 pm, Blake blake.commag...@gmail.com wrote: Hi - I have a relatively simple app and I've noticed significant performance degredation over the last week. Even on extremely simple pages like the about page which has the following code: class About(webapp.RequestHandler): def get(self): template_values = {} path = os.path.join(os.path.dirname(__file__), '../views/ about.html') self.response.out.write(template.render(path, template_values)) Yesterday, requests to this page were taking anywhere from 10-15 seconds to display from the time appengine first recorded the request arrival - just to verify I adding some logging and it was almost the entire time of the request before flow control was in my class. Naturally once my code was executing it finished very quickly as all it does is render a static html file. Some requests finished almost instantaneously, but consistently I ran into the enormous delay. This pattern leads me to believe that I'm being affected by the cold start phenomenon but I would expect that as I continued to hit refresh to generate logging data that all subsequent loads would be fast, but many were not. Any insights? -Blake --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---
[google-appengine] frame/object control with login
I apologize if I'm posting to the wrong place, I don't know if this is a basic HTML question, a Python question, a GAE question, or some combination of the set... Since we can't have much impact on the use login window for Google App Engine (ie to change the language or add an image), I'm looking at embedding the login page, like so: from google.appengine.extimport webapp from google.appengine.apiimport users class main(webapp.RequestHandler): def get(self): user = users.get_current_user() if user == None: self.response.out.write('html\nbody\n') self.response.out.write('pMy intro text/p\n') self.response.out.write('hr\n') self.response.out.write('object\n') self.response.out.write(' data=' + users.create_login_url (self.request.uri) + '\n') self.response.out.write(' type=text/html\n') self.response.out.write(' width=100% height=50%\n') self.response.out.write('/object') self.response.out.write('hr\n') self.response.out.write('/body\n/html\n') else: self.response.out.write('html\nbody\n') self.response.out.write('p' + user.nickname() + 'is logged in!/p\n') self.response.out.write('/body\n/html\n') This works fine: I get My intro text at the top of the window followed by a pane with the login. However, when I login, the result (user is logged in) is written to the pane where the login occurred, vs. replacing the whole window. I tried this with the older iframe, and get the same result. Is there a way to re-take over the complete window (ie make the frame I created go away) on the redirect? --~--~-~--~~~---~--~~ 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-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~--~~~~--~~--~--~---