From a05326ed514076a7cf05f6a85d818a8f29d3dc15 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Mon, 5 Aug 2024 12:23:16 +0000
Subject: [PATCH] fixes #4284, fixes #4286

Closes #4284 and #4286

Merge request studip/studip!3105
---
 lib/classes/cache/MemcachedCache.php | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/lib/classes/cache/MemcachedCache.php b/lib/classes/cache/MemcachedCache.php
index 1c4b685b0c2..a540959653a 100644
--- a/lib/classes/cache/MemcachedCache.php
+++ b/lib/classes/cache/MemcachedCache.php
@@ -34,15 +34,27 @@ class MemcachedCache extends Cache
         }
 
         $prefix = \Config::get()->STUDIP_INSTALLATION_ID;
-        $this->memcache = new Memcached('studip' . ($prefix ? '-' . $prefix : ''));
+        $this->memcache = new Memcached(md5(json_encode($servers)));
 
         if (count($this->memcache->getServerList()) === 0) {
-            foreach ($servers as $server) {
-                $status = $this->memcache->addServer($server['hostname'], (int) $server['port']);
-
-                if (!$status) {
-                    throw new \Exception("Could not add server: {$server['hostname']} @ port {$server['port']}");
-                }
+            // Set options (see https://www.php.net/manual/en/memcached.addservers.php#118940)
+            $this->memcache->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
+            $this->memcache->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 2);
+            $this->memcache->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
+            $this->memcache->setOption(Memcached::OPT_RETRY_TIMEOUT, 1);
+            $this->memcache->setOption(Memcached::OPT_PREFIX_KEY, $prefix);
+
+            $status = $this->memcache->addServers(
+                array_map(
+                    function ($server) {
+                        return [$server['hostname'], (int) $server['port']];
+                    },
+                    $servers
+                )
+            );
+
+            if (!$status) {
+                throw new \Exception('Could not add memcached servers');
             }
         }
     }
-- 
GitLab