From 3bc99b517e0cc2df1d96522635bfe91346b2f49e Mon Sep 17 00:00:00 2001
From: Shinsuke Sugaya <shinsuke@apache.org>
Date: Fri, 8 Oct 2021 10:37:11 +0900
Subject: [PATCH] fix #2597 add adaptive

---
 .../fess/es/client/SearchEngineClient.java    | 22 ++++++--
 .../fess/mylasta/direction/FessConfig.java    | 51 ++++++++++++-------
 src/main/resources/fess_config.properties     |  5 +-
 3 files changed, 55 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/codelibs/fess/es/client/SearchEngineClient.java b/src/main/java/org/codelibs/fess/es/client/SearchEngineClient.java
index 2df6bd04c..9be7176bb 100644
--- a/src/main/java/org/codelibs/fess/es/client/SearchEngineClient.java
+++ b/src/main/java/org/codelibs/fess/es/client/SearchEngineClient.java
@@ -365,11 +365,11 @@ public class SearchEngineClient implements Client {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final String source = fessConfig.getIndexReindexBody()//
                 .replace("__SOURCE_INDEX__", fromIndex)//
-                .replace("__DEST_INDEX__", toIndex)
+                .replace("__SIZE__", fessConfig.getIndexReindexSize())//
+                .replace("__DEST_INDEX__", toIndex)//
                 .replace("__SCRIPT_SOURCE__", ComponentUtil.getLanguageHelper().getReindexScriptSource());
         final String refresh = StringUtil.isNotBlank(fessConfig.getIndexReindexRefresh()) ? fessConfig.getIndexReindexRefresh() : null;
-        final String requestsPerSecond =
-                StringUtil.isNotBlank(fessConfig.getIndexReindexRequestsPerSecond()) ? fessConfig.getIndexReindexRequestsPerSecond() : null;
+        final String requestsPerSecond = getReindexRequestsPerSecound(fessConfig);
         final String scroll = StringUtil.isNotBlank(fessConfig.getIndexReindexScroll()) ? fessConfig.getIndexReindexScroll() : null;
         final String maxDocs = StringUtil.isNotBlank(fessConfig.getIndexReindexMaxDocs()) ? fessConfig.getIndexReindexMaxDocs() : null;
         try (CurlResponse response = ComponentUtil.getCurlHelper().post("/_reindex").param("refresh", refresh)
@@ -385,6 +385,22 @@ public class SearchEngineClient implements Client {
         return false;
     }
 
+    protected String getReindexRequestsPerSecound(final FessConfig fessConfig) {
+        if (StringUtil.isBlank(fessConfig.getIndexReindexRequestsPerSecond())) {
+            return null;
+        }
+        final String value = fessConfig.getIndexReindexRequestsPerSecond();
+        if ("adaptive".equalsIgnoreCase(value)) {
+            if (fessConfig.availableProcessors() >= 4) {
+                return null;
+            }
+            String requestsPerSecond = String.valueOf(fessConfig.getIndexReindexSizeAsInteger() * fessConfig.availableProcessors());
+            logger.info("Set requests_per_second to {}", requestsPerSecond);
+            return requestsPerSecond;
+        }
+        return value;
+    }
+
     public boolean createIndex(final String index, final String indexName) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         return createIndex(index, indexName, fessConfig.getIndexNumberOfShards(), fessConfig.getIndexAutoExpandReplicas(), true);
diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
index 4c3533421..d16817fd6 100644
--- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
+++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
@@ -729,10 +729,13 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     */
     String INDEX_FILETYPE = "index.filetype";
 
-    /** The key of the configuration. e.g. {"source":{"index":"__SOURCE_INDEX__","size":100},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}} */
+    /** The key of the configuration. e.g. 100 */
+    String INDEX_REINDEX_SIZE = "index.reindex.size";
+
+    /** The key of the configuration. e.g. {"source":{"index":"__SOURCE_INDEX__","size":__SIZE__},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}} */
     String INDEX_REINDEX_BODY = "index.reindex.body";
 
-    /** The key of the configuration. e.g. -1 */
+    /** The key of the configuration. e.g. adaptive */
     String INDEX_REINDEX_requests_per_second = "index.reindex.requests_per_second";
 
     /** The key of the configuration. e.g. false */
@@ -3762,26 +3765,33 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     String getIndexFiletype();
 
     /**
-     * Get the value for the key 'index.reindex.body'. <br>
-     * The value is, e.g. {"source":{"index":"__SOURCE_INDEX__","size":100},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}} <br>
+     * Get the value for the key 'index.reindex.size'. <br>
+     * The value is, e.g. 100 <br>
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      */
-    String getIndexReindexBody();
+    String getIndexReindexSize();
 
     /**
-     * Get the value for the key 'index.reindex.requests_per_second'. <br>
-     * The value is, e.g. -1 <br>
+     * Get the value for the key 'index.reindex.size' as {@link Integer}. <br>
+     * The value is, e.g. 100 <br>
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     * @throws NumberFormatException When the property is not integer.
      */
-    String getIndexReindexRequestsPerSecond();
+    Integer getIndexReindexSizeAsInteger();
 
     /**
-     * Get the value for the key 'index.reindex.requests_per_second' as {@link Integer}. <br>
-     * The value is, e.g. -1 <br>
+     * Get the value for the key 'index.reindex.body'. <br>
+     * The value is, e.g. {"source":{"index":"__SOURCE_INDEX__","size":__SIZE__},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}} <br>
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
-     * @throws NumberFormatException When the property is not integer.
      */
-    Integer getIndexReindexRequestsPerSecondAsInteger();
+    String getIndexReindexBody();
+
+    /**
+     * Get the value for the key 'index.reindex.requests_per_second'. <br>
+     * The value is, e.g. adaptive <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getIndexReindexRequestsPerSecond();
 
     /**
      * Get the value for the key 'index.reindex.refresh'. <br>
@@ -8201,6 +8211,14 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             return get(FessConfig.INDEX_FILETYPE);
         }
 
+        public String getIndexReindexSize() {
+            return get(FessConfig.INDEX_REINDEX_SIZE);
+        }
+
+        public Integer getIndexReindexSizeAsInteger() {
+            return getAsInteger(FessConfig.INDEX_REINDEX_SIZE);
+        }
+
         public String getIndexReindexBody() {
             return get(FessConfig.INDEX_REINDEX_BODY);
         }
@@ -8209,10 +8227,6 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             return get(FessConfig.INDEX_REINDEX_requests_per_second);
         }
 
-        public Integer getIndexReindexRequestsPerSecondAsInteger() {
-            return getAsInteger(FessConfig.INDEX_REINDEX_requests_per_second);
-        }
-
         public String getIndexReindexRefresh() {
             return get(FessConfig.INDEX_REINDEX_REFRESH);
         }
@@ -10211,9 +10225,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             defaultMap.put(FessConfig.INDEX_INDICES_TIMEOUT, "1m");
             defaultMap.put(FessConfig.INDEX_FILETYPE,
                     "text/html=html\napplication/msword=word\napplication/vnd.openxmlformats-officedocument.wordprocessingml.document=word\napplication/vnd.ms-excel=excel\napplication/vnd.ms-excel.sheet.2=excel\napplication/vnd.ms-excel.sheet.3=excel\napplication/vnd.ms-excel.sheet.4=excel\napplication/vnd.ms-excel.workspace.3=excel\napplication/vnd.ms-excel.workspace.4=excel\napplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet=excel\napplication/vnd.ms-powerpoint=powerpoint\napplication/vnd.openxmlformats-officedocument.presentationml.presentation=powerpoint\napplication/vnd.oasis.opendocument.text=odt\napplication/vnd.oasis.opendocument.spreadsheet=ods\napplication/vnd.oasis.opendocument.presentation=odp\napplication/pdf=pdf\napplication/x-fictionbook+xml=fb2\napplication/e-pub+zip=epub\napplication/x-ibooks+zip=ibooks\ntext/plain=txt\napplication/rtf=rtf\napplication/vnd.ms-htmlhelp=chm\napplication/zip=zip\napplication/x-7z-comressed=7z\napplication/x-bzip=bz\napplication/x-bzip2=bz2\napplication/x-tar=tar\napplication/x-rar-compressed=rar\nvideo/3gp=3gp\nvideo/3g2=3g2\nvideo/x-msvideo=avi\nvideo/x-flv=flv\nvideo/mpeg=mpeg\nvideo/mp4=mp4\nvideo/ogv=ogv\nvideo/quicktime=qt\nvideo/x-m4v=m4v\naudio/x-aif=aif\naudio/midi=midi\naudio/mpga=mpga\naudio/mp4=mp4a\naudio/ogg=oga\naudio/x-wav=wav\nimage/webp=webp\nimage/bmp=bmp\nimage/x-icon=ico\nimage/x-icon=ico\nimage/png=png\nimage/svg+xml=svg\nimage/tiff=tiff\nimage/jpeg=jpg\n");
+            defaultMap.put(FessConfig.INDEX_REINDEX_SIZE, "100");
             defaultMap.put(FessConfig.INDEX_REINDEX_BODY,
-                    "{\"source\":{\"index\":\"__SOURCE_INDEX__\",\"size\":100},\"dest\":{\"index\":\"__DEST_INDEX__\"},\"script\":{\"source\":\"__SCRIPT_SOURCE__\"}}");
-            defaultMap.put(FessConfig.INDEX_REINDEX_requests_per_second, "-1");
+                    "{\"source\":{\"index\":\"__SOURCE_INDEX__\",\"size\":__SIZE__},\"dest\":{\"index\":\"__DEST_INDEX__\"},\"script\":{\"source\":\"__SCRIPT_SOURCE__\"}}");
+            defaultMap.put(FessConfig.INDEX_REINDEX_requests_per_second, "adaptive");
             defaultMap.put(FessConfig.INDEX_REINDEX_REFRESH, "false");
             defaultMap.put(FessConfig.INDEX_REINDEX_TIMEOUT, "1m");
             defaultMap.put(FessConfig.INDEX_REINDEX_SCROLL, "5m");
diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties
index bdb9e1512..64c195c2f 100644
--- a/src/main/resources/fess_config.properties
+++ b/src/main/resources/fess_config.properties
@@ -395,8 +395,9 @@ image/svg+xml=svg\n\
 image/tiff=tiff\n\
 image/jpeg=jpg\n\
 
-index.reindex.body={"source":{"index":"__SOURCE_INDEX__","size":100},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}}
-index.reindex.requests_per_second=-1
+index.reindex.size=100
+index.reindex.body={"source":{"index":"__SOURCE_INDEX__","size":__SIZE__},"dest":{"index":"__DEST_INDEX__"},"script":{"source":"__SCRIPT_SOURCE__"}}
+index.reindex.requests_per_second=adaptive
 index.reindex.refresh=false
 index.reindex.timeout=1m
 index.reindex.scroll=5m
-- 
GitLab