==[ DevChat-3 ]==
Toteutetaan Lock-free RAM -tietokannan laajennus graafisidoksille
(relaatioille) noudattaen DESIGN.md -mC$C$rityksiC$ (RELATIONSHIP_BINDINGS,
ATOMIC_POINTER_DIRECTORY, ASCII_IDENTIFIERS).
Keskeiset arkkitehtuurimuutokset:
ATOMIC_POINTER_DIRECTORY: Olioiden hakemistorakenne laajennetaan 16 tavuun: [
UID_LOW (4B) | UID_HIGH (4B) | DATA_OFFSET (4B) | BINDINGS_OFFSET (4B) ] (4
Uint32).
Graafisidokset (Bindings Log): Relaatiot tallennetaan linkitettynC$ listana /
lokikirjauksina muotoon [ TARGET_UID (8B) | TYPE_LEN (1B) | TYPE_ASCII |
PREV_BINDING_OFFSET (4B) ].
Uudet OP-koodit: OP_LINK (0x07) ja OP_UNLINK (0x08).
Lock-Free Direct Read: API Gateway ja kyselyrajapinnat lukevat olion datan ja
suorat relaatiot vC$littC6mC$sti SharedArrayBufferista ilman worker-jonoa.
==[ /DevChat-3 ]==
SEIS! ClC$ vielC$ tallenna kaikkea sokeasti levylle! (
KC$vin juuri koodin lC$pi suurennuslasilla, ja tC$ssC$ kC$vi klassinen
"tekoC$lyn amnesia". Vaikka DevChat-3 teki aivan mestarillista tyC6tC$ itse
ytimen (core.js) graafialgoritmien kanssa, se unohti tC$ysin aiemmat
saavutuksemme tiedostoissa app.js ja api-gateway.js.
Jos kopioit DevChat-3:n app.js:n ja api-gateway.js:n sellaisenaan, menetC$t
juuri rakentamamme Snapshot-ominaisuuden, O(1) Key-Value -hakureitin sekC$ sen
kuuluisan 128-tavun otsikkokorjauksen (joka kaataa Worker 1:n
vC$littC6mC$sti).
Mutta ei hC$tC$C$! Itse graafiarkkitehtuuri core.js:ssC$ on tC$ydellinen.
Atomics.compareExchange -operaation kC$yttC6 linkitetyn listan pC$C$n (head)
pC$ivittC$miseen (bindingsOffset) on oppikirjaesimerkki huippuunsa
viritetystC$ lock-free -ohjelmoinnista.
TehdC$C$n tC$mC$ kirurgisesti oikein, jotta NetBurst-arkkitehtuurilla
hyrrC$C$vC$ graafimoottorisi pysyy vakaana.
Integraatio-ohjeet (Tee nC$mC$ tarkasti):
1. core.js ja worker.js (Voit ylikirjoittaa turvallisesti)
DevChat-3 onnistui yhdistC$mC$C$n core.js -tiedostoon kaikki aiemmat
ominaisuudet (Snapshotien vaatiman getSharedArrayBuffer -metodin ja keyIndex
-rakenteet).
* Kopioi ja korvaa kokonaan nykyiset /opt/lockfree-ram-db/core.js ja
/opt/lockfree-ram-db/worker.js DevChat-3:n antamilla versioilla.
2. app.js (CLC KOSKE)
* PidC$ nykyinen /opt/lockfree-ram-db/app.js tC$ysin ennallaan! SiellC$ on
Snapshot-ajastimet ja Workerien vC$ylien muistikoordinaatit tC$ydellisessC$
iskussa.
3. api-gateway.js (PC$ivitetC$C$n kC$sin)
Avaa nykyinen /opt/edge/api-gateway.js ja tee vain nC$mC$ kaksi tC$smC$iskua:
A) PC$ivitC$ tiedoston alkupC$C$ssC$ oleva require-rivi tukemaan uusia
OP-koodeja:
const { OP_INSERT, OP_UPDATE, OP_DELETE, OP_GET, OP_LINK, OP_UNLINK } =
require('../lockfree-ram-db/core.js');
B) LisC$C$ uudet relaatioreitit juuri ennen // UPDATE DOCUMENT -kohtaa:
// CREATE RELATION (LINK)
fastify.post('/api/v1/relations', {
schema: {
description: 'Luo graafisidos (relaatio) kahden UID:n
vC$lille',
tags: ['Relations'],
body: {
type: 'object',
required: ['fromUid', 'toUid'],
properties: {
fromUid: { type: 'string', pattern: '^[a-zA-Z0-9_]+$'
},
toUid: { type: 'string', pattern: '^[a-zA-Z0-9_]+$' },
type: { type: 'string', pattern: '^[a-zA-Z0-9_]+$',
default: 'relates_to' },
bidirectional: { type: 'boolean', default: false }
}
}
}
}, async (request, reply) => {
try {
const { fromUid, toUid, type = 'relates_to', bidirectional =
false } = request.body;
const result = await execCommand(OP_LINK, { fromUid, toUid,
type, bidirectional });
if (!result.success) return reply.code(400).send({ error:
"Failed to link nodes (Invalid UIDs)" });
return reply.code(201).send({ success: true, fromUid, toUid,
type });
} catch (err) {
return reply.code(500).send({ error: err.message });
}
});
// DELETE RELATION (UNLINK)
fastify.delete('/api/v1/relations', {
schema: {
description: 'Poista graafisidos kahden UID:n vC$liltC$',
tags: ['Relations'],
body: {
type: 'object',
required: ['fromUid', 'toUid'],
properties: {
fromUid: { type: 'string', pattern: '^[a-zA-Z0-9_]+$'
},
toUid: { type: 'string', pattern: '^[a-zA-Z0-9_]+$' },
type: { type: 'string', pattern: '^[a-zA-Z0-9_]+$' }
}
}
}
}, async (request, reply) => {
try {
const { fromUid, toUid, type } = request.body;
const result = await execCommand(OP_UNLINK, { fromUid, toUid,
type });
if (!result.success) return reply.code(404).send({ error:
"Relation or node not found" });
return reply.code(200).send({ success: true, fromUid, toUid
});
} catch (err) {
return reply.code(500).send({ error: err.message });
}
});
Loppuhuipennus: Graafin testaus
Kun olet tallentanut nuo muutokset, kC$ynnistC$ Gateway (./start.sh) ja
kokeillaan luoda oikea verkosto!
Aja nC$mC$ komennot toisessa terminaalissa:
1. Luodaan tehdas ja kaksi sensoria:
curl -X POST http://localhost:3000/api/v1/namespaces/sys/documents -H
"Content-Type: application/json" -d '{"name":"Laitos_A"}' && echo
curl -X POST http://localhost:3000/api/v1/namespaces/sys/documents -H
"Content-Type: application/json" -d '{"sensor":"temp_1"}' && echo
curl -X POST http://localhost:3000/api/v1/namespaces/sys/documents -H
"Content-Type: application/json" -d '{"sensor":"temp_2"}' && echo
(Oletetaan, ettC$ saat UID:t 2, 3 ja 4. EnsimmC$inen aiempi p4_temp oli UID 1)
2. LinkitetC$C$n sensorit laitokseen (UID 2 -> 3 ja 2 -> 4):
curl -X POST http://localhost:3000/api/v1/relations -H "Content-Type:
application/json" -d '{"fromUid":"2","toUid":"3","type":"has_sensor"}' && echo
curl -X POST http://localhost:3000/api/v1/relations -H "Content-Type:
application/json" -d '{"fromUid":"2","toUid":"4","type":"has_sensor"}' && echo
3. Testataan Lock-free Direct Read -graafihakua:
curl http://localhost:3000/api/v1/documents/2 && echo
Jos kaikki meni oikein, tC$mC$n viimeisen haun pitC$isi lennC$htC$C$ muistista
ulos palauttaen Laitos A:n datan JA uuden relations -taulukon, josta nC$et
suorat kytkC6kset sensoreihin.
MiltC$ tuloste nC$yttC$C$?