Browse Source

Maintenance: Add support for memcached (via the 'dalli' gem) as Rails cache store.

To activate this, simply specify MEMCACHE_SERVERS=your.server and Zammad will use that as Rails cache store.

See also https://github.com/zammad/zammad/issues/1601
Martin Gruner 3 years ago
parent
commit
f05f8e2d3c

+ 17 - 4
.gitlab/ci/base.yml

@@ -68,41 +68,52 @@
   name: redis:latest
   alias: redis
 
+.docker_memcached: &docker_memcached
+  name: memcached:latest
+  alias: memcached
+  command: ["memcached", "-m", "256M"]
+
  # service templates
 .services_mysql: &services_mysql
   services:
     - <<: *docker_mysql
 
-.services_mysql_redis: &services_mysql_redis
+.services_mysql_redis_memcached: &services_mysql_redis_memcached
   variables:
     REDIS_URL: "redis://redis:6379"
+    MEMCACHE_SERVERS: "memcached"
   services:
     - <<: *docker_mysql
     - <<: *docker_redis
+    - <<: *docker_memcached
 
 .services_postgresql: &services_postgresql
   services:
     - <<: *docker_postgresql
 
-.services_postgresql_redis: &services_postgresql_redis
+.services_postgresql_redis_memcached: &services_postgresql_redis_memcached
   variables:
     REDIS_URL: "redis://redis:6379"
+    MEMCACHE_SERVERS: "memcached"
   services:
     - <<: *docker_postgresql
     - <<: *docker_redis
+    - <<: *docker_memcached
 
 .services_mysql_postgresql: &services_mysql_postgresql
   services:
     - <<: *docker_mysql
     - <<: *docker_postgresql
 
-.services_mysql_postgresql_redis: &services_mysql_postgresql_redis
+.services_mysql_postgresql_redis_memcached: &services_mysql_postgresql_redis_memcached
   variables:
     REDIS_URL: "redis://redis:6379"
+    MEMCACHE_SERVERS: "memcached"
   services:
     - <<: *docker_mysql
     - <<: *docker_postgresql
     - <<: *docker_redis
+    - <<: *docker_memcached
 
 .services_postgresql_selenium: &services_postgresql_selenium
   services:
@@ -133,10 +144,11 @@
     - <<: *docker_selenium
     - <<: *docker_imap
 
-.services_mysql_postgresql_elasticsearch_selenium_imap_redis: &services_mysql_postgresql_elasticsearch_selenium_imap_redis
+.services_mysql_postgresql_elasticsearch_selenium_imap_redis_memcached: &services_mysql_postgresql_elasticsearch_selenium_imap_redis_memcached
   variables:
     ELASTICSEARCH_TAG: 'stable'
     REDIS_URL: "redis://redis:6379"
+    MEMCACHE_SERVERS: "memcached"
   services:
     - <<: *docker_mysql
     - <<: *docker_postgresql
@@ -144,6 +156,7 @@
     - <<: *docker_selenium
     - <<: *docker_imap
     - <<: *docker_redis
+    - <<: *docker_memcached
 
 # we need at least one job to store and include this template
 # but we skip this via 'only' -> 'variables' -> '$IGNORE'

+ 3 - 3
.gitlab/ci/browser-core.yml

@@ -19,7 +19,7 @@ include:
     - .env_base
     - .variables_es
     - .variables_app_restart_cmd
-    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis
+    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis_memcached
   variables:
     RAILS_ENV: "production"
   script:
@@ -53,7 +53,7 @@ include:
   extends:
     - .env_base
     - .variables_app_restart_cmd
-    - .services_mysql_postgresql_redis
+    - .services_mysql_postgresql_redis_memcached
   variables:
     RAILS_ENV: "production"
 
@@ -63,7 +63,7 @@ include:
   extends:
     - .env_base
     - .variables_es
-    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis
+    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis_memcached
   variables:
     RAILS_ENV: "test"
     REDIS_URL: "redis://redis:6379"

+ 1 - 1
.gitlab/ci/browser-integration.yml

@@ -15,7 +15,7 @@ include:
     - .env_base
     - .variables_app_restart_cmd
     - .variables_es
-    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis
+    - .services_mysql_postgresql_elasticsearch_selenium_imap_redis_memcached
   variables:
     RAILS_ENV: "test"
   script:

+ 1 - 1
.gitlab/ci/rspec.yml

@@ -36,7 +36,7 @@ rspec:integration:
   stage: test
   extends:
     - .env_base
-    - .services_mysql_postgresql_redis
+    - .services_mysql_postgresql_redis_memcached
     - .rspec_integration_rules
   variables:
     RAILS_ENV: "test"

+ 2 - 2
.gitlab/ci/rspec/mysql.yml

@@ -1,11 +1,11 @@
 rspec:mysql:
   stage: test
   extends:
-    - .services_mysql_redis
+    - .services_mysql_redis_memcached
     - .template_rspec
 
 rspec:mysql:db_reset:
   stage: test
   extends:
-    - .services_mysql_redis
+    - .services_mysql_redis_memcached
     - .template_rspec_db_reset

+ 2 - 2
.gitlab/ci/rspec/postgresql.yml

@@ -1,11 +1,11 @@
 rspec:postgresql:
   stage: test
   extends:
-    - .services_postgresql_redis
+    - .services_postgresql_redis_memcached
     - .template_rspec
 
 rspec:postgresql:db_reset:
   stage: test
   extends:
-    - .services_postgresql_redis
+    - .services_postgresql_redis_memcached
     - .template_rspec_db_reset

+ 1 - 1
.gitlab/ci/unit/mysql.yml

@@ -1,5 +1,5 @@
 unit:mysql:
   stage: test
   extends:
-    - .services_mysql_redis
+    - .services_mysql_redis_memcached
     - .template_unit

+ 1 - 1
.gitlab/ci/unit/postgresql.yml

@@ -1,5 +1,5 @@
 unit:postgresql:
   stage: test
   extends:
-    - .services_postgresql_redis
+    - .services_postgresql_redis_memcached
     - .template_unit

+ 17 - 3
.gitlab/configure_environment.rb

@@ -23,17 +23,30 @@ class ConfigureEnvironment
 
   def self.configure_redis
     if ENV['REDIS_URL'].nil? || ENV['REDIS_URL'].empty? # rubocop:disable Rails/Blank
-      puts 'Redis is not available, using File as web socket session back end.'
+      puts 'Redis is not available, using File as web socket session store.'
       return
     end
     if [true, false].sample
-      puts 'Using Redis as web socket session back end.'
+      puts 'Using Redis as web socket session store.'
       return
     end
-    puts 'Using File as web socket session back end.'
+    puts 'Using File as web socket session store.'
     @env_file_content += "unset REDIS_URL\n"
   end
 
+  def self.configure_memcached
+    if ENV['MEMCACHE_SERVERS'].nil? || ENV['MEMCACHE_SERVERS'].empty? # rubocop:disable Rails/Blank
+      puts 'Memcached is not available, using File as Rails cache store.'
+      return
+    end
+    if [true, false].sample
+      puts 'Using memcached as Rails cache store.'
+      return
+    end
+    puts "Using Zammad's file store as Rails cache store."
+    @env_file_content += "unset MEMCACHE_SERVERS\n"
+  end
+
   def self.configure_database # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
 
     if File.exist? File.join(__dir__, '../config/database.yml')
@@ -103,6 +116,7 @@ class ConfigureEnvironment
 
   def self.run
     configure_redis
+    configure_memcached
     configure_database
     write_env_file
   end

+ 10 - 2
config/application.rb

@@ -47,10 +47,18 @@ module Zammad
     config.api_path = '/api/v1'
 
     # define cache store
-    config.cache_store = :zammad_file_store, Rails.root.join('tmp', "cache_file_store_#{Rails.env}"), { expires_in: 7.days }
+    config.cache_store = if ENV['MEMCACHE_SERVERS'].present?
+                           [:mem_cache_store, ENV['MEMCACHE_SERVERS'], { expires_in: 7.days }]
+                         else
+                           [:zammad_file_store, Rails.root.join('tmp', "cache_file_store_#{Rails.env}"), { expires_in: 7.days }]
+                         end
 
     # define websocket session store
-    config.websocket_session_store = ENV['REDIS_URL'] ? :redis : :file
+    config.websocket_session_store = if ENV['REDIS_URL'].present?
+                                       :redis
+                                     else
+                                       :file
+                                     end
 
     # Rails 6.1 returns false when the enqueuing is aborted.
     config.active_job.return_false_on_aborted_enqueue = true

Some files were not shown because too many files changed in this diff