org.datanucleus.transaction.Transaction rollback on Google App Engine

1 view
Skip to first unread message

Rodrigo Kossmann via StackOverflow

unread,
Oct 1, 2012, 10:06:57 AM10/1/12
to google-appengin...@googlegroups.com

I am facing a serious error in our application on Google App Engine.

When i do this:

CompanyUser.validate("email", email);
    CompanyUser.validate("password", password, password);
    Validator.checkValidation();

    CompanyUser user;

    try {
        user = company.getUserByEmail(email);

        //(user.getPassword() == "") se o usuário administrador resetar a senha, alterar o e-mail ou cadastrar um novo usuário
        //(user.isWaitingConfirmation()) nos mesmos casos acima e mais quando o usuário alterar seu próprio e-mail ou o usuário administrador se cadastrar (cadastro na home do site)
        if(Tools.isEmptyString(user.getPassword()) || user.isWaitingConfirmation()) {
            if(user.getLastAccessDate() == null)    //Se for usuário novo
                throw new AuthenticationException("Seu usuário encontra-se bloqueado.<br />Para ativar seu acesso ao portal, acesse seu e-mail e siga as instruções.");
            else
                throw new AuthenticationException("Seu usuário encontra-se bloqueado.<br />Para reativar seu acesso ao portal, acesse seu e-mail e siga as instruções.");
        }

        byte[] bDigest = user.getPasswordBytes();
        byte[] bSalt = user.getPasswordSaltBytes();
        byte[] proposedDigest = user.getHash(password, bSalt);

        if (Arrays.equals(proposedDigest, bDigest)) {
            try{
                user.setLastAccessDate(Tools.getCurrentTime());
                company.saveDetached();
            } catch (DeadlineExceededException e) {
                Tools.sendMail("ERRO Severidade média: Não esta salvando ultimo acesso de Usuario", "ERRO: Não esta salvando ultimo acesso do Usuario " + user.getEmail() + " da empresa " + user.getCompany().getName()+ "" +
                        "Objeto esta com transação aberta.", Tools.getChaintSupportEmail());
            }
            return user;
        }

    } catch (ObjectNotFoundException e) {
        user = null;
    }

    throw new AuthenticationException("Usuário/Senha não conferem");

public Object saveDetached() throws InvalidFieldsValueException {

    if(IdModel.getErrorList().isEmpty() == false) {
        Vector<ValidatorError> el = IdModel.getErrorList();
        Validator.clearError();
        throw new InvalidFieldsValueException(el);
    }

    return  PersistenceManager.saveDetached(this, true);

}

public static Object saveDetached(Object object, boolean detach) {
    Object ob = null;
    String msg ="";
    javax.jdo.PersistenceManager pm = getPM();
    pm.setDetachAllOnCommit(detach);

    Transaction t = pm.currentTransaction();
    try {
        t.begin();
        ob = pm.makePersistent(object);
        t.commit();
    } catch (Exception e) {
        String[] fieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(object, pm);
        for(String s:fieldNames) {
            msg = msg.concat(s+";\n");
        }

    } finally {
        String[] fieldNames;
        if (t.isActive()) {
            fieldNames = NucleusJDOHelper.getDetachedObjectLoadedFields(object, pm);
            msg = msg+"NucleusJDOHelper.getDetachedObjectLoadedFields";
            for (String s : fieldNames) {
                msg = msg.concat(s + ";\n");
            }
            Tools.getLogger().warning(msg);
            t.rollback();
        }
        pm.close();
    }
    return ob;
}

This happens:

201.86.195.206 - - [24/Sep/2012:14:24:48 -0700] "GET / HTTP/1.1" 500 0 - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" "tci.chainit.com.br" ms=60020 cpu_ms=22858 exit_code=104 instance=00c61b117c6e51b4aec6d2e4089516b479c2a0 E2012-09-24 18:24:47.974 org.datanucleus.transaction.Transaction rollback: Operation rollback failed on resource: org.datanucleus.store.appengine.DatastoreXAResource@2d659, error code UNKNOWN and transaction: [DataNucleus Transaction, ID=Xid= W2012-09-24 18:24:48.375 Error for / com.google.apphosting.runtime.HardDeadlineExceededError: This request (b08d8999601781ee) started at 2012/09/24 21:23:48.426 UTC and was still executing at 2012/09/24 21:24:48.373 UTC. at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037) at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326) at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:263) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:96) at com.google.appengine.tools.development.TimedFuture.get(TimedFuture.java:41) at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:63) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90) at com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:145) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90) at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72) at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33) at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:113) at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:110) at com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:31) at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:110) at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:94) at com.google.apphosting.runtime.jetty.DatastoreSessionStore.saveSession(DatastoreSessionStore.java:94) at com.google.apphosting.runtime.jetty.SessionManager$AppEngineSession.save(SessionManager.java:167) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:41) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:452) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:459) at com.google.tracing.TraceContext.runInContext(TraceContext.java:701) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:336) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:328) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:456) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) at java.lang.Thread.run(Thread.java:679) C2012-09-24 18:24:48.376 Uncaught exception from servlet com.google.apphosting.runtime.HardDeadlineExceededError: This request (b08d8999601781ee) started at 2012/09/24 21:23:48.426 UTC and was still executing at 2012/09/24 21:24:48.373 UTC. at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037) at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326) at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:263) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:96) at com.google.appengine.tools.development.TimedFuture.get(TimedFuture.java:41) at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:63) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90) at com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:145) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90) at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72) at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33) at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:113) at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:110) at com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:31) at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:110) at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:94) at com.google.apphosting.runtime.jetty.DatastoreSessionStore.saveSession(DatastoreSessionStore.java:94) at com.google.apphosting.runtime.jetty.SessionManager$AppEngineSession.save(SessionManager.java:167) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:41) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:452) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:459) at com.google.tracing.TraceContext.runInContext(TraceContext.java:701) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:336) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:328) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:456) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) at java.lang.Thread.run(Thread.java:679) W2012-09-24 18:24:48.427

A problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may be throwing exceptions during the initialization of your application. (Error code 104)

It seems, to me, the rollback operation is not finishing in the 60´s second wich each request has to ends and the roolback operation is canceled. In this way the object ends in this a state that we cant write on it.

This problems seems to me very serious because the user object end in this "unchangeble" state and that could not be fixed by its own, netheir by the JDO our Datanucleous.

Thanks for any Help.



Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/12674796/org-datanucleus-transaction-transaction-rollback-on-google-app-engine
Reply all
Reply to author
Forward
0 new messages