Download Game! Currently 55 players and visitors. Last logged in:DeinoWhlxchVaykkyFloppy

Blitzer's Blog >> 71927

Back to blogs index
Posted: 01 Sep 2026 02:54 [ permalink ]
==[ DevChat-1 ]==
BRakenne ja muutosten periaateC
Core:n SAB ja vCB$ylien SAB on erotettu toisistaan.
Aiemmin app.js loi yhden ison SAB:n, mutta core loi silti oman erillisen SAB:n
(bugi). Nyt core kCB$yttCB$CB$ sille annettua SAB:ta, ja vCB$ylCB$t
kCB$yttCB$vCB$t erillistCB$ SAB:ta. TCB$mCB$ yksinkertaistaa snapshotin:
tallennetaan vain core:n SAB, ei viestintCB$puskureita.

Snapshot on binCB$CB$ridumppi koko core:n SAB:sta.
takeSnapshot() lukee this.core.getSharedArrayBuffer() ja kirjoittaa sen
suoraan snapshot.bin-tiedostoon. Ei JSON-serialisointia eikCB$ erillistCB$
muuntamista C" raaka muisti kopioidaan levylle. TCB$mCB$ on nopeaa ja vastaa
DESIGN.md:n ZERO_COPY_SNAPSHOTS-ajatusta.

Fast Recovery lataa snapshotin ennen core:n alustusta.
init() tarkistaa ensin snapshot.bin:n. Jos se lCB6ytyy, se luetaan
Buffer-muotoon ja kopioidaan uuteen SharedArrayBuffer-objektiin. TCB$mCB$ SAB
annetaan OmegaCore-konstruktorille loadFromSnapshot: true -lipun kanssa.
TCB$llCB6in core ei nollaa header-tietoja, hash-taulua tai log-offsetia, vaan
jatkaa siitCB$ tilasta, joka snapshotissa oli.

Snapshot-ajastin kCB$ynnistetCB$CB$n automaattisesti.
startSnapshotTimer(10000) kCB$ynnistCB$CB$ setInterval-funktion, joka kutsuu
takeSnapshot() 10 sekunnin vCB$lein. Voit sCB$CB$tCB$CB$ SNAPSHOT_INTERVAL_MS-v
akiota app.js:n alussa.

2. KCB$yttCB6CB6notto
Korvaa core.js ja app.js yllCB$ olevilla pCB$ivitetyillCB$ versioilla.

Varmista, ettCB$ ring-buffer.js ja worker.js ovat ennallaan (ei tarvitse
muuttaa).

KCB$ynnistCB$ sovellus normaalisti: node app.js.

EnsimmCB$isellCB$ kCB$ynnistyksellCB$ snapshot.bin ei ole olemassa C" luodaan
tyhjCB$ SAB.

Sovellus alkaa ottaa snapshotin 10 sekunnin vCB$lein.

Kun pysCB$ytCB$t sovelluksen (Ctrl+C), shutdown() ottaa vielCB$ viimeisen
snapshotin ennen sammumista.

KCB$ynnistCB$ sovellus uudelleen:

init() havaitsee snapshot.bin:n, lataa sen ja core jatkaa siitCB$ tilasta,
johon jCB$CB$tiin.

Kaikki aiemmin tallennetut oliot (UID:t, data) ovat edelleen kCB$ytettCB$vissCB
$.

3. Huomioita
Snapshotin eheys: Koska core on lock-free, snapshot voi teoriassa jCB$CB$dCB$
hieman epCB$johdonmukaiseksi, jos kirjoitus tapahtuu samaan aikaan. TCB$mCB$
on hyvCB$ksytty suunnitteluperiaate (ZERO_COPY_SNAPSHOTS). KCB$ytCB$nnCB6ssCB$
riski on pieni, ja seuraava snapshot korjaa tilan.

Levytila: Tallennetaan koko core:n SAB (oletuksena 64 Mt). Voit pienentCB$CB$
bufferSize-parametria OmegaServer-konstruktorissa, jos haluat pienemmCB$n
snapshotin.

Atominen kirjoitus: takeSnapshot() kirjoittaa ensin .tmp-tiedostoon ja sitten
rename-komennolla korvaa varsinaisen tiedoston. TCB$mCB$ estCB$CB$
rikkinCB$isen snapshotin syntymisen, jos sovellus kaatuu kesken kirjoituksen.

Suorituskyky: Snapshotin ottaminen kopioi koko SAB:n muistissa
(Buffer.from(sab)) ja kirjoittaa sen levylle. TCB$mCB$ vie hetken (riippuen
levyn nopeudesta), mutta se tapahtuu taustalla eikCB$ estCB$ muita
operaatioita. Voit tarvittaessa siirtCB$CB$ snapshotin toiseen sCB$ikeeseen,
mutta tCB$mCB$ on riittCB$vCB$ MVP:lle.

4. Mahdolliset jatkokehitykset
Osittainen snapshot: Tallentaa vain logOffset-arvoon asti ulottuvan osan,
jolloin tiedostokoko pienenee. Vaatisi metadatan tallentamista (esim.
SAB-koko, logOffset) recoveryCB$ varten.

Inkrementaalinen varmuuskopiointi: HyCB6dyntCB$CB$ APPEND_ONLY_LOG-rakennetta
ja tallentaa vain uudet muutokset snapshotien vCB$lillCB$.

Kompression kCB$yttCB6: Pakkaa snapshot ennen levylle kirjoitusta tilan
sCB$CB$stCB$miseksi.

NCB$mCB$ muutokset toteuttavat pyydetyt ominaisuudet ja noudattavat
DESIGN.md:n arkkitehtuuria.
==[ /DevChat-1 ]==

user@elli:/opt/lockfree-ram-db$ ls -ltra
total 116
-rw-r--r-- 1 user userB 4903 Aug 31 15:43 ring-buffer.jsC
-rw-r--r-- 1 user userB 2979 Aug 31 15:51 worker.jsC
-rw-r--r-- 1 user userB 1512 Aug 31 15:52 test.jsC
-rwxr-xr-x 1 user userB B176 Aug 31 15:53 install.shCC
-rw-r--r-- 1 user user 16902 Aug 31 15:59 test-suite.js
-rw-r--r-- 1 user userB B426 Aug 31 16:00 package.jsonCC
-rwxr-xr-x 1 user userB B554 Aug 31 16:00 run-tests.shCC
-rw-r--r-- 1 user userB 2113 Aug 31 16:11 debug.jsC
-rw-r--r-- 1 user userB 2279 Aug 31 16:19 debug-offset.jsB B B B -rw-r--r-- 1
user userB 1589 Aug 31 16:23 test-report.jsonB B B Bdrwxr-xr-x 2 user userB
4096 Aug 31 16:23 .CCCCCCCCCCC
-rw-r--r-- 1 user userB 2742 Aug 31 16:23 test.logB B B B B B B B-rw-r--r-- 1
user user 18361 Aug 31 19:02 DESIGN.mdB B B B B B B drwxrwxrwx 6 root rootB
4096 SepB 1 02:48 ..CCCCCCCCCCCCCCCCCC
-rw-r--r-- 1 user user 13671 SepB 1 02:49 core.jsC
-rw-r--r-- 1 user userB 7771 SepB 1 02:49 app.jsCC
user@elli:/opt/lockfree-ram-db$