[infinispan-dev] stale persisted data?

Scott Marlow smarlow at redhat.com
Fri May 11 08:32:42 EDT 2012


On 05/11/2012 05:09 AM, Ales Justin wrote:
> Changing the topic as I have more info, and found that the problem is elsewhere.
>
> First -- ClassResolver used does use SML, not not plain ML.
> Stack trace was somehow misleading.
> So, we're fine there, no false config used.
>
> But, this is what I could find now.
>
> This is my test (see below) - JPA over JDO over DataNucleus over GAE over CapeDwarf (long chain I know :-))
> As you can see, I do cleanup afterwards, but ...
>
> I run the same test twice, via ARQ, where I leave the name generation to ARQ:
>
> 10:49:08,684 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "e9b7626a-361c-417d-80d5-b9e46af09f48.war"
> 10:49:10,466 INFO  [org.jboss.as.capedwarf.deployment.CapedwarfInitializationProcessor] (MSC service thread 1-4) Found GAE / CapeDwarf deployment: deployment "e9b7626a-361c-417d-80d5-b9e46af09f48.war"
>
> 2nd run:
>
> 10:51:20,686 INFO  [org.jboss.as.server] (management-handler-thread - 5) JBAS018559: Deployed "6de03e61-ceb9-49d7-ad48-0f9edcc150ce.war"
>
> Caused by: org.jboss.modules.ModuleNotFoundException: deployment.e9b7626a-361c-417d-80d5-b9e46af09f48.war:main
> 	at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:206) [jboss-modules.jar:1.1.2.GA]
> 	at org.jboss.marshalling.ModularClassResolver.resolveClass(ModularClassResolver.java:106)
>
>
> As you can see, it tries to load some data from 1st deployment / test.
> But since that's already undeployed, it's not found.
>
> Shouldn't that JPA delete in finally block clean all stale data?

I assume you mean from the first test run.  In the second test run that 
fails, we won't hit the finally block (since the run() method is 
throwing an exception before we hit the try block).

>
> Trying to reproduce this now with smaller dep chain. :-)
>
> ---

Does this method run in an active JTA transaction?  I assume yes but 
wanted to verify (could also be using an extended persistence context 
for all I know ;).

What else is the run() doing?  Does it run the passed EMAction in a 
different thread?  I hope not, since the EM is not thread safe.

Finally, the finally block should be changed to use em.remove(entity), 
since the current code will not find the row that your trying to delete 
(the entity probably didn't get written to the database yet since the 
JTA tx is still active).

>
>      public void testSaveAndQuery() throws Throwable {
>          final Client client = new Client();
>          EMAction<Long>  ema1 = new EMAction<Long>() {
>              public Long go(EntityManager em) throws Throwable {
>                  client.setUsername("alesj");
>                  client.setPassword("password");
>                  client.setEmail("aj at jboss.com");
>                  em.persist(client);
>                  return client.getId();
>              }
>          };
>          run(ema1);
>          try {
>              final Long id = client.getId();
>              Assert.assertNotNull("Null client id", id);
>
>              EMAction<Client>  ema2 = new EMAction<Client>() {
>                  public Client go(EntityManager em) throws Throwable {
>                      Query q = em.createQuery("select from Client c where c.username = :username");
>                      q.setParameter("username", "alesj");
>                      @SuppressWarnings("unchecked")
>                      List<Client>  clients = q.getResultList();
>                      return (clients.isEmpty()) ? null : clients.get(0);
>                  }
>              };
>              Client c = run(ema2, false);
>              Assert.assertNotNull(c);
>              Assert.assertEquals(id, c.getId());
>              Assert.assertEquals("alesj", c.getUsername());
>              Assert.assertEquals("password", c.getPassword());
>
>              EMAction<Client>  ema3 = new EMAction<Client>() {
>                  public Client go(EntityManager em) throws Throwable {
>                      return em.find(Client.class, id);
>                  }
>              };
>              c = run(ema3, false);
>              Assert.assertNotNull(c);
>              Assert.assertEquals(id, c.getId());
>              Assert.assertEquals("alesj", c.getUsername());
>              Assert.assertEquals("password", c.getPassword());
>          } finally {
>              EMAction<Integer>  delete = new EMAction<Integer>() {
>                  public Integer go(EntityManager em) throws Throwable {
>                      Query query = em.createQuery("delete from Client c where c.id = :id");
>                      query.setParameter("id", client.getId());
>                      return query.executeUpdate();
>                  }
>              };
>              Assert.assertTrue(1 == run(delete));
>          }
>      }
>
>
>>> The details of the query module are a little out of my realm of
>>> experience.  I'm CC'ing infinispan-dev, to open up the larger discussion
>>> to classloading and compatibility with modular environments.
>>>
>>> Off the top of my head, it seems like you need a custom
>>> KeyTransformationHandler that can resolve classes using a ModuleLoader
>>> (i.e. module ID + class name).  Thoughts?
>>
>> That's one way of solving it.
>>
>> But AdvancedCache::with(CL) already solves this problem - that's why I used it (I remembered later :-)).
>>
>> Where I think the two: AC::with(CL) and ServiceModuleLoader impl of ClassResolver, should no be connected.
>> Since they solve diff problems, imo.
>>
>> Anyway, I'm now gonna try and hunt down where plain ML impl of CR somes in ...
>>
>> -Ales
>>
>>> On Thu, 2012-05-10 at 23:10 +0200, Ales Justin wrote:
>>>> If I do<subject>  I get this CNFE, see below.
>>>>
>>>> Looks like I still need a combination of Cache::with(CL) -- so this code sees Key class,
>>>> and at the same time I don't want Infinispan to depend on GAE API.
>>>> Where I also need to have SML as ClassResolver.
>>>>
>>>> Are you sure setting CL on Cache breaks ClassResolver?
>>>>
>>>> -Ales
>>>>
>>>> ---
>>>>
>>>> 23:00:50,321 ERROR [org.infinispan.query.backend.KeyTransformationHandler] (http-/192.168.1.101:8080-2) ISPN014001: Could not locate key class com.google.appengine.api.datastore.Key: java.lang.ClassNotFoundException: com.google.appengine.api.datastore.Key
>>>> 	at java.net.URLClassLoader$1.run(URLClassLoader.java:202) [classes.jar:1.6.0_31]
>>>> 	at java.security.AccessController.doPrivileged(Native Method) [classes.jar:1.6.0_31]
>>>> 	at java.net.URLClassLoader.findClass(URLClassLoader.java:190) [classes.jar:1.6.0_31]
>>>> 	at java.lang.ClassLoader.loadClass(ClassLoader.java:306) [classes.jar:1.6.0_31]
>>>> 	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) [classes.jar:1.6.0_31]
>>>> 	at java.lang.ClassLoader.loadClass(ClassLoader.java:247) [classes.jar:1.6.0_31]
>>>> 	at java.lang.Class.forName0(Native Method) [classes.jar:1.6.0_31]
>>>> 	at java.lang.Class.forName(Class.java:247) [classes.jar:1.6.0_31]
>>>> 	at org.infinispan.util.Util.loadClassStrict(Util.java:127) [infinispan-core-5.2.0-SNAPSHOT.jar:5.2.0-SNAPSHOT]
>>>> 	at org.infinispan.query.backend.KeyTransformationHandler.getCustomTransformer(KeyTransformationHandler.java:108)
>>>> 	at org.infinispan.query.backend.KeyTransformationHandler.stringToKey(KeyTransformationHandler.java:96)
>>>> 	at org.infinispan.query.impl.CacheQueryImpl.fromEntityInfosToKeys(CacheQueryImpl.java:174)
>>>> 	at org.infinispan.query.impl.CacheQueryImpl.iterator(CacheQueryImpl.java:144)
>>>> 	at org.infinispan.query.impl.CacheQueryImpl.iterator(CacheQueryImpl.java:137)
>>>> 	at org.jboss.capedwarf.datastore.query.PreparedQueryImpl.createQueryIterator(PreparedQueryImpl.java:108) [capedwarf-datastore-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
>>>> 	at org.jboss.capedwarf.datastore.query.PreparedQueryImpl.asQueryResultIterator(PreparedQueryImpl.java:73) [capedwarf-datastore-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
>>>> 	at org.jboss.capedwarf.datastore.query.PreparedQueryImpl.asIterator(PreparedQueryImpl.java:64) [capedwarf-datastore-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
>>>> 	at org.jboss.capedwarf.datastore.query.PreparedQueryImpl.asIterator(PreparedQueryImpl.java:60) [capedwarf-datastore-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
>>>> 	at org.jboss.test.capedwarf.datastore.test.PreparedQueryTestCase.testAsIteratorWithOptionstestCountEntities(PreparedQueryTestCase.java:77) [classes:]
>>>>
>>>
>>>
>>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev



More information about the infinispan-dev mailing list