From f5778caa3acde205e55df6a8ec00b28a691f8c19 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 14 Aug 2023 17:46:16 +0200
Subject: [PATCH] Add `ES_PRESET` option to customize numbers of shards and
 replicas (#26483)

Co-authored-by: Eugen Rochko <eugen@zeonfederated.com>
---
 app/chewy/accounts_index.rb      |  2 +-
 app/chewy/instances_index.rb     |  2 +-
 app/chewy/statuses_index.rb      |  2 +-
 app/chewy/tags_index.rb          |  2 +-
 config/application.rb            |  2 ++
 config/initializers/chewy.rb     |  8 --------
 lib/chewy/index_extensions.rb    | 18 ++++++++++++++++++
 lib/chewy/settings_extensions.rb | 11 +++++++++++
 8 files changed, 35 insertions(+), 12 deletions(-)
 create mode 100644 lib/chewy/index_extensions.rb
 create mode 100644 lib/chewy/settings_extensions.rb

diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb
index 61f5277d2..1f8571c09 100644
--- a/app/chewy/accounts_index.rb
+++ b/app/chewy/accounts_index.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class AccountsIndex < Chewy::Index
-  settings index: { refresh_interval: '30s' }, analysis: {
+  settings index: index_preset(refresh_interval: '30s'), analysis: {
     filter: {
       english_stop: {
         type: 'stop',
diff --git a/app/chewy/instances_index.rb b/app/chewy/instances_index.rb
index 2bce4043c..0d58167dc 100644
--- a/app/chewy/instances_index.rb
+++ b/app/chewy/instances_index.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class InstancesIndex < Chewy::Index
-  settings index: { refresh_interval: '30s' }
+  settings index: index_preset(refresh_interval: '30s')
 
   index_scope ::Instance.searchable
 
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index 6dd4fb18b..9f680efa5 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -3,7 +3,7 @@
 class StatusesIndex < Chewy::Index
   include FormattingHelper
 
-  settings index: { refresh_interval: '30s' }, analysis: {
+  settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: {
     filter: {
       english_stop: {
         type: 'stop',
diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb
index df3d9e4cc..b2d50a000 100644
--- a/app/chewy/tags_index.rb
+++ b/app/chewy/tags_index.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class TagsIndex < Chewy::Index
-  settings index: { refresh_interval: '30s' }, analysis: {
+  settings index: index_preset(refresh_interval: '30s'), analysis: {
     analyzer: {
       content: {
         tokenizer: 'keyword',
diff --git a/config/application.rb b/config/application.rb
index a3bd3dfa4..372adc168 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -41,6 +41,8 @@ require_relative '../lib/mastodon/rack_middleware'
 require_relative '../lib/public_file_server_middleware'
 require_relative '../lib/devise/two_factor_ldap_authenticatable'
 require_relative '../lib/devise/two_factor_pam_authenticatable'
+require_relative '../lib/chewy/settings_extensions'
+require_relative '../lib/chewy/index_extensions'
 require_relative '../lib/chewy/strategy/mastodon'
 require_relative '../lib/chewy/strategy/bypass_with_warning'
 require_relative '../lib/webpacker/manifest_extensions'
diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb
index dc9017621..7d51a0845 100644
--- a/config/initializers/chewy.rb
+++ b/config/initializers/chewy.rb
@@ -25,14 +25,6 @@ Chewy.root_strategy              = :bypass_with_warning if Rails.env.production?
 Chewy.request_strategy           = :mastodon
 Chewy.use_after_commit_callbacks = false
 
-module Chewy
-  class << self
-    def enabled?
-      settings[:enabled]
-    end
-  end
-end
-
 # Elasticsearch uses Faraday internally. Faraday interprets the
 # http_proxy env variable by default which leads to issues when
 # Mastodon is run with hidden services enabled, because
diff --git a/lib/chewy/index_extensions.rb b/lib/chewy/index_extensions.rb
new file mode 100644
index 000000000..064fd56b3
--- /dev/null
+++ b/lib/chewy/index_extensions.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Chewy
+  module IndexExtensions
+    def index_preset(base_options = {})
+      case ENV['ES_PRESET'].presence
+      when 'single_node_cluster', nil
+        base_options.merge(number_of_replicas: 0)
+      when 'small_cluster'
+        base_options.merge(number_of_replicas: 1)
+      when 'large_cluster'
+        base_options.merge(number_of_replicas: 1, number_of_shards: (base_options[:number_of_shards] || 1) * 2)
+      end
+    end
+  end
+end
+
+Chewy::Index.extend(Chewy::IndexExtensions)
diff --git a/lib/chewy/settings_extensions.rb b/lib/chewy/settings_extensions.rb
new file mode 100644
index 000000000..0eb8b336f
--- /dev/null
+++ b/lib/chewy/settings_extensions.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Chewy
+  module SettingsExtensions
+    def enabled?
+      settings[:enabled]
+    end
+  end
+end
+
+Chewy.extend(Chewy::SettingsExtensions)