]
Paul Ferraro commented on WFLY-9803:
------------------------------------
While the cache name length issue is particularly problematic for JPA/Hibernate, I'd
like to generalize this behavior within the Infinispan subsystem so that any cache
container can leverage it.
The currently thinking is that we'd create a replicated or local Cache<String,
UUID> containing the mapping of long to short name and encapsulate the logic within our
DefaultCacheContainer delegate. Each cache container would expose an attribute to toggle
this behavior.
Switch clustered JPA second level caching to use short (global)
unique id, instead of long (app scoped) persistence name
------------------------------------------------------------------------------------------------------------------------
Key: WFLY-9803
URL:
https://issues.jboss.org/browse/WFLY-9803
Project: WildFly
Issue Type: Task
Components: Clustering, JPA / Hibernate
Reporter: Scott Marlow
Assignee: Paul Ferraro
To avoid the below error, we will patch org.infinispan.util.ByteString, to use an
unsigned byte for max length, but we also still switch to using a shorter name (for
WFLY-9803), so that clustered cache puts, are not transmitting the long scoped persistence
unit name, on every cache put.
Original failure that could still happen with long app/pu names:
{code}
Failed to start service
jboss.persistenceunit."jpa_core_cache_vehicles.ear/jpa_core_cache_pmservlet_vehicle_web.war#CTS-EM-NOTX":
org.jboss.msc.service.StartException in service
jboss.persistenceunit."jpa_core_cache_vehicles.ear/jpa_core_cache_pmservlet_vehicle_web.war#CTS-EM-NOTX":
javax.persistence.PersistenceException: [PersistenceUnit: CTS-EM-NOTX] Unable to build
Hibernate SessionFactory
at
org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:195)
[wildfly-jpa-12.0.0.Alpha1-SNAPSHOT.jar:12.0.0.Alpha1-SNAPSHOT]
at
org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:125)
[wildfly-jpa-12.0.0.Alpha1-SNAPSHOT.jar:12.0.0.Alpha1-SNAPSHOT]
at
org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:650)
[wildfly-elytron-1.2.0.Beta12.jar:1.2.0.Beta12]
at
org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:209)
[wildfly-jpa-12.0.0.Alpha1-SNAPSHOT.jar:12.0.0.Alpha1-SNAPSHOT]
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1979)
at
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1481)
at
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1374)
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
at org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: CTS-EM-NOTX] Unable
to build Hibernate SessionFactory
at
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:953)
[hibernate-entitymanager-5.1.10.Final.jar:5.1.10.Final]
at
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:883)
[hibernate-entitymanager-5.1.10.Final.jar:5.1.10.Final]
at
org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
at
org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:167)
[wildfly-jpa-12.0.0.Alpha1-SNAPSHOT.jar:12.0.0.Alpha1-SNAPSHOT]
... 8 more
Caused by: java.lang.IllegalArgumentException: ByteString must be shorter than 127 bytes
at org.infinispan.util.ByteString.<init>(ByteString.java:26)
at org.infinispan.util.ByteString.fromString(ByteString.java:36)
at
org.infinispan.factories.GlobalComponentRegistry.registerNamedComponentRegistry(GlobalComponentRegistry.java:211)
at org.infinispan.factories.ComponentRegistry.start(ComponentRegistry.java:228)
at org.infinispan.cache.impl.SimpleCacheImpl.start(SimpleCacheImpl.java:168)
at
org.infinispan.cache.impl.AbstractDelegatingCache.start(AbstractDelegatingCache.java:411)
at
org.infinispan.manager.DefaultCacheManager.wireAndStartCache(DefaultCacheManager.java:653)
at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheManager.java:598)
at
org.infinispan.manager.DefaultCacheManager.internalGetCache(DefaultCacheManager.java:462)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:448)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:434)
at
org.jboss.as.clustering.infinispan.DefaultCacheContainer.getCache(DefaultCacheContainer.java:60)
at
org.infinispan.hibernate.cache.access.PutFromLoadValidator.<init>(PutFromLoadValidator.java:173)
at
org.infinispan.hibernate.cache.access.PutFromLoadValidator.<init>(PutFromLoadValidator.java:136)
at
org.infinispan.hibernate.cache.impl.BaseTransactionalDataRegion.prepareForValidation(BaseTransactionalDataRegion.java:153)
at
org.infinispan.hibernate.cache.impl.BaseTransactionalDataRegion.createAccessDelegate(BaseTransactionalDataRegion.java:138)
at
org.infinispan.hibernate.cache.entity.EntityRegionImpl.buildAccessStrategy(EntityRegionImpl.java:49)
at
org.hibernate.internal.SessionFactoryImpl.determineEntityRegionAccessStrategy(SessionFactoryImpl.java:646)
[hibernate-core-5.1.10.Final.jar:5.1.10.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:340)
[hibernate-core-5.1.10.Final.jar:5.1.10.Final]
at
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:422)
[hibernate-core-5.1.10.Final.jar:5.1.10.Final]
at
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:880)
[hibernate-entitymanager-5.1.10.Final.jar:5.1.10.Final]
{code}
Code to change:
Look for call to
org.jboss.as.jpa.config.PersistenceUnitMetadata.setScopedPersistenceUnitName(String) and
switch to using clustered long name to short name map (Map<String,String>).
We need to look through the callers to
PersistenceUnitMetadata.getScopedPersistenceUnitName() and switch to use
PersistenceUnitMetadata.getShortPersistenceUnitName() (or
PersistenceUnitMetadata.getUUID()), for internal use but keep using
PersistenceUnitMetadata.getScopedPersistenceUnitName() for error messages and management
console/CLI.