Ir al contenido

Blog ·

Una exportación que se puede comprobar

Una exportación de datos como tarea duradera: un fichero temporal renombrado, un sha256 en el recibo, un vale de un solo uso y un directorio en dos papeles.

Por Provibr

El artículo 20 del reglamento europeo de protección de datos da a una persona el derecho a recibir sus datos. En una plataforma de hosting eso no es un fichero pequeño. Una exportación de organización lee unas setenta secciones, cada una limitada a veinticinco mil filas, y tarda minutos en lugar de milisegundos.

Hasta hace poco la nuestra se construía dentro de una acción de servidor: una petición web montaba el conjunto en memoria y lo devolvía como una sola cadena en la respuesta. Eso funciona hasta la cuenta en la que deja de funcionar, y esa cuenta es justamente la que más lo necesita.

Es una tarea, y solo hay un camino

Una exportación es ahora una operación duradera con cuatro etapas: en cola, recogiendo, empaquetando, lista. Un trabajador en la pasarela la toma cada treinta segundos, bloquea una fila, construye las secciones, escribe el fichero y devuelve un vale.

Cuatro números sostienen todo el conjunto, y cada uno es una decisión y no un valor por omisión.

LímiteValorPor qué ese
Filas por sección25.000Por encima de eso es un informe y no una solicitud de acceso, y el corte se nombra en vez de esconderse
Enlace de descarga24 horasBastante para recogerlo, poco para que un enlace viejo en un buzón valga algo
El fichero en disco7 díasEs una copia completa de todo lo que guardamos, y no debe convertirse en un archivo
El registro de lo entregado90 díasLa prueba de que se ejerció un derecho sobrevive al fichero que produjo

El viejo camino síncrono no se conservó como atajo para cuentas pequeñas, y eso fue una decisión deliberada y no pereza.

Dos caminos son dos verdades. Cuál de los dos corre dependería de una estimación previa, y la estimación que importa aquí es es pequeña esta cuenta, que es exactamente lo que no se puede saber antes de haber contado las secciones. Si falla, la exportación cae por el camino donde no hay red.

Dos caminos son también dos clases de prueba. La fila de auditoría, el recibo con una suma de verificación dentro y la lista de secciones truncadas solo existen en el camino de tarea. Una exportación pequeña se entregaría en silencio sin nada de eso, y la pregunta qué entregamos en marzo tendría una respuesta que depende del tamaño que tenía la cuenta entonces.

El precio es un clic más, y ese clic iba a estar de todos modos: el trabajo largo pertenece a la bandeja de tareas, y ahí está ahora, con una barra de progreso en lugar de un navegador que no hace nada durante dos minutos.

Dónde tuvo que vivir el código

Los constructores se mudaron de la aplicación web al paquete que posee el acceso a la base de datos. Eso no fue orden. La imagen de la pasarela copia la pasarela y los paquetes compartidos y no copia el directorio web, así que una importación que alcanza web/lib compila en local y falta en producción. Es una frontera medida y no una cuestión de estilo.

La operación de exportación tiene además el tipo de recurso account, y es el primero sin módulo. Cualquier otra operación duradera trata de un servidor, un agente, una pieza de hardware o una automatización, y cada uno de esos cae bajo un módulo de permisos que decide quién puede verla. Una exportación de cuenta no cae bajo nadie: el conjunto de permisos de un miembro lleva derechos y no identidad. La visibilidad se responde preguntando si quien mira es quien la pidió, y el canal en vivo devuelve falso para todos los demás.

Un fichero temporal, y luego un renombrado

El fichero se escribe como <nombre>.part y luego se renombra a su sitio. Un renombrado dentro de un mismo directorio es atómico, de modo que quien lee nunca puede obtener medio fichero, y medio fichero es peor que ninguno: tiene una suma de verificación que no cuadra y nada que diga por qué.

La suma de verificación es un sha256 de los bytes, y va junto al tamaño en el recibo. Eso es lo que hace la exportación comprobable en vez de meramente entregada. Quien tenga el fichero dentro de un año todavía puede demostrar que es el fichero que produjimos.

El directorio es un montaje enlazado que cuelga de dos contenedores: de lectura y escritura en la pasarela, que escribe, y de solo lectura en la aplicación web, que sirve. Dos procesos, dos papeles, un directorio.

Ese montaje se olvida con facilidad, y olvidarlo produce un fallo muy concreto y muy desconcertante. La tarea dice lista. La descarga devuelve 410. Nada en el registro dice directorio equivocado, porque para cada uno de los dos procesos todo funcionó. Por eso el código avisa una vez, en voz alta, si el directorio no está configurado, y el valor de reserva es una ruta junto al repositorio y no el directorio temporal del sistema: un fichero allí desaparece al reiniciar, y entonces una fila que dice lista para descargar apunta a nada.

El vale es de un solo uso, y un solo uso es una sentencia

El enlace de descarga lleva un vale válido veinticuatro horas, mientras que el fichero mismo se queda siete días.

Los dos límites hacen falta. Solo un uso dejaría un vale utilizable durante meses mientras nadie lo pulse. Solo con caducidad quedaría reutilizable un día por cualquiera que vea la dirección: un registro de intermediario, un historial de navegación, un buzón compartido. Quien llegue tarde pide una exportación nueva, y eso cuesta un minuto y da una copia fresca y correcta en vez de un enlace que anda una semana suelto por un correo.

El cerrojo que impone de verdad el uso único no es la marca de tiempo. Es una sentencia condicional: actualiza la fila, pon la marca de descarga, donde la marca de descarga siga vacía. Dos peticiones simultáneas con el mismo vale tocan juntas exactamente una fila y la segunda recibe cero. Comprobar y luego escribir serían dos sentencias y por tanto dos ocasiones de colarse en medio.

El vale por sí solo tampoco basta. Quien llama pasa la persona conectada y esa debe ser quien pidió la exportación, y por eso esa ruta corre bajo la política de sesión y no bajo la de vales. Y la comprobación de propiedad va antes que cualquier otro rechazo: quien no debería tener el vale tampoco debe aprender de él si la exportación caducó o ya se recogió.

Siete días para el fichero son cortos a propósito. El fichero es una copia completa de todo lo que guardamos sobre una persona o una organización, y mientras existe es un segundo sitio donde vive todo eso. Una copia de seguridad se lo lleva, y la cuidadosa lista blanca que decide qué entra en una exportación hizo su trabajo en el momento en que el fichero se escribió y después ya no protege nada. No es en absoluto un plazo de conservación de los datos en sí, que están en la base de datos con sus propias reglas. Es el plazo de una copia.

Truncar es una comprobación abierta, no una nota al pie

Cada sección se detiene en veinticinco mil filas. Una sección que llegó a ese techo se nombra en el sobre y aparece en el recibo como comprobación abierta: algo sobre lo que se espera que quien lee actúe, al lado del resultado y no enterrado dentro. Una exportación que se parara en el techo sin decirlo sería una respuesta a una solicitud de acceso incompleta sin declararlo, y eso es peor que una negativa.

Medido con una cuenta que llevaba veinticinco mil cinco filas en una sección: la sección se truncó, la comprobación abierta apareció, y un segundo intento con el mismo enlace devolvió 410.

Una tabla dejada fuera a propósito, con la razón al lado

No entra todo, y la lista de lo que queda fuera lleva una justificación escrita por tabla en lugar de una frase de política arriba del todo.

El ejemplo más claro es el libro de consumo de la monitorización. Allí hay tres tablas: los cubos horarios, la fila de límites y la fila por comprobación enviada que hay debajo. Las dos primeras entran, porque lo que una solicitud de acceso quiere saber es cuánto se midió para mí y qué permitía mi cuenta, y eso es exactamente lo que dicen esas dos. La tercera son cientos de miles de filas al mes con los mismos totales, y es administración de nuestro envío en vez de algo que la clientela introdujo.

Ese razonamiento lleva fecha. Si ese libro llega a soportar alguna vez una línea de factura, la omisión debe volver a sopesarse, porque la fila probatoria detrás de un cargo es otra clase de dato que un registro de envío. Escribir eso junto a la excepción es la diferencia entre una decisión y una costumbre.

Otras dos tablas quedan fuera por la misma razón: la administración por intento bajo una medición debida y los propios pulsos de planificación. Ambas dicen algo sobre cómo lo ejecutamos nosotros y nada sobre la persona que pregunta.

Cómo se ve desde fuera

Alguien pide sus datos. Aparece una tarjeta en la bandeja de tareas con una barra de progreso. Unos minutos después hay un aviso, un enlace de descarga que funciona una vez, y un recibo que nombra el tamaño, la suma de verificación y todo lo que quedó cortado. Siete días más tarde el fichero ya no está y el registro de lo entregado se queda noventa días.

Nada de eso es notable, y esa es la idea. Lo notable es lo que falta: ningún camino por el que la misma solicitud produzca otra clase de prueba, ningún fichero que se pueda leer mientras está a medio escribir, y ningún enlace que siga funcionando después de usarse.

Del trabajo de plataforma de Provibr. Por qué la vista de operaciones lee filas existentes y nunca escribe de vuelta está en proyectar, nunca sustituir, y por qué una barra de progreso aquí se niega a predecir un final está en una barra de progreso que se niega a adivinar.

Empiece con un host y un agente

Cree una cuenta, instale el agente con un solo comando y conecte su primer host de Proxmox. El periodo de prueba dura 14 días y no pide ningún dato de pago.