Probleme bei Upgrade 2.0.17 -> 2.1.3

Started by Takeshi, January 29, 2023, 07:30:25 PM

Previous topic - Next topic

Takeshi

Hallo zusammen,

kurz zur Vorgeschichte: Ich habe damals mit SMF 1.0.x angefangen, irgendwann Upgrade auf 2.0, diverse Mods eingespielt, teilweise selbst angepasst, dass sie noch mit der aktuellen SMF-Version laufen. Das führte dazu, dass Updates des Forums händisch durchgeführt werden musste. Also alles leider ziemlich verbastelt. Bei SMF 2.0.17 bin ich dann hängen geblieben, möchte das Forum nun wieder auf den aktuellen Stand beingen (Hoster bietet nur noch PHP 7.4 und neuer an), aber nun gleich auf 2.1.3 und nicht mehr auf 2.0.19, denn 2.1.x kommt sowieso irgendwann.
Ich habe gesehen, dass SMF 2.0.17 die PHP-Version 7.4 nicht unterstützt, nur bis 7.3.

Welcher Fehler tritt auf?

Ich arbeite mit einem Backup, das ich lokal in XAMPP 7.4 eingespielt habe.

Wie auch auf dem Webserver läuft unter XAMPP das Forum selbst nicht, nur das Admincenter. Wenn ich das Forum aufrufe, wird mir angezeigt, dass eine Funktion aus einem (uralten) Add-On nicht existiere. Liegt vermutlich an PHP 7.4.

Bei "Schritt 4: Datenbank-Änderungen" wird angezeigt:
QuoteAktualisierungsskript wird ausgeführt 2 of 2.

Führe aus: "Adding support for alerts" (15 von 71 - of this script)
Dann passiert einige Zeit nichts, bis die Meldung kommt:
QuoteDer Server hat seit 30 Sekunden nicht geantwortet. Wahrscheinlich lohnt es sich, noch ein wenig länger zu warten, bevor Sie es erneut versuchen.Klicken Sie hier, um es erneut zu versuchen.
Erneut versuchen bringt wie zu erwarten nichts. Mit Debug-Informationen sind das die letzten Meldungen:
QuoteAdding the boardindex_max_depth setting...done
Removing manage_boards permission...done
Adding new columns to categories...done
Adding the count to the members table...done
Adding the new table for alerts...done
Adding alert preferences...done
In der Datei upgrade_2-1_mysql.sql [nofollow] ist das die Zeile 951. Der Fehler liegt also wahrscheinlich bei Zeile 992 "Upgrading post notification settings". Dort wird geprüft, ob die Spalte "notify_regularity" in der Tabelle "members" existiert - tut sie nicht. Code wird nur ausgeführt, wenn die Spalte existiert. Als nächstes kommt "Dropping old notification fields from the members table" (Zeile 1055). Dort sollen die Spalten "notify_send_body", ... gelöscht werden, die nicht existieren. Lege ich sie an, werden sie nicht gelöscht, weshalb ich davon ausgehe, dass das Skript gar nichts bis dahin geht. Also muss das Problem bei "Upgrading post notification settings" (992) sein, aber da komme ich nicht weiter.

Versuch 1

  • Backup eingespielt
  • Skipt "repair_settings" gestartet und die Einstellungen an XAMPP angepasst
  • "Large upgrade" in den Ordner kopiert, upgrade.php gestartet
  • Besagter Fehler tritt auf

Versuch 2

  • Backup eingespielt
  • SMF 2.0.19 parallel installiert
  • Settings.php umgeändert, so dass die Datenbank des Backups verwendet wird
  • Skipt "repair_settings" gestartet und die Einstellungen angepasst
  • Admincenter geht, Forum nicht
  • "Large upgrade" in den Ordner kopiert, upgrade.php gestartet
  • Besagter Fehler tritt auf

Versuch 3

  • SMF 2.0.19 installiert
  • "Large upgrade" in den Ordner kopiert, upgrade.php gestartet
  • Upgrade läuft durch, alles gut


Da bin ich gerade mit meinem Latein am Ende. Hat jemand eine Idee, wie ich da am besten weiter vorgehe oder woran es liegen kann?

Takeshi

Ich denke, ich habe den Fehler schon sehr genau eingekreist, eventuell sogar gelöst. Mit der Aussage bin ich nur noch etwas vorsichtig.

Den exakt gleichen Fehler wird wahrscheinlich niemand haben, aber vielleicht hilft jemandem die Beschreibung des Vorgehens.

Wie erwartet liegt der Fehler in dem Block "Upgrading post notification settings" ab Zeile 992. Das konnte ich eingrenzen, indem ich selbst Kommentare eingefügt habe, die beim Update als Debugging-Ausgabe angezeigt werden. Solche Kommentare beginnen mit "---# ", gefolgt vom Text und enden nach dem Block mit "---#" ohne Test dahinter. Die Zeile 995
$results = $smcFunc['db_list_columns']('{db_prefix}members');wurde noch abgearbeitet, da der danach eingefügte Kommentar ausgegeben wurde. Das Ende der if-Anweisung wurde nicht erreicht. Der Code hängt eindeutig in der while-Schleife in Zeile 1028.
while ($row = $smcFunc['db_fetch_assoc']($request))Mache ich daraus while (0), läuft das Update durch. Setze ich selbst ein Timeout, dann geht es auch.
        if ($smcFunc['db_num_rows']($request) != 0)
        {
            $foo_limit = 200;
            while (($foo_limit > 0) && ($row = $smcFunc['db_fetch_assoc']($request)))
            {
                $inserts[] = array($row['id_member'], 'msg_receive_body', !empty($row['notify_send_body']) ? 1 : 0);
                $inserts[] = array($row['id_member'], 'msg_notify_pref', $row['notify_regularity']);
                $inserts[] = array($row['id_member'], 'msg_notify_type', $row['notify_types']);
                $foo_limit--;
            }
            $smcFunc['db_free_result']($request);
        }
Die Datenbank umfasst knapp 20.000 Benutzer. Mit einem Limit von 20000 läuft es nicht, mit 200 schon. Irgendwas braucht da also echt lange.
Das Forum läuft danach, aber ich kann mir nicht vorstellen, dass das fehlerfrei ist.

An der Stelle suche ich nun weiter, ob ich das dazu bringen kann, mit allen Nutzern durchzulaufen. Vielleicht teile ich das zur Not auf.

Advertisement: