From f752e46e84314a5aa8b7d922b1b5ba5a923db7ea Mon Sep 17 00:00:00 2001
From: Xiaocheng Luan <41589768+xluanlhc@users.noreply.github.com>
Date: Wed, 10 Mar 2021 16:56:49 -0500
Subject: [PATCH 1/2] Make the search coordinator thread pool size configurable
and set a (#2457)
reasonable default value. The default was 1 and all searches were being
executed sequentially.
---
.../ca/uhn/fhir/jpa/config/BaseConfig.java | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java
index 0c24c591ac7..579ef42ee11 100644
--- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java
+++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java
@@ -151,6 +151,7 @@ import org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import javax.annotation.Nullable;
+import javax.annotation.PostConstruct;
import java.util.Date;
/*
@@ -200,6 +201,29 @@ public abstract class BaseConfig {
@Autowired
private DaoRegistry myDaoRegistry;
+ /**
+ * Subclasses may override this method to provide settings such as search coordinator pool sizes.
+ */
+ @PostConstruct
+ public void initSettings() {}
+
+ private Integer searchCoordCorePoolSize = 20;
+ private Integer searchCoordMaxPoolSize = 100;
+ private Integer searchCoordQueueCapacity = 200;
+
+ public void setSearchCoordCorePoolSize(Integer searchCoordCorePoolSize) {
+ this.searchCoordCorePoolSize = searchCoordCorePoolSize;
+ }
+
+ public void setSearchCoordMaxPoolSize(Integer searchCoordMaxPoolSize) {
+ this.searchCoordMaxPoolSize = searchCoordMaxPoolSize;
+ }
+
+ public void setSearchCoordQueueCapacity(Integer searchCoordQueueCapacity) {
+ this.searchCoordQueueCapacity = searchCoordQueueCapacity;
+ }
+
+
@Bean
public BatchConfigurer batchConfigurer() {
return new NonPersistedBatchConfigurer();
@@ -316,6 +340,9 @@ public abstract class BaseConfig {
public ThreadPoolTaskExecutor searchCoordinatorThreadFactory() {
final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("search_coord_");
+ threadPoolTaskExecutor.setCorePoolSize(searchCoordCorePoolSize);
+ threadPoolTaskExecutor.setMaxPoolSize(searchCoordMaxPoolSize);
+ threadPoolTaskExecutor.setQueueCapacity(searchCoordQueueCapacity);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
From 85824efa512f2b23a1b1d75407d0d5b3ec1faad9 Mon Sep 17 00:00:00 2001
From: Frank Tao <38163583+frankjtao@users.noreply.github.com>
Date: Wed, 10 Mar 2021 16:58:10 -0500
Subject: [PATCH 2/2] Added index to improve the performance (#2385)
* Added index to improve the performance
* Added index for FORCED_ID
* Added comments for the index of while 'missing' is supported.
* Updated comments
* Moved the migration script to V5_4_0
---
.../ca/uhn/fhir/jpa/api/config/DaoConfig.java | 5 +++++
.../tasks/HapiFhirJpaMigrationTasks.java | 17 ++++++++++++++++-
.../ca/uhn/fhir/jpa/model/entity/ForcedId.java | 2 ++
.../entity/ResourceIndexedSearchParamDate.java | 1 +
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/hapi-fhir-jpaserver-api/src/main/java/ca/uhn/fhir/jpa/api/config/DaoConfig.java b/hapi-fhir-jpaserver-api/src/main/java/ca/uhn/fhir/jpa/api/config/DaoConfig.java
index d45156245b0..6b494fa7ed2 100644
--- a/hapi-fhir-jpaserver-api/src/main/java/ca/uhn/fhir/jpa/api/config/DaoConfig.java
+++ b/hapi-fhir-jpaserver-api/src/main/java/ca/uhn/fhir/jpa/api/config/DaoConfig.java
@@ -608,6 +608,11 @@ public class DaoConfig {
* _sort
parameter on searches): If the server is configured
* to not index missing field.
*
+ * The following index may need to be added into the indexed tables such as HFJ_SPIDX_TOKEN
+ * to improve the search performance while :missing
is enabled.
+ * RES_TYPE, SP_NAME, SP_MISSING
+ *