Blog ·
Un export che si può verificare
Un export di dati come compito duraturo: un file temporaneo rinominato, uno sha256 nella ricevuta, un gettone monouso e una cartella in due ruoli distinti.
Di Provibr
L’articolo 20 del regolamento europeo sulla protezione dei dati dà a una persona il diritto di ricevere i propri dati. Su una piattaforma di hosting non è un file piccolo. Un export di organizzazione legge circa settanta sezioni, ciascuna limitata a venticinquemila righe, e richiede minuti anziché millisecondi.
Fino a poco tempo fa il nostro veniva costruito dentro un’azione server: una richiesta web assemblava il tutto in memoria e lo restituiva come un’unica stringa nella risposta. Funziona fino all’account in cui smette di funzionare, e quell’account è proprio quello che ne ha più bisogno.
È un compito, e c’è una sola via
Un export è ora un’operazione duratura con quattro fasi: in coda, raccolta, confezionamento, pronto. Un lavoratore nel gateway lo prende ogni trenta secondi, blocca una riga, costruisce le sezioni, scrive il file e restituisce un gettone.
Quattro numeri tengono insieme il tutto, e ciascuno è una decisione e non un valore predefinito.
| Limite | Valore | Perché proprio quello |
|---|---|---|
| Righe per sezione | 25.000 | Oltre è un rapporto e non una richiesta di accesso, e il taglio viene nominato anziché nascosto |
| Collegamento di scarico | 24 ore | Abbastanza per ritirarlo, poco perché un vecchio collegamento in una casella valga qualcosa |
| Il file su disco | 7 giorni | È una copia completa di tutto ciò che deteniamo, e non deve diventare un archivio |
| La traccia di ciò che è stato consegnato | 90 giorni | La prova che un diritto è stato esercitato sopravvive al file che ha prodotto |
La vecchia via sincrona non è rimasta come scorciatoia per gli account piccoli, e questa è stata una decisione consapevole e non pigrizia.
Due vie sono due verità. Quale delle due giri dipenderebbe da una stima fatta prima, e la stima che conta qui è questo account è piccolo, che è esattamente ciò che non si può sapere prima di aver contato le sezioni. Se sbaglia, l’export cade sulla via dove non c’è rete.
Due vie sono anche due generi di prova. La riga di controllo, la ricevuta con dentro una somma di verifica e l’elenco delle sezioni troncate esistono solo sulla via del compito. Un export piccolo verrebbe consegnato in silenzio senza nulla di tutto ciò, e la domanda che cosa abbiamo consegnato a marzo riceverebbe una risposta dipendente da quanto fosse grande l’account allora.
Il prezzo è un clic in più, e quel clic ci sarebbe stato comunque: il lavoro lungo appartiene al cassetto dei compiti, ed è lì che sta ora, con una barra di avanzamento anziché un browser che per due minuti non fa nulla.
Dove il codice doveva stare
I costruttori si sono spostati dall’applicazione web al pacchetto che possiede gli accessi al database. Non era un riordino. L’immagine del gateway copia il gateway e i pacchetti condivisi e non copia la cartella web, quindi un import che arriva a web/lib compila in locale e manca in produzione. È un confine misurato e non una questione di stile.
L’operazione di export porta inoltre il tipo di risorsa account, ed è il primo senza modulo. Ogni altra operazione duratura riguarda un server, un agente, un pezzo di hardware o un’automazione, e ciascuno ricade sotto un modulo di permessi che decide chi può vederla. Un export di account non ricade sotto nessuno: l’insieme di permessi di un membro porta diritti e non identità. La visibilità si risolve chiedendo se chi guarda è chi lo ha richiesto, e il canale in diretta risponde di no a tutti gli altri.
Un file temporaneo, poi una rinomina
Il file viene scritto come <nome>.part e poi rinominato al suo posto. Una rinomina dentro una stessa cartella è atomica, quindi chi legge non può mai ottenere mezzo file, e mezzo file è peggio di nessun file: porta una somma di verifica che non torna e nulla che dica perché.
La somma di verifica è uno sha256 dei byte, e sta accanto alla dimensione nella ricevuta. È ciò che rende l’export verificabile anziché semplicemente consegnato. Chi ha il file fra un anno può ancora dimostrare che è il file che abbiamo prodotto.
La cartella è un punto di innesto appeso a due container: in lettura e scrittura nel gateway, che scrive, e in sola lettura nell’applicazione web, che serve. Due processi, due ruoli, una cartella.
Quell’innesto si dimentica facilmente, e dimenticarlo produce un quadro di guasto molto particolare e molto sviante. Il compito dice pronto. Lo scarico risponde 410. Nulla nel registro dice cartella sbagliata, perché dal punto di vista di ciascuno dei due processi tutto ha funzionato. Il codice perciò avvisa una volta, ad alta voce, se la cartella non è configurata, e il ripiego è un percorso accanto al deposito e non la cartella temporanea di sistema: un file lì sparisce a un riavvio, e allora una riga che dice pronto per lo scarico punta al nulla.
Il gettone è monouso, e monouso è una sola istruzione
Il collegamento di scarico porta un gettone valido ventiquattro ore, mentre il file stesso resta sette giorni.
Servono entrambi i limiti. Il solo monouso lascerebbe un gettone utilizzabile per mesi finché nessuno lo preme. La sola scadenza lo renderebbe riutilizzabile per un giorno da chiunque veda l’indirizzo: un registro di intermediario, una cronologia di navigazione, una casella condivisa. Chi arriva tardi chiede un nuovo export, e questo costa un minuto e dà una copia fresca e corretta anziché un collegamento che gira per una settimana in una posta.
Il chiavistello che impone davvero l’uso singolo non è la marca temporale. È una sola istruzione condizionata: aggiorna la riga, poni l’ora di scarico, dove l’ora di scarico è ancora vuota. Due richieste contemporanee con lo stesso gettone toccano insieme esattamente una riga e la seconda ne riceve zero. Controllare e poi scrivere sarebbero due istruzioni e quindi due occasioni per infilarsi in mezzo.
Il gettone da solo non basta nemmeno. Chi chiama passa la persona autenticata, e quella deve essere chi ha richiesto l’export, ed è per questo che quella rotta gira sotto la regola di sessione e non sotto quella dei gettoni. E il controllo di proprietà precede ogni altro rifiuto: chi non dovrebbe avere il gettone non deve nemmeno apprendere da esso se l’export è scaduto o già ritirato.
Sette giorni per il file sono corti di proposito. Il file è una copia completa di tutto ciò che deteniamo su una persona o un’organizzazione, e finché esiste è un secondo luogo in cui tutto ciò si trova. Un salvataggio se lo porta via, e la scrupolosa lista consentita che decide cosa entra in un export ha fatto il suo lavoro nel momento in cui il file è stato scritto e dopo non protegge più nulla. Non è affatto un termine di conservazione dei dati stessi, che stanno nel database con le proprie regole. È il termine di una copia.
Il troncamento è un controllo aperto, non una nota a piè di pagina
Ogni sezione si ferma a venticinquemila righe. Una sezione che ha toccato quel tetto viene nominata nella busta e compare nella ricevuta come controllo aperto: qualcosa su cui chi legge dovrebbe agire, accanto al risultato e non sepolto dentro. Un export che si fermasse in silenzio al tetto sarebbe una risposta a una richiesta di accesso incompleta senza dirlo, e ciò è peggio di un rifiuto.
Misurato con un account che portava venticinquemilacinque righe in una sezione: la sezione è stata troncata, il controllo aperto è comparso, e un secondo tentativo sullo stesso collegamento ha risposto 410.
Una tabella lasciata fuori di proposito, con la ragione accanto
Non entra tutto, e l’elenco di ciò che resta fuori porta una motivazione scritta per tabella anziché una frase di principio in cima.
L’esempio più chiaro è il libro dei consumi del monitoraggio. Lì stanno tre tabelle: i secchi orari, la riga dei limiti e la riga per ogni controllo inviato al di sotto. Le prime due entrano, perché ciò che una richiesta di accesso vuole sapere è quanto è stato misurato per me e che cosa il mio account poteva avere, e questo è esattamente ciò che dicono quelle due. La terza sono centinaia di migliaia di righe al mese con gli stessi totali, ed è amministrazione del nostro invio anziché qualcosa che la clientela ha inserito.
Quel ragionamento porta una data. Se quel libro dovesse un giorno reggere una riga di fattura, l’omissione va ripesata, perché la riga di prova dietro una scrittura contabile è un genere di dato diverso da un registro di spedizione. Scriverlo accanto all’eccezione è la differenza tra una decisione e un’abitudine.
Altre due tabelle restano fuori per la stessa ragione: l’amministrazione per tentativo sotto una misura dovuta e i tick di pianificazione stessi. Entrambe dicono qualcosa su come lo abbiamo eseguito noi e nulla sulla persona che chiede.
Come appare da fuori
Qualcuno chiede i propri dati. Nel cassetto dei compiti compare una scheda con una barra di avanzamento. Qualche minuto dopo c’è un avviso, un collegamento di scarico che funziona una volta e una ricevuta che nomina la dimensione, la somma di verifica e tutto ciò che è stato tagliato. Sette giorni dopo il file non c’è più e la traccia di ciò che è stato consegnato resta novanta giorni.
Nulla di tutto ciò è notevole, ed è proprio il punto. Notevole è ciò che manca: nessuna via in cui la stessa richiesta produca un altro genere di prova, nessun file leggibile mentre è scritto a metà, e nessun collegamento che continui a funzionare dopo essere stato usato.
Dal lavoro di piattaforma di Provibr. Perché la vista delle operazioni legge righe esistenti e non riscrive mai all’indietro sta in proiettare, mai sostituire, e perché qui una barra di avanzamento si rifiuta di prevedere una fine sta in una barra di avanzamento che non indovina.