Shopware 6 | Elasticsearch Patch

Gerade in den „early“ stages von Software hat man oft noch mit Bugs zu kämpfen die einem den Livegang / Update so richtig schön vermiesen können. Hier zeige ich euch kurz wie Ihr einen patch für composer packages generiert und sauber in eure composer installation packt.

Ein Patch (Maskulinum,[1] selten Neutrum; von engl. to patch = flicken, ausbessern und patch = [aufgesetzter] Flicken, Flickwerk in der Bedeutung von Reparatur bzw. Nachbesserung) ist eine Korrekturauslieferung für Software oder Daten aus Endanwendersicht, um Fehler zu beheben – meist um bekannt gewordene Sicherheitslücken zu schließen – oder bislang nicht vorhandene Funktionen nachzurüsten. (Quelle: Wikipedia)

Beispiel: In unserem speziellen Fall geht es um ein document beim Elasticsearch indexieren, welches durch seinen Umfang nicht indexiert werden kann und damit die komplette Indexierung breaked.

[app] Document contains at least one immense term in field="slotConfig.4d991c8e89334a778e6a8e6dc6ebbcd3.content.value" (whose UTF8 encoding is longer than the max length 32766)

Dieses Feld hat eigentlich auch nichts im ES Index verloren, ist aber auch an einer Stelle die sich kaum oder nur schlecht entfernen lässt. Steht nun ein Live-gang kurz bevor und das Problem tritt erst am Ende auf (wenn in diesem Fall die Datenschutzerklärung nun auf +32k bytes gewachsen ist), muss man entweder eine Core Änderung machen oder die softe Variante nehmen und patchen.

Patch Datei erstellen

Viele Wege führen nach Rom. Da die meisten von euch aber wahrscheinlich Phpstorm verwenden hier der Weg über diese IDE.

Netterweise hat @Shyim (https://github.com/shyim/shopware-patch-collection/blob/master/elasticsearch/slot-config/elastic.patch) schon eine Lösung für dieses Problem bereit gestellt, ist aber leider nicht mit unserer SW6 Version kompatibel, aber das ist kein Problem, da wir mit dem Code auch in anderen Versionen arbeiten können. Obacht: jedes Update kann den Patch unbrauchbar machen, denn sobald sich die Datei ändert, muss auch der Patch angepasst werden.

Wir öffnen die zu bearbeitende Datei in unserem Vendor Ordner (/vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php) und ändern den entsprechenden Code, welchen wir hinzufügen oder entfernen möchten. Danach Rechtsklick in den offenen Dateicode und wählen Show History aus:

Dann wählen wir unseren Change aus und klicken oben links auf Create Patch.

Ich kopiere mir in dem Fall dann den Patch in die Zwischenablage und packe Ihn direkt ins Gitlab Repository

Das ganze generiert uns dann folgendes:

Index: vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php	(date 1601061155854)
+++ vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php	(date 1601061155854)
@@ -258,6 +258,8 @@
             $documents[] = ['delete' => ['_id' => $id]];
         }

+        $this->removeDataKey($documents, 'slotConfig');
+
         // index found entities
         $result = $this->client->bulk([
             'index' => $index,
@@ -295,6 +297,17 @@
         return $messages;
     }

+    private function removeDataKey(array &$lookupArray, string $lookupKey)
+    {
+        foreach ($lookupArray as $key => &$value) {
+            if ($key === $lookupKey) {
+                $value = null;
+            } else if (is_array($value)) {
+                $this->removeDataKey($value, $lookupKey);
+            }
+        }
+    }
+
     private function createIndexingMessage(IndexerOffset $offset, Context $context): ?EntityIndexingMessage
     {
         $definition = $this->registry->get($offset->getDefinition());

Den ganzen Meta Kram oben benötigen wir nicht:

Index: vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================

Auch das – – – brauchen wir nicht, da wir in dem Sinne keine alte File haben

--- vendor/shopware/elasticsearch/Framework/Indexing/ElasticsearchIndexer.php	(date 1601061155854)

Damit bleibt uns die folgende Datei, die ich euch mal über Gitlab für die Shopware 6.3.0.2 teile (zukünftige Versionen die diesen Patch benötigen, werden in einem Branch z.B. 6.3.2.0 abgelegt).

Gitlab Versions File

https://gitlab.com/mh2017/shopware6-patches/-/raw/6.3.0.2/elasticsearch/es-slot.patch

Composer Patcher

So und was mach ich jetzt mit dem ganzen Kram? Es gibt hier zwei Wege – entweder spiele ich die Patch Datei im Terminal mit patch ‚p1‘ –no-nackup-if-mismatch … ein oder Ihr nutzt (wie ich empfehlen würde) https://github.com/cweagans/composer-patches dafür.

In eurem Shopware root required Ihr erstmal dieses package:

composer require "cweagans/composer-patches"
composer install

in eure composer.json packt Ihr dann noch

"extra": {
        "patches": {
            "shopware/elasticsearch": {
                "Patch ES slot size": "https://gitlab.com/mh2017/shopware6-patches/-/raw/6.3.0.2/elasticsearch/es-slot.patch"
            }
        }
    },

Ihr könnt dafür auch eigene composer.patches.json files nehmen um es besser zu trennen und eure composer.json klein zu halten, schaut dafür am besten ins Github Repo von cweagans.

Obacht: Wenn Ihr composer-patches nutzt müsst Ihr in der Patch Datei euren vendor/package Pfad entfernen.

+++ Framework/Indexing/ElasticsearchIndexer.php	(date 1601061155854)

Nun einfach noch composer install ausführen und Ihr seid good to go. Sollte

Removing package shopware/elasticsearch so that it can be re-installed and re-patched.
- Removing shopware/elasticsearch (6.3.0.2)

shopware/elasticsearch/Elasticsearch.php): failed to open stream: No such file or directory  

als Fehler auftauchen, killed einfach euren kompletten vendor Ordner. Nun sollten eure Files die Änderungen enthalten und Ihr müsst euch bis zum nächsten Update des shopware/elasticsearch package keine Sorgen mehr machen. Auch funktioniert das indexieren mit ES wieder sauber.

ES Indexierung

PS: Dieser Fix ist mMn nur beim Einsatz von der Enterprise Suche von Nöten, da diese auch die Kategorien indexiert. Hier soll aber auch mehr der workflow für patches erklärt werden, happy patching! (Special Thx an https://github.com/kleinmann für den Tip 🙂 )

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.