Costruito dai Primi Principi
Nessun runtime. Nessun garbage collector. Nessun overhead di framework. Ogni riga di Flashstor è scritta in C11 per il massimo controllo su memoria, I/O e risorse di sistema.
Fondamenta Tecnologiche
Quattro pilastri di eccellenza ingegneristica
Ciclo di Vita della Richiesta
Ogni richiesta S3 segue una pipeline deterministica a quattro fasi
Accettazione e Parsing
La event loop accetta la connessione tramite epoll/kqueue. Gli header HTTP vengono analizzati in buffer arena pre-allocati. Timeout anti-slowloris applicato alla ricezione degli header. La richiesta viene instradata al gestore tramite tabella di dispatch.
Autenticazione e Autorizzazione
Firma SigV4 verificata con CRYPTO_memcmp timing-safe. Policy IAM valutate nel contesto della richiesta con cache epoch per thread (hit rate quasi 100% su connessioni keep-alive). Token STS validati.
Esecuzione e Risposta
L'operazione viene inviata al gestore. I dati vengono frammentati tramite routing CRC32, codificati con erasure coding ISA-L SIMD e scritti sui dischi in parallelo tramite pool di thread I/O. La risposta viene assemblata con invio zero-copy writev().
Pulizia e Riciclo
L'allocatore arena libera in blocco tutta la memoria per-richiesta in una singola operazione — zero chiamate free() individuali. La connessione viene restituita alla event loop per il riutilizzo keep-alive. Voce di audit log asincrona accodata nel ring buffer SPSC lock-free.
Allocazione Arena: Zero Frammentazione per Design
Ogni connessione ottiene un allocatore arena dedicato con blocchi riutilizzabili da 64 KiB. Tutte le allocazioni per-richiesta avvengono all'interno dell'arena. Quando la richiesta è completata, l'intera arena viene resettata in O(1) — nessuna chiamata free() per oggetto, nessuna frammentazione, nessun GC.
- Blocchi arena da 64 KiB — riutilizzati tra le richieste, mai restituiti al SO
- ~75 KiB di base per connessione (arena + buffer I/O)
- Deallocazione in blocco al completamento della richiesta — singolo reset del puntatore
- Modalità debug: tracciamento per-allocazione con rilevamento perdite
Architettura Cluster Distribuita
Erasure set distribuiti tra i nodi con consenso basato su quorum
Nodo Gateway
Accetta richieste S3 API, esegue autenticazione SigV4, instrada le operazioni verso l'erasure set corretto tramite hashing deterministico basato su CRC32.
Nodo Storage
Gestisce i dischi locali con implementazione vtable xl_storage. Gestisce erasure coding, verifica bitrot e I/O a livello di shard con operazioni disco parallele.
Nodo Peer
Storage remoto accessibile tramite vtable rest_storage su HTTP. Partecipa al locking distribuito, quorum dei metadati e replica tra nodi.
Canali di Comunicazione
Modello di Separazione dei Privilegi
Flashstor segue il principio del minimo privilegio con un ciclo di vita della sicurezza a quattro fasi che minimizza la superficie di attacco a runtime.
Inizializzazione come Root
- • Bind della porta privilegiata (es. 443 per HTTPS)
- • Caricamento certificati TLS da --certs-dir
- • Inizializzazione tabelle di dispatch ISA-L SIMD
Rilascio dei Privilegi
- • Passaggio a FLASHSTORE_RUN_USER / FLASHSTORE_RUN_GROUP
- • Impostazione PR_SET_NO_NEW_PRIVS su Linux (impedisce la ri-escalation)
- • Utilizzo del modello capabilities su SunOS/illumos
Hardening a Runtime
- • RELRO completo — nessuna voce GOT scrivibile dopo l'avvio
- • -fstack-protector-strong con protezione stack canary
- • Control-Flow Integrity (-fcf-protection su x86_64)
- • -D_FORTIFY_SOURCE=3 per il rilevamento di buffer overflow
Audit e Monitoraggio
- • Log di audit JSON asincroni tramite ring buffer SPSC lock-free
- • ID di traccia per-richiesta con tempi delle operazioni
- • Metriche Prometheus per eventi rilevanti per la sicurezza
Domande Tecniche? Parliamo di Architettura.
Il nostro team è disponibile per discussioni tecniche approfondite su gestione della memoria, modelli I/O, sicurezza e progettazione di sistemi distribuiti.