MassIndexer not compatible with ORM multitenancy

relates to

Activity

Yoseph StephenJanuary 30, 2015 at 11:50 PM

Thank youuu 🙂

Davide D'AltoJanuary 30, 2015 at 5:07 PM

Yoseph StephenJanuary 29, 2015 at 7:51 AM

It happens both in 4x version and 5x version. Tested on: 4.5.3.Final and 5.0.1.Final

Yoseph StephenJanuary 29, 2015 at 7:44 AM

Using InheritableThreadLocal as informed by darioc in https://forum.hibernate.org/viewtopic.php?f=9&t=1023896 does make the indexer running properly, BUT it creates another problem, since the tenantIdentifier can be switched on concurrent http request.

Yoseph StephenJanuary 29, 2015 at 2:32 AM

Below are simple testcase:

SessionBuilder sessionBuilder = hibernateSessionFactory.getFactory().withOptions(); Session session = sessionBuilder.tenantIdentifier("abc-123").openSession(); FullTextSession fullTextSession = Search.getFullTextSession(session); log.info("ACCURATE DB Tennant ID: " + session.getTenantIdentifier() + ", Fulltext Tenant ID: " + fullTextSession.getTenantIdentifier()); fullTextSession.createIndexer().startAndWait();

It shows the following logs:

2015-01-29 09:24:38,363 INFO - ACCURATE DB Tennant ID: abc-123, Fulltext Tenant ID: abc-123 2015-01-29 09:24:38,366 ERROR (org.hibernate.search.exception.impl.LogErrorHandler:67) - HSEARCH000058: HSEARCH000212: An exception occurred while the MassIndexer was transforming identifiers to Lucene Documents java.lang.RuntimeException: No connection provider found for: public at com.cpssoft.web.database.connection.MultiTenantConnectionProviderImpl.getProvider(MultiTenantConnectionProviderImpl.java:42) at com.cpssoft.web.database.connection.MultiTenantConnectionProviderImpl.getConnection(MultiTenantConnectionProviderImpl.java:83) at org.hibernate.internal.AbstractSessionImpl$ContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:423) at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162) at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.run(IdentifierConsumerDocumentProducer.java:100) at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.runWithErrorHandler(OptionallyWrapInJTATransaction.java:97) at org.hibernate.search.batchindexing.impl.ErrorHandledRunnable.run(ErrorHandledRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)

I can assure it calls my implementation of CurrentTenantIdentifierResolver, to get the "public" tenant ID (because it runs on different thread, my CurrentTenantIdentifierResolver could not get the previous tenant ID, so it returns "public" as default). It should not call the CurrentTenantIdentifierResolver, since the session I'm passing to FullTextSession has already had an tenantIdentifier (see the logs).

Fixed

Details

Assignee

Reporter

Components

Fix versions

Priority

Created August 15, 2014 at 10:30 AM
Updated October 31, 2017 at 12:33 PM
Resolved February 6, 2015 at 2:18 PM

Flag notifications