Fehler: Ganzzahl außerhalb des Bereichs

Das hat für post_actions funktioniert, danke für den Vorschlag!

Wir sehen jetzt hauptsächlich noch zwei Fehler:

  1. GET https://devforum.roblox.com/notifications gibt 404 für Benutzer zurück, die Benachrichtigungen mit BigInt-IDs haben.

  2. Der geplante Job Jobs::GrantAnniversaryBadges schlägt fehl.

Ist es möglich, dass ein Benachrichtigungsmodell/-controller/-dienst immer noch fest auf die Definition des Feldes notifications.id als Ganzzahl kodiert ist?

sehr unwahrscheinlich … 404 klingt nicht richtig, gibt es etwas in /logs, das das Problem beschreibt?

Leider kann ich in /logs selbst nichts besonders Nützliches finden, aber wenn ich dies lokal reproduziere, sehe ich, dass die Anfrage eingeht und dann 404, aber es passiert nur, wenn ich meine neueste Benachrichtigung mit einer ID einstelle, die ein BigInt ist (funktioniert einwandfrei, wenn sie im Bereich von int32 liegt)

Bei näherer Betrachtung stelle ich fest, dass ich eine gültige Antwort erhalte, wenn ich auf http://localhost/notifications.json?limit=30 zugreife:

{
  "notifications": [
    {
      "id": 2148935910,
      "user_id": 2,
      "notification_type": 5,
      "read": true,
      "high_priority": false,
      "created_at": "2023-02-16T00:50:53.135Z",
      "post_number": 2,
      "topic_id": 8,
      "fancy_title": "Welcome to the Lounge",
      "slug": "welcome-to-the-lounge",
      "data": {
        "topic_title": "Welcome to the Lounge",
        "original_post_id": 13,
        "original_post_type": 1,
        "original_username": "blarouche",
        "revision_number": null,
        "display_username": "blarouche"
      }
    }
  ],
  "total_rows_notifications": 1,
  "seen_notification_id": 1001,
  "load_more_notifications": "/notifications?offset=60&username=bjlarouche"
}

Wenn ich jedoch den recent-Query-Parameter übergebe, d. h. http://localhost/notifications.json?recent=true&limit=30, und dies wird von meinem Benachrichtigungsmenü aufgerufen?

{
  "errors": [
    "The requested URL or resource could not be found."
  ],
  "error_type": "not_found"
}

Edit: Wir denken, dass es daran liegt, dass current_user.seen_notification_id immer noch ein Integer ist :thinking:

Ich glaube, wir sind jetzt aus dem Schneider!

Wir haben festgestellt, dass wir neben notifications.id auch Spalten in anderen Tabellen migrieren mussten, die auf notification_id verwiesen. Andernfalls würden services/notifications.rb oder services/badge_granter.rb Fehler auslösen.


Für jedes andere große Forum-Setup, das in Zukunft auf dieses Problem mit Benachrichtigungen stößt, hier ist, was wir getan haben…

Insgesamt mussten wir vier Spalten in vier Tabellen migrieren:

  1. notifications.id
  2. user.seen_notification_id
  3. user_badges.notification_id
  4. shelved_notifications.notification_id

Wir haben zuerst #1 mit dem oben vorgeschlagenen ALTER-Befehl durchgeführt, aber dann, wie erwähnt, entschieden, ActiveRecord-Migrationen zu verwenden, damit die Migrationsdateien zum Schema hinzugefügt werden.

20230215070319_change_notifications_id_to_bigint.rb
# frozen_string_literal: true

class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :notifications, :id, :bigint
    end
end
20230215070320_change_user_seen_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :users, :seen_notification_id, :bigint
    end
end
20230215070321_change_user_badges_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :user_badges, :notification_id, :bigint
    end
end
20230215070322_change_shelved_notifications_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeShelvedNotificationsNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :shelved_notifications, :notification_id, :bigint
    end
end

Wir haben in unserem Setup eine benutzerdefinierte Dockerfile (wir erstellen Images, damit wir Discourse und Sidekiq auf separaten Ressourcen in Kubernetes ausführen können), daher war das Kopieren dieser Dateien in /db/migrate als Teil unserer Dockerfile unkompliziert.

Dann ließen wir einfach rake db:migrate den Rest erledigen. Nachdem wir einen Rolling-Restart aller unserer Discourse- und Sidekiq-Pods durchgeführt hatten, lief alles wie erwartet :crossed_fingers:.

3 „Gefällt mir“

Hervorragende Daten, wir werden den sauren Apfel beißen und dies in den Kern von Discourse zu einem BigInt migrieren. Es ist ein kostspieliger Schritt, aber dies wird bei großen Foren sicherlich wieder auftreten, also können wir es auch gleich beheben.

Hinweis … der OP handelt von post_id … ein Überlaufen davon wird weitaus schwieriger sein als bei Benachrichtigungen. 2,1 Milliarden Beiträge werden sicherlich vorkommen, aber die Kosten für die Umwandlung von post_id in BigInt sind weitaus höher als für notification_id. Wir können mit dieser Zeitbombe noch etwas warten.

4 „Gefällt mir“

Brandon,

Ich glaube, wir werden uns vielleicht dafür entscheiden:

Der Balanceakt hierbei ist, dass ich keine 40.000 Discourse-Instanzen „bestrafen“ möchte, nur wegen der ein oder zwei Ausreißer-Foren, die die erstaunliche Leistung von 2,5 Milliarden Benachrichtigungen erreicht haben.

Was denkst du?

(Hinweis: Es wird auch mindestens eine erwischen, die du übersehen hast – es gibt auch eine Chat-Tabelle)

3 „Gefällt mir“

Das wäre großartig und sieht nach einer cleveren Lösung aus :slight_smile:

Um hier kurz darauf zurückzukommen – dies wurde nun zusammengeführt. :partying_face:

5 „Gefällt mir“

Dieses Thema wurde nach 4 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.