Procházet zdrojové kódy

improve reconnectClient method

Yuki Takei před 5 roky
rodič
revize
8143137b7f

+ 16 - 2
src/server/middlewares/auto-reconnect-to-search.js

@@ -1,15 +1,29 @@
+const loggerFactory = require('@alias/logger');
+
 const { ReconnectContext, nextTick } = require('../service/search-reconnect-context/reconnect-context');
 const { ReconnectContext, nextTick } = require('../service/search-reconnect-context/reconnect-context');
 
 
+const logger = loggerFactory('growi:middlewares:auto-reconnect-to-search');
+
 module.exports = (crowi) => {
 module.exports = (crowi) => {
   const { searchService } = crowi;
   const { searchService } = crowi;
   const reconnectContext = new ReconnectContext();
   const reconnectContext = new ReconnectContext();
-  const reconnectHandler = () => {
-    searchService.reconnectClient();
+
+  const reconnectHandler = async() => {
+    try {
+      logger.info('Auto reconnection is started.');
+      await searchService.reconnectClient();
+    }
+    catch (err) {
+      logger.error('Auto reconnection failed.');
+    }
+
     return searchService.isReachable;
     return searchService.isReachable;
   };
   };
 
 
   return (req, res, next) => {
   return (req, res, next) => {
     if (searchService != null && !searchService.isReachable) {
     if (searchService != null && !searchService.isReachable) {
+      // NON-BLOCKING CALL
+      // for the latency of the response
       nextTick(reconnectContext, reconnectHandler);
       nextTick(reconnectContext, reconnectHandler);
     }
     }
 
 

+ 1 - 1
src/server/routes/apiv3/search.js

@@ -77,7 +77,7 @@ module.exports = (crowi) => {
     }
     }
 
 
     try {
     try {
-      await searchService.initClient();
+      await searchService.reconnectClient();
       return res.status(200).send();
       return res.status(200).send();
     }
     }
     catch (err) {
     catch (err) {

+ 2 - 2
src/server/service/search-reconnect-context/reconnect-context.js

@@ -57,11 +57,11 @@ class ReconnectContext {
 
 
 }
 }
 
 
-function nextTick(context, reconnectHandler) {
+async function nextTick(context, reconnectHandler) {
   context.incrementCount();
   context.incrementCount();
 
 
   if (context.shouldReconnect) {
   if (context.shouldReconnect) {
-    const isSuccessToReconnect = reconnectHandler();
+    const isSuccessToReconnect = await reconnectHandler();
 
 
     // success to reconnect
     // success to reconnect
     if (isSuccessToReconnect) {
     if (isSuccessToReconnect) {

+ 12 - 5
src/server/service/search.js

@@ -68,17 +68,24 @@ class SearchService {
     tagEvent.on('update', this.delegator.syncTagChanged.bind(this.delegator));
     tagEvent.on('update', this.delegator.syncTagChanged.bind(this.delegator));
   }
   }
 
 
-  async initClient() {
-    // reset error flag
+  resetErrorStatus() {
     this.isErrorOccuredOnHealthcheck = false;
     this.isErrorOccuredOnHealthcheck = false;
     this.isErrorOccuredOnSearching = false;
     this.isErrorOccuredOnSearching = false;
-
-    return this.delegator.initClient();
   }
   }
 
 
   async reconnectClient() {
   async reconnectClient() {
     logger.info('Try to reconnect...');
     logger.info('Try to reconnect...');
-    return this.initClient();
+    this.delegator.initClient();
+
+    try {
+      await this.getInfoForHealth();
+
+      logger.info('Reconnecting succeeded.');
+      this.resetErrorStatus();
+    }
+    catch (err) {
+      throw err;
+    }
   }
   }
 
 
   async getInfo() {
   async getInfo() {