mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 10:04:21 +00:00
Merge pull request #8980 from toniprieto/index-consumer-readonly-mode
Improve performance of discovery consumer when there are many items to index
This commit is contained in:
@@ -810,6 +810,15 @@ public class Context implements AutoCloseable {
|
||||
readOnlyCache.clear();
|
||||
}
|
||||
|
||||
// When going to READ_ONLY, flush database changes to ensure that the current data is retrieved
|
||||
if (newMode == Mode.READ_ONLY && mode != Mode.READ_ONLY) {
|
||||
try {
|
||||
dbConnection.flushSession();
|
||||
} catch (SQLException ex) {
|
||||
log.warn("Unable to flush database changes after switching to READ_ONLY mode", ex);
|
||||
}
|
||||
}
|
||||
|
||||
//save the new mode
|
||||
mode = newMode;
|
||||
}
|
||||
|
@@ -148,4 +148,12 @@ public interface DBConnection<T> {
|
||||
* @throws java.sql.SQLException passed through.
|
||||
*/
|
||||
public <E extends ReloadableEntity> void uncacheEntity(E entity) throws SQLException;
|
||||
|
||||
/**
|
||||
* Do a manual flush. This synchronizes the in-memory state of the Session
|
||||
* with the database (write changes to the database)
|
||||
*
|
||||
* @throws SQLException passed through.
|
||||
*/
|
||||
public void flushSession() throws SQLException;
|
||||
}
|
||||
|
@@ -337,4 +337,17 @@ public class HibernateDBConnection implements DBConnection<Session> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do a manual flush. This synchronizes the in-memory state of the Session
|
||||
* with the database (write changes to the database)
|
||||
*
|
||||
* @throws SQLException passed through.
|
||||
*/
|
||||
@Override
|
||||
public void flushSession() throws SQLException {
|
||||
if (getSession().isDirty()) {
|
||||
getSession().flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -205,6 +205,10 @@ public class IndexEventConsumer implements Consumer {
|
||||
@Override
|
||||
public void end(Context ctx) throws Exception {
|
||||
|
||||
// Change the mode to readonly to improve performance
|
||||
Context.Mode originalMode = ctx.getCurrentMode();
|
||||
ctx.setMode(Context.Mode.READ_ONLY);
|
||||
|
||||
try {
|
||||
for (String uid : uniqueIdsToDelete) {
|
||||
try {
|
||||
@@ -234,6 +238,8 @@ public class IndexEventConsumer implements Consumer {
|
||||
uniqueIdsToDelete.clear();
|
||||
createdItemsToUpdate.clear();
|
||||
}
|
||||
|
||||
ctx.setMode(originalMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
47
dspace-api/src/test/java/org/dspace/core/ContextIT.java
Normal file
47
dspace-api/src/test/java/org/dspace/core/ContextIT.java
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.core;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.dspace.AbstractIntegrationTestWithDatabase;
|
||||
import org.dspace.authorize.ResourcePolicy;
|
||||
import org.dspace.authorize.factory.AuthorizeServiceFactory;
|
||||
import org.dspace.authorize.service.AuthorizeService;
|
||||
import org.dspace.builder.CommunityBuilder;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ContextIT extends AbstractIntegrationTestWithDatabase {
|
||||
|
||||
AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
|
||||
|
||||
@Test
|
||||
public void testGetPoliciesNewCommunityAfterReadOnlyModeChange() throws Exception {
|
||||
|
||||
context.turnOffAuthorisationSystem();
|
||||
|
||||
// First disable the index consumer. The indexing process calls the authorizeService
|
||||
// function used in this test and may affect the test
|
||||
context.setDispatcher("noindex");
|
||||
|
||||
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||
.withName("Parent Community")
|
||||
.build();
|
||||
context.restoreAuthSystemState();
|
||||
|
||||
context.setMode(Context.Mode.READ_ONLY);
|
||||
|
||||
List<ResourcePolicy> policies = authorizeService.getPoliciesActionFilter(context, parentCommunity,
|
||||
Constants.READ);
|
||||
|
||||
assertEquals("Should return the default anonymous group read policy", 1, policies.size());
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user