Aussehen
Suche Einloggen
[c] [meta] [fefe] [erp]

/fefe/ – Fefes Kommentarfunktion


Antwort erstellen

(≤ 4)



[Zurück]

  • [l] Ein Leser berichtet:Heute frueh gab es einen lustigen ... Effe ## Mod Tue, 13 May 2025 20:24:21 GMT Nr. 156241
    GIF 300×302 11.4k
    Ein Leser berichtet:

    >Heute frueh gab es einen lustigen Ausfall bei Quay.io, der Docker Registry von Redhat.
    >
    >Man kann seitdem keine neuen Images mehr hochladen.
    >
    >Ursache: Der Primary Key einer Tabelle in der Datenbank hat seinen Maximalwert erreicht und keine Inserts sind mehr moeglich.
    >
    >Softwareproblem, kann man wohl nix machen.
    >
    >Money Quote:
    >
    >Pushes will be disabled until a fix is implemented. There is currently no timeline for Push restoration.
    >
    >Aktuell ist der Status noch unveraendert kaputt. :)

    Das erscheint mir gerade sehr unwahrscheinlich, dass die da ernsthaft genug Images drin haben, um den Wertebereich für ihren primary key komplett zu belegen. Auf quay.io steht von dem primary key auch nichts, aber eine Meldung bestätigt den Ausfall.

    https://blog.fefe.de/?ts=96dd6922
  • [l] Update Effe ## Mod Tue, 13 May 2025 21:06:01 GMT Nr. 156253
    @@ -18,0 +19,3 @@
    +[b]Update[/b]: Ah, hier steht das mit dem primary key [0].
    +
    +[0] https://status.redhat.com/incidents/k7kvfvgfrbdf

  • [l] Felix Wed, 14 May 2025 05:24:10 GMT Nr. 156280 SÄGE
    >>156253
    fixed mit getestetem Patch 13,5h nach Investigationsbeginn

    passt doch?

    aber dass sie kein Selbstbewußtsein haben, einen Zeitraum vorherzusagen ist eher meh
  • [l] Felix Wed, 14 May 2025 08:36:01 GMT Nr. 156298
    Irgendwann kriegt Diätkanal auch Probleme mit dem Primärschlüssel.

    >>156241
    >>4294967296
  • [l] Felix Wed, 14 May 2025 08:45:49 GMT Nr. 156301
    >>156298
    Fastehh iech niiiisht.
  • [l] Felix Wed, 14 May 2025 10:08:40 GMT Nr. 156329
    >>156241
    >Der Primary Key einer Tabelle in der Datenbank hat seinen Maximalwert erreicht und keine Inserts sind mehr moeglich.
    >>156253
    >Ah, hier steht das mit dem primary key.
    Lustig. Aber interessanter wäre der Name des Datenbankprodukts, welches hier versagt hat.

    >>156301
    Der Beitrag in >>156298 will mit der Zahl "4294967296" aussagen, dass die Diätkanal-Software an irgendeiner Stelle die Benutzerbeiträge als Datensätze vorhält, deren Referenzierungs-Identität als 32-bittige vorzeichenlose Ganzzahl angegeben wird[0]. Das wird nach seiner Meinung zu Problemen führen. Tut es aber nicht, weil (wie auf jedem ordentlichen Bilderbrett) ältere Beiträge irgendwann einfach unter den Tisch fallen.

    --
    [0] 4294967296 = 2 hoch 32
  • [l] Felix Wed, 14 May 2025 10:12:35 GMT Nr. 156330
    >>156329
    >der Name des Datenbankprodukts, welches hier versagt hat.
    Ergänzend:
    PostGres ... (*peinlich*)
    https://www.redhat.com/en/blog/moved-quay-io-database-from-mysql-to-aurora-postgres
  • [l] Felix Wed, 14 May 2025 10:16:49 GMT Nr. 156333
    >>156241
    > erscheint mir gerade sehr unwahrscheinlich, dass die da ernsthaft genug Images drin haben, um den Wertebereich für ihren primary key komplett zu belegen.

    Relatiert:
    https://pganalyze.com/blog/5mins-postgres-integer-overflow
    https://www.crunchydata.com/blog/the-integer-at-the-end-of-the-universe-integer-overflow-in-postgres
  • [l] Felix Wed, 14 May 2025 10:22:56 GMT Nr. 156335
    >>156329
    >Tut es aber nicht, weil (wie auf jedem ordentlichen Bilderbrett) ältere Beiträge irgendwann einfach unter den Tisch fallen.
    Es ist im C-Kot zum Glück unsigned, und zwar ein uint64_t:
    https://gitgud.io/zuse/dietchan/-/blob/master/src/dietchan/persistence.c?ref_type=heads#L415

    Dann heißt es irgendwann als ob ;_;:
    >>18446744073709551614
    >>18446744073709551615
    >>0
  • [l] Felix Wed, 14 May 2025 10:23:50 GMT Nr. 156339
    JPG 563×905 60.4k
    >>156329
    >Das wird nach seiner Meinung zu Problemen führen. Tut es aber nicht, weil (wie auf jedem ordentlichen Bilderbrett) ältere Beiträge irgendwann einfach unter den Tisch fallen.
    Danke für die Erklärung. Führt mich aber zu einer Folgefrage: Du gehst also von einem Ringspeicher aus, und bei einem Überfluss fängt der Zähler einfach bei Null an? Hier im Diätkanal sind die Pfostennummern aber brettunabhängig, zwar fallen Pfosten auf /fefe/ nach +/- 3 Monaten unter den Tisch, auf /meta/ und /c/ aber nicht. Damit würde bei einem Ringspeicher irgendwann der Punkt erreicht, wo zwei Pfosten die gleiche Nummer haben würden - entweder müsste Zuse dann eine Funktion einfügen, die jedes Mal prüft, ob die Pfostennummer schon existiert, oder gleich von uint32 auf uint64 wechseln, was ja sowieso viel hardwarenäher wäre.
  • [l] Felix Wed, 14 May 2025 10:41:35 GMT Nr. 156347
    >>156339
    >Führt mich aber zu einer Folgefrage: Du gehst also von einem Ringspeicher aus,
    Ich gehe von fast gar nichts aus. Habe einfach von anderen Bilderbrettweichwaren auf diese hier geschlussfolgert. War zu faul in den Quelltext zu schauen, meine mich aber erinnern zu können, dass Meister Zuse sicher keine "handelsübliche" Datenbank benutzt.

    >und bei einem Überfluss fängt der Zähler einfach bei Null an?
    Das ist >>156335's Interpretation. Ich gehe einfach davon aus, dass das Anlegen von "Datensätzen" für neue Beiträge nicht (wie in >>156241) scheitert, weil alte Beiträge mit der gleichen "Identifikationsnummer" längst gelöscht worden sind. Dass dann irgendwann wieder ab 0 gezählt wird, ergibt sich lediglich daraus.

    >Hier im Diätkanal sind die Pfostennummern aber brettunabhängig, zwar fallen Pfosten auf /fefe/ nach +/- 3 Monaten unter den Tisch, auf /meta/ und /c/ aber nicht.
    Hoppala, das habe ich übersehen.
  • [l] Zuse ## Admin Wed, 14 May 2025 15:22:46 GMT Nr. 156428
    JPG 465×262 20.5k
    >>156347
    >War zu faul in den Quelltext zu schauen, meine mich aber erinnern zu können, dass Meister Zuse sicher keine "handelsübliche" Datenbank benutzt.
    Ja, die ist handgefrickelt. Im Grunde genommen ist das einfach nur ein Speicherabbild mit einem zusätzlichen Journal, um Atomizität zu gewährleisten, falls mal während eines Updates der Strom ausfällt oder so.

    Warum handgefrickelt? Dazu kleine Geschichtsstunde: Diätkanal entstand in den ganz früher Anfangsphasen von Kohlkanal, als jener noch vichan einsetzte, bei Cockbox gehostet war, und mit erheblichen Performanzproblemen zu kämpfen hatte. Es wurde damals über einen Umstieg auf Lynxchan nachgedacht, der ja später dann auch erfolgte, aber Zuse war und ist kein Freund von diesem Node+MongoDB-Geraffel (der Kot war zuminest damals auch absolut scheußlich) und es zirkulierte bereits das Mem, man könnte da doch was mit dietlibc, tinyldap und libowfat...

    Irgendwann hat Zuse das dann aus einer Laune heraus einfach mal eben schnell an einem Wochenende gemacht (so ungefähr), eigentlich als Witz. Der Anspruch von Diätkanal war eigentlich, so eine Art Anti-Lynxchan sein. Unter anderem deswegen gibt es hier ja auch kein JS, weder server- noch clientseitig. Eigentlich wollte Zuse damals auch stilecht tinyldap als Datenbank nehmen, aber dazu kam es nicht aus folgenden Gründen:

    - Zuse kapiert diesen LDAP-Scheiß nicht. Sich in LDAP einzuarbeiten hätte länger gedauert, als das ganze Brett zu programmieren, und hätte keinen Spaß gemacht.
    - tinyldap untersützte damals keine Löschvorgänge, war für ein Bilderbrett also absolut ungeeignet.
    - Es wurde nach anderen Alternativen gesucht: sqlite war immer noch zu bloatig, hätte den Fußabdruck um Größenordnungen erhöht. (sqlite umfasst alleine ungefähr 250k Zeilen, Diätkanal damals 9k). Und da das Brett natürlich dietlibc verwenden sollte, hätte sqlite natürlich aus der Quelle kompiliert werden müssen. Aber das hätte die Wahrscheinlichkeit, dass irgendwer diese Weichware tatsächlich ausprobiert, extrem verringert, weil niemand mal eben 250k Zeilen auditiert um zu prüfen, dass da nichts böses drin versteckt ist. Zuse wollte ursprünglich eigentlich nur die Weichware zeigen, das zugehörige Brett war gar nicht geplant und sollte eigentlich nur als Demo dienen, weil Zuse dachte, dass sich ohne Lebend-Demo das eh keiner anschaut.
    - BerkeleyDB wurde auch noch evaluiert, und Zuse hat sich ein paar Ideen dort abgeschaut, aber es schien einfacher, es einfach selbst zu implementieren.
    - Zuse wollte das schon immer mal machen.
    - Bei herkömmlichen Datenbanken hat man immer extrem viel Klebe-Kot zwischen der Datenbank und den klientseitigen Strukturen (Stichwort ORM, Active Record, etc.). Diätkanal sollte aber minimalistisch sein (was unter anderem eine möglichest geringe Zeilenanzahl bedeutet) und da schien es am einfachsten, einfach direkt die Strukturen aus dem Arbeitsspeicher wiederzuverwenden und auf die Platte zu schreiben.

    Vorteile dieses Ansatzes:
    - Es kommt tatsächlich mit relativ wenig Kot aus und funktioniert seit Jahren ziemlich zuverlässig. Ist auch tatsächlich schnell und hat wenig Overhead (kein zusätzlicher Datenbankprozess nötig, kein Parsen von SQL, keine Kommunikation über Sockets).

    Nachteile:
    - Man kann nicht mal eben das Schema ändern, weil es Binärdaten in einem festen Format sind.
    - Datenbank hat aufgrund des sehr einfachen Speicherallokators die Tendenz mit der Zeit zu fragmentieren, auch wenn das in der Praxis kein wirkliches Problem darstellt, weil die Datenbank auch dann immer noch recht klein ist. (Falls man die Datenbank doch mal defragmentieren möchte, kann man aber auch einfach nach JSON exportieren und anschließend wieder importieren, s.u.)
    - Die in den Speicher gemappten Seiten sind prinzipbedingt Copy-On-Write. Das heißt, die Anzahl der residenten Seiten steigt mit der Laufzeit des Diätkanal-Prozesses stetig an. Könnte man lösen, indem man in regelmäßigen Abständen die Datenbank neu reinmappt, wurde aber nie implementiert, weil der Speicherbedarf ohnehin so gering ist, dass es sich nicht lohnt.
    - Es gibt bisher nur die Möglichkeit, eine begonnene Transaktion zu committen, Rollback wurde nie implementiert, auch wenn es prinzipiell kein großes Kunststück sein sollte. Es besteht einfach nur kein Bedarf aktuell.
    - Man muss beim Programmieren etwas aufpassen, dass man bei Schreibzugriffen auch tatsächlich den geänderten Speicher invalidiert, damit der Inhalt ins Journal und schließlich in die Datenbank geschrieben wird. Ansonsten wäre der halt nach dem nächsten Neustart weg und man hätte eine zerfickte DB. Das ist aber nur an ein paar wenigen Stellen relevant, in 99% der Fälle regeln die Macros das automatisch. Aber ein C-Programm ohne Risiko wäre eben kein richtiges C-Programm.
    - Wie gesagt, Schema-Änderungen nicht einfach möglich, aber es war in den 7 Jahren Betriebszeit natürlich trotzdem mal hier und da nötig, ein neues Feld hinzuzufügen oder ähnliches. Deshalb wurde eine JSON-Import- und -Export-Möglichkeit hinzugefügt. Der Import und Export ist rasant schnell (dauert etwa 0ms), wurde aber von Hand nachträglich drangefrickelt und dadurch gibt es eine redundante Parallelstruktur. Man muss bei Änderungen an den Datenstrukturen also immer daran denken, auch den JSON-Import und -Export-Kot anzupassen. Vor einiger Zeit wurden in den meisten structs aber auch ein paar ungenutzte, reservierte Felder hinzugefügt, sodass das seltener notwendig sein sollte.
    - Zuse hatte immer mal überlegt, ob man diese Parallelstrukturen zwischen Datenbank und JSON mit cleveren Macros eliminieren könnte, die Lösungen waren am Ende aber immer irgendwie länger als der bestehende Kot, hatten ein paar Nachteile, und waren für Uninitiierte schwerer zu verstehen. Dietchan hat aber auch den Anspruch, leicht verständlichen Kot zu haben und von Dritten anpassbar zu sein (auch hier wieder Antithese zu Lynxchan, das Erweiterbarkeit/Anpassbarkeit über 9000 Steckeins löst).
    - Weil die Datenbank im Wesentlichen einfach nur ein Memory-Dump ist, ist sie Endian-abhängig. Man kann also nicht einfach die DB von einem Little-Endian- auf ein Big-Endian-System umziehen (oder umgekehrt), ohne vorher nach JSON zu exportieren und hinterher wieder zu importieren. In der Praxis nicht wirklich ein Problem, weil sowieso jeder vernünftige Mensch Little-Endian einsetzt, weil Big-Endian kernbehindert ist. Wer Big-Endian einsetzt, ist vogelfrei.
    - Die DB-Implementierung benutzt an ein paar Stellen Bitfields, was eigentlich keine gute Idee ist, weil deren Speicherlayout implementierungsabhängig ist. In der Praxis noch nie ein Problem gewesen, sollte man aber vielleicht mal ändern. Zuse war aber bisher zu faul.

    Alles in allem funktioniert es aber immer noch sehr gut. Aktuell residenter Speicher von dietchan: 10.7m. Und das umfasst alles.jpg, nicht nur die DB (auch wenn der Großteil davon die DB sein dürfe). Mach das mal mit MySQL, Postgres, MongoDB o.ä. Siehe auch >>1. Da hat sich eigentlich nicht viel geändert seitdem. Bei den vichan-Bankmarken dort hat Zuse damals sogar vergessen, die MySQL-Datenbank miteinzuberechnen. (Und die extrem geringe Latenz kam auch nur daher, dass dort nur Lesezugriffe getestet wurden und vichan statische Seiten generiert, d.h. ist eigentlich nur die Performanz von nginx bzw. sendfile(), während bei Diätkanal alles dynamisch generiert wird. Also nicht mal ein fairer Vergleich. Die schlechte Performanz beim Kohlkanal kam damals auch durch die vielen Schreibzugriffe und dass dadurch für jeden neuen Pfosten zig HTML-Seiten neu generiert weren mussten).

    >>156339
    >Hier im Diätkanal sind die Pfostennummern aber brettunabhängig,
    Ja, das hat sich auch eher zufällig so ergeben. D hatte Zuse damals schlicht nicht dran gedacht, dass die bei klassischen Brettern ja pro-Brett sind. Allerdings hat letzteres wohl auch bloß historische Gründe: Die allerersten Brettweichwaren waren irgendwelche Perl-Skripte, bei denen man tatsächlich für jedes Unterbrett einen Ordner angelegt hat und das Skript in jeden Ordner einzeln reinkopiert hat. Eigentlich macht eine globale ID mehr Sinn, hat auch den Vorteil, dass man einen Faden leicht in ein anderes Brett verschieben kann, ohne irgendwas am Pfostentext anpassen zu müssen.

    >entweder müsste Zuse dann eine Funktion einfügen, die jedes Mal prüft, ob die Pfostennummer schon existiert, oder gleich von uint32 auf uint64 wechseln, was ja sowieso viel hardwarenäher wäre.
    Wie >>156335 bereits schrieb nicht notwendig, da alle IDs von Anfang an bereits uint64 sind. Bis das überläuft, existiert unsere Zivilisation schon lange nicht mehr.
  • [l] Felix Wed, 14 May 2025 15:31:19 GMT Nr. 156431
    >>156428
    >kein JS, weder server- noch clientseitig
    So sympathisch.
  • [l] Späßle! Felix Thu, 15 May 2025 08:30:57 GMT Nr. 156481
    >>156428
    >- tinyldap untersützte damals keine Löschvorgänge,
    Oha, Insert-Fehler in fefes-Blog demnächst, wann?
  • [l] Felix Thu, 15 May 2025 08:58:40 GMT Nr. 156487
    >>156481
    Erinnerung daran:
    >Inzwischen haben tinyldap und mein Blog auch Schreibzugriff implementiert. Das Blog sagt dann halt dem tinyldap, es will was ändern, und tinyldap hängt die Änderung an das Journal an.
    >Wenn irgendwo was schiefgeht, kann ich das journal mit einem normalen Texteditor reparieren. Leider habe ich mir angewöhnt, bevor das Blog ein Ändern-Interface hatte, Updates von Hand mit vim im Journal einzupflegen. Wenn ich dabei die Syntax kaputtmache, dann wirft tinyldap beim Starten einen Fehler und das Blog sagt "ldapbind failed".
    https://blog.fefe.de/?ts=9d387c92
  • [l] Felix Thu, 15 May 2025 20:49:55 GMT Nr. 156619
    >>156428
    >einfach direkt die Strukturen aus dem Arbeitsspeicher wiederzuverwenden und auf die Platte zu schreiben.
    Also könnte ich hier theoretisch ein Binary ins feld pfrengen und auf dem servierer auf die Platte legen?
  • [l] Felix Thu, 15 May 2025 22:05:48 GMT Nr. 156622
    ELF>@@�4@8@@@@���@@ee ���-�=�=HP�-�=�=��PPP@@���$$� � � S�tdPPP@@P�td   $$Q�tdR�td�-�=�=000GNU����GNUh�
    8Y�y�ۙ$ފ[n�d9J�/lib64/ld-linux-x86-64.so.2J "f u "__libc_start_main__cxa_finalizeprintflibc.so.6GLIBC_2.2.5GLIBC_2.34_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTable)ui 3���?�=0�=�@@�?�?�?�?�?@��H��H��/H��t��H����5�/�%�/@�%�/h�������1�I��^H��H���PTE1�1�H�=��[/�f.�H�=�/H��/H9�tH�>/H��t �����H�=q/H�5j/H)�H��H��?H��H�H��tH�
    /H��t��fD�����=-/u3UH�=�.H��t
    H�=/��.�c����/]�f.��ff.�@���g���UH��H��H�Ǹ������]���H��H���Hello, World!;  ���T,���<%���|zRx �����&D$4���� FJ w�?;*3$"\����A�C
    Z GNU0�) 
    X�=�=���o���
    � �?(h� ���o���o8���o���o(���o�=6@GCC: (GNU) 15.1.1 20250425�����= $�?:W � @s@zX��@� �@� � @�
    @&�@�
    9�@� "" test.c_DYNAMIC__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE___libc_start_main@GLIBC_2.34_ITM_deregisterTMCloneTable_edata_finiprintf@GLIBC_2.2.5__data_start__gmon_start____dso_handle_IO_stdin_used_end__bss_startmain__TMC_END___ITM_registerTMCloneTable__cxa_finalize@GLIBC_2.2.5_init.symtab.strtab.shstrtab.note.gnu.property.note.gnu.build-id.interp.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.note.ABI-tag.init_array.fini_array.dynamic.got.got.plt.data.bss.commentPP@.��$A��I���o��S ���[���c���o((p���o880hh��B((��   �@@�XX
    � �  $�8 8 |�� � ��=�-��=�-��=�-���?�/(��?�/ @0@0
    0080@ x2(�3
  • [l] Felix Thu, 15 May 2025 22:32:10 GMT Nr. 156624
    >>156619
    >>156622
    Joa, theoretisch schon, aber das liegt dann halt irgendwo in der Mitte von einer größeren Datei, die außerdem nicht ausführbar ist. Wir setzten hier ja kein Schlangenöl ein, das bei so einer "Gefahr" die ganze Datei gleich in die "Quarantäne" schiebt.
  • [l] Felix Sat, 17 May 2025 10:51:41 GMT Nr. 156703
    >>156624
    Ich muss als nur warten, bis die Datei kaputt ist, und dann den ersten Pfosten absetzen, sodass ich am Anfang der neuen Datei stehe. Wäre doch gelacht, wenn ich das nicht schaffen würde!


[Zurück]
[c] [meta] [fefe] [erp]