feat: Implement distributed database using Mycelium

- Refactor database streamer to support multiple workers.
- Add master node to manage and distribute data updates.
- Implement worker nodes to receive and apply updates.
- Remove unnecessary slave node.
- Improve error handling and logging.
- Use base64 encoding for JSON compatibility in data transfer.
This commit is contained in:
Mahmoud Emad
2025-03-03 12:19:03 +02:00
parent 71906fd891
commit 368edcd93a
4 changed files with 144 additions and 70 deletions

View File

@@ -1,16 +1,33 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.data.ourdb
import time
// Known worker public key
worker_public_key := '46a9f9cee1ce98ef7478f3dea759589bbf6da9156533e63fed9f233640ac072c'
mut streamer := ourdb.new_streamer(incremental_mode: false)!
streamer.add_worker(worker_public_key)! // Mycelium public key
// Create master node
mut streamer := ourdb.new_streamer(
incremental_mode: false
server_port: 9000 // Master uses default port
is_worker: false
)!
println('Starting master node...')
// Add worker to whitelist and initialize its database
streamer.add_worker(worker_public_key)!
// Write some test data
id := streamer.write(id: 1, value: 'Record 1')!
println('Wrote record with ID: ${id}')
println('ID: ${id}')
// Verify data in master
master_data := streamer.read(id: id)!
master_data_str := master_data.bytestr()
println('Master data: ${master_data_str}')
// Keep master running to handle worker connections
for {
time.sleep(1 * time.second)
}

View File

@@ -1,56 +0,0 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.clients.mycelium
import freeflowuniverse.herolib.installers.net.mycelium_installer
import freeflowuniverse.herolib.data.ourdb
import freeflowuniverse.herolib.osal
import time
import os
import encoding.base64
import json
// TODO: Make the worker read the data from the streamer instead.
const slave_port = 9000
const master_public_key = '89c2eeb24bcdfaaac78c0023a166d88f760c097c1a57748770e432ba10757179'
const master_address = '458:90d4:a3ef:b285:6d32:a22d:9e73:697f'
mycelium.delete()!
// Initialize mycelium clients
mut slave := mycelium.get()!
slave.server_url = 'http://localhost:${slave_port}'
slave.name = 'slave_node'
// Get public keys for communication
slave_inspect := mycelium.inspect(key_file_path: '/tmp/mycelium_server1/priv_key.bin')!
println('Server 2 (slave Node) public key: ${slave_inspect.public_key}')
// Initialize ourdb instances
mut worker := ourdb.new(
record_nr_max: 16777216 - 1
record_size_max: 1024
path: '/tmp/ourdb1'
reset: true
)!
defer {
worker.destroy() or { panic('failed to destroy db1: ${err}') }
}
// Receive messages
// Parameters: wait_for_message, peek_only, topic_filter
received := slave.receive_msg(wait: true, peek: false, topic: 'sync_db')!
println('Received message from: ${received.src_pk}')
println('Message payload: ${base64.decode_str(received.payload)}')
payload := base64.decode(received.payload)
println('Payload: ${payload.str()}')
worker.sync_updates(received.payload.bytes()) or {
error('Failed to sync updates to worker due to: ${err}')
}
// Get last index
last_index := worker.get_last_index()!
println('Last index: ${last_index}')

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.data.ourdb
// Create a worker node with a unique database path
mut streamer := ourdb.get_streamer(id: 'frBvtZQeqf') or {
ourdb.new_streamer(
incremental_mode: false
server_port: 9001 // Use different port than master
is_worker: true
)!
}
println('Starting worker node...')
println('Listening for updates from master...')
streamer.listen()! // This will keep running and listening for updates