Red de conocimiento informático - Conocimiento informático - Código fuente del disco de almacenamiento

Código fuente del disco de almacenamiento

Foto de Caroline Self en Unsplash.

Estoy haciendo la maleta para un viaje en avión y me acabo de dar cuenta de que no tengo suficiente espacio para toda mi ropa. Mi equipaje solía funcionar muy bien; aparentemente mis necesidades han cambiado.

Puedo meterlo todo ahí y atarlo con una cuerda. ¿O podría poner la ropa extra en tres bolsas de compras y caminar por el aeropuerto con esas cuatro prendas? Esto no tiene buena pinta. Remendar o cambiar por completo la forma en que guardo mi ropa es un mal plan de viaje: necesito algo mejor. Algo sencillo. Por supuesto, lo que realmente necesitaba era una maleta más grande. Las maletas son intercambiables, simplemente cambia tu ropa de una a otra.

Mi situación actual es un poco tonta y obvia, pero resulta que el almacenamiento intercambiable también es muy adecuado para el almacenamiento de software. El sueño del software portátil es "escribir una vez y ejecutar en cualquier lugar". El software también debe tener datos de portabilidad. Ya sea que almacene sus datos en un depósito S3, en un disco o en un navegador web, deberían ser fácilmente intercambiables.

Desafortunadamente, a menudo no es tan simple: cada nueva "maleta" de datos no se puede distribuir de la misma manera, se utiliza un embalaje poco convencional o, si lo ves raro, se desmoronará. Sin los mismos estándares o proceso de revisión, puede resultar difícil identificar un sistema de almacenamiento para su programa. No necesitará cambiar su programa para que coincida con el sistema de almacenamiento exclusivo y adaptarse a cambios futuros no debería ser difícil. Necesitamos interfaces comunes para diferentes tipos de almacenamiento y un conjunto de pruebas para revisarlas.

Los estándares de almacenamiento comunes pueden ayudar a resolver estos problemas, pero para que sean efectivos es necesario que la comunidad los adopte ampliamente. El primer paso para adoptar un estándar es presentarle un diseño y una fuente familiares. Por ejemplo, Go introdujo la interfaz del sistema de archivos en la biblioteca estándar, sentando las bases para que los desarrolladores la construyan. Utiliza el humilde archivo, un paquete familiar de datos, organizado en carpetas para formar un sistema de archivos. El patrón de sistema de archivos "en capas" de Go es una buena opción porque ya se usa ampliamente en otros campos. Desde álbumes de fotos en teléfonos inteligentes hasta marcadores en navegadores web, los patrones de sistemas de archivos están en todas partes en el software actual. Los sistemas de archivos parecen ser una excelente opción para una interfaz de almacenamiento universal.

Durante el desarrollo de Hackpad, nuestro sistema de almacenamiento comenzó a fallar, pero carecíamos de las herramientas para solucionarlo. La mayoría de nuestros componentes requieren el uso de varios sistemas de almacenamiento diferentes para leer y escribir datos. Para cada nuevo sistema de almacenamiento, teníamos que escribir y reescribir el código del adaptador cada vez, lo que generaba una gran sobrecarga. Comenzó como un simple almacén de memoria, luego evolucionó hasta convertirse en un lector de archivos tar.gz en streaming y luego se superpuso al sistema de archivos. Cuando también necesitamos agregar almacenamiento basado en navegador, queda claro que se necesita una nueva abstracción flexible.

Este artículo analizará un modelo de sistema de archivos nuevo y extensible para programas Go y cómo funciona. Vaya a la interfaz del sistema de archivos io/fs. FS abre la puerta a nuevas posibilidades. Usemos un martillo para abrir la puerta.

Abrimos el código fuente de nuestra biblioteca HackpadFS, definimos una interfaz de sistema de archivos común y disfrutamos de un conjunto de pruebas rigurosas para que todos puedan crear un sistema de archivos portátil personalizado. Lleva el sistema de archivos de punto de entrada de Go a un nivel completamente nuevo:

A continuación, exploremos nuevas posibilidades utilizando el sistema de archivos integrado, la interfaz común y el conjunto de pruebas maduro de HackpadFS.

Un sistema de archivos o FS es una colección de archivos ubicados por una "ruta". Si ha utilizado paquetes de Goos antes, entonces ha utilizado FS. Sin embargo, cabe señalar que las funciones estáticas del paquete del sistema operativo no se pueden utilizar como objetos que implementan interfaces públicas. No se puede intercambiar con otras implementaciones y sus datos solo existen en un almacenamiento. Vaya io/fs. La interfaz FS nos permite ver la posibilidad de un sistema de archivos intercambiable. Con HackpadFS, podemos probar varios sistemas de almacenamiento nuevos sin tener que reescribir el código.

Coloca los mismos datos en la nueva memoria.

Foto de Aleksei Ieshkin en Unsplash.

HackpadFS viene con varios sistemas de archivos potentes. Cada uno está en línea con la nueva interfaz de HackpadFS y el poderoso impacto de io/fs. FS:

Combinando algunos de ellos se pueden crear programas verdaderamente innovadores sin tener que codificar un único sistema de almacenamiento.

Como ejemplo de la vida real, Hackpad ahora usa la mayoría de ellos para construir el IDE Go en el navegador. Consulte el código fuente en GitHub.

¿Buscas inspiración para crear tu propio FS? Aquí hay algunas ideas:

Go 1.16 presenta el nuevo paquete io/fs por primera vez, mostrando una interfaz estándar para implementar un sistema de archivos de solo lectura. También demuestra HTTP a net/http.FS desde cualquier sistema de archivos compatible. Este enfoque se inspiró en el proyecto HackpadFS, que creó una interfaz común para todos los programas Go. La inspiración inicial también provino de SPF 13/Go-git/Go-Billy, aunque HackpadFS adoptó un enfoque diferente, proporcionando una interfaz modular para sistemas de archivos personalizados, agrupando un conjunto de pruebas estricto y logrando una coherencia estricta.

Las interfaces conocidas pueden ayudar a los desarrolladores a realizar combinaciones creativas, pero solo definen cómo interactúan los diferentes sistemas. HackpadFS permite a los desarrolladores * * * disfrutar de muchas interfaces pequeñas y componibles que imitan Go y sus paquetes. Para implementar un FS personalizado, solo es necesario escribir un código mínimo. Oficial administrativo superior/Asuntos de campo

Por ejemplo, cree un nuevo Lstat()foo. FS solo agrega, podemos escribir una estructura FS completa usando solo dos métodos:

Manejar tipos de interfaz puede ser complicado, por lo que HackpadFS también incluye funciones auxiliares para simplificar el código. Ahora cualquiera puede usar foo . fshelpershackpadfs . lstat(foo fs, "bar") para evitar la verificación de tipos de genéricos. Si se descubre que FS no admite la interfaz correspondiente o una interfaz compatible, se devuelve un error "no implementado".

Entonces, ¿qué incluye HackpadFS que Go no incluye? Aquí hay un desglose rápido de todas las interfaces antiguas y nuevas, y cómo las ampliamos.

Las interfaces integradas de Go incluyen FS, File, FileInfo y DirEntry. HackpadFS, por otro lado, define interfaces equivalentes para compatibilidad y luego define 27 más:

Todas estas interfaces se pueden usar para componer su propio FS usando cualquier función que necesite.

Go también implementa varias funciones auxiliares para facilitar el procesamiento de FS. HackpadFS implementa la mayoría de los mismos asistentes y luego 23 más:

Una fuente común de problemas para nosotros es el manejo de errores. Idealmente, podríamos usar errores.is () errores.as() para detectar ciertos tipos de errores, pero los valores que debemos verificar son muy inconsistentes. A veces podemos comprobar si hay errores de biblioteca estándar, como fs. ErrExist, pero a veces nos vemos obligados a extraer el paquete syscall para detectar correctamente errores como "no es un directorio".

HackpadFS resuelve este problema al incluir un conjunto unificado de errores que se comportan de manera correcta y consistente:

Por último, pero no menos importante, si el sistema de archivos no funciona, eso es malo. Para garantizar una coherencia estricta, HackpadFS proporciona un *conjunto de pruebas* para comprobar que cada sistema de archivos se comporta como el sistema operativo del paquete.

Está diseñado para ser fácil de usar en sistemas de archivos personalizados y solo ejecutar pruebas en interfaces específicas en el sistema de archivos que las implementa. Por ejemplo, probemos foo. FS:

Ambos iniciaron una gran cantidad de subpruebas además de fstest. FS() y ftest. documento().

Cada subprueba llama a TestFS() para crear una nueva instancia de foo. FS y luego ejecutarlos en paralelo. Desde foo. FS solo implementa FS y LstatFS y solo ejecuta esas pruebas; todas las demás pruebas se omitirán. Lo mismo ocurre con los archivos: si el archivo devuelto por Open() solo admite operaciones de lectura, entonces solo se ejecutará la prueba de lectura de archivos.

El conjunto de pruebas es riguroso para garantizar una conformidad y coherencia muy estrictas con el comportamiento de los paquetes del sistema operativo. No hay nada peor que un sistema de archivos que no parece un sistema de archivos. Hoy en día, fstest ejecuta 90 pruebas en el sistema de archivos y 50 pruebas en los archivos, con un total de ***556 afirmaciones. Se ha integrado en las pruebas de CI para los seis sistemas de archivos integrados.

Creemos * * * que compartir una interfaz pública y un conjunto de pruebas rigurosos ayudará a crear un ecosistema de sistema de archivos sólido para la comunidad Go. La capacidad de composición de la interfaz HackpadFS y su sistema de archivos integrado pueden brindarle motivación al escribir su próxima aplicación.

¡Esperamos que pruebes HackpadFS! Fue muy divertido armarlo y me encantaría saber qué comentarios tienen ustedes.