Closed julchat closed 3 years ago
Buenas! como va?
El código para guardar la info no parece estar mal (no soy un compilador humano, tendria que sentarme a revisarlo en detalle) pero rapidamente se me ocurre preguntarte, con que tamaño te esta quedando el archivo al final? porque me parece que por ahi puede venir el problema. Una forma super rápida de ver si todo va bien con el archivo es usar la función fstat() que te devuelve la info y si no en lugar de fallocate(), podes probar con ftruncate().
Saludos.-
︎¡Buenas! Dos cositas:
Fijate que te tira un warning de implicit declaration of function 'fallocate' [-Wimplicit-function-declaration]
, si te fijás en el manpage de fallocate también hay que definir una macro:
#define _GNU_SOURCE /* See feature_test_macros(7) */
Eso debería quitar el warning, y probablemente sea el problema, el resto del código lo veo bien
Ojo con los tamaños de los tipos, vos estás haciendo:
memcpy(superbloque+offset,&estado,sizeof(bool));
Pero como la memoria se maneja de a bytes, sizeof(bool)
retorna 1
, lo cual significa un byte y no un bit. Para poder implementar un bitmap de forma segura y trabajarlo a nivel bit te recomiendo el TAD bitarray de las commons: bitarray.h
Lo mismo aplica para el block_amount
:
fallocate(fd,0,0,2*sizeof(uint32_t)+block_amount);
Saludos
En el i-mongo-store-lib.c:
En i-mongo-store-lib.h ahora tengo al principio:
y más abajo agregué ahora:
Al agregar el define con el gnu source como señalaste, el warning se solucionó, pero el archivo de superbloque.ims quedó igual. Algo que noté, es que al abrirlo con otro editor de texto o el vs code, aparecieron algunas lineas:
(linea vacia) ??? ????????????
literalmente (?)
Me puse a pensar, los dos primeros elementos del archivo deberían ser 2 enteros de 4 bytes, con valor de 10. El editor de texto debería entender los bytes como ASCII
Lo que debería tener en mis archivos, por los enteros en BCD, calculo que debería ser algo así: 0000 0000 0001 0000 (Primer 10) 0000 0000 0001 0000 (Segundo 10) 0000 0000 (booleano en 0, 10 veces, por el bitmap - que acá en realidad es un bytemap, tengo que implementar lo que dijiste del bitarray.h-)
Capaz me estoy yendo de las ramas pero usando la tabla de ASCII esto sería: NULL LF NULL LF NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
Donde LF (Line fill) tengo entendido que salta de línea, y bueno, NULL es el no caracter.
Sigue siendo un poco distinto a lo que me muestran.
Probé también con ftruncate como indicó Damián, pero lo mismo.
Agregué un par de líneas para utilizar fstat. El buffer de informacion de estadistica que devuelve tiene muchos campos, solo supe interpretar el de block size y el de cantidad de bloques:
struct stat *algo = malloc(sizeof(struct stat));
int resultado = fstat(fd, algo);
if(resultado ==-1){
log_error(logger_i_mongo_store, "no anduvo fstat");
}
else{
log_info(logger_i_mongo_store,"cant bloques: %d, tam bloques: %d, ",algo->st_blocks,algo->st_blksize);
}
a lo que se logeó:
[INFO] 17:20:09:293 I-MONGO-STORE/(5780:5780): cant bloques: 8, tam bloques: 4096,
[INFO] 17:20:09:399 I-MONGO-STORE/(5780:5780): FILESYSTEM INICIALIZADO DE 0 CON EXITO
El 4096 supongo que es porque toma el tamaño de bloque del archivo en el fs de Linux el cual sería 4KB, pero el 8 no lo se interpetar.
También esto se está haciendo muy técnico y capaz lleva a ver mas el código, para lo que sería más cómodo que el sábado de soporte / cuando haya un ayudante durante la semana analicemos mas con detalle el código. De todas formas gracias!
Saludos
También esto se está haciendo muy técnico y capaz lleva a ver mas el código, para lo que sería más cómodo que el sábado de soporte / cuando haya un ayudante durante la semana analicemos mas con detalle el código.
Coincido :P
Mientras tanto, algo que te puede ayudar a revisar de mejor forma el contenido del stream mapeado a memoria en ejecución es usar las funciones de memory.h
para mostrar ese contenido por pantalla o en un log. Para revisar el archivo en disco el comando hexdump -C
muestra el contenido exactamente de la misma manera.
En cuanto al retorno de fstat()
, las manpages de esa función te pueden ayudar: https://linux.die.net/man/2/fstat
Ok! Las pruebo y pregunto por soporte! Muchas gracias
El problema
Básicamente el título. Pensé que sabía, pero parece que no. En mi caso quise implementarlo para probar con el archivo Superbloques.ims Las funciones de creación de las carpetas andan, los archivos se crean bien, pero lo que creería que se escribiría en los archivos no se persiste si yo lo abro desde el explorador de linux, por ejemplo. Osea el archivo existe pero queda vacío
🔎 Búsqueda en foros
Estuve revisando los issues de los foros pero los que encontré o trataban el problema con pseudocódigo, o implicaban usar fwrite(), que tengo entendido, la idea de que usemos mmap() es para no usar muchos fwrite().
📝 Código relevante
Tengo el siguiente código:
Y, lo más importante
🐛 Cómo reproducir el error
1- Borro el punto montaje si ya existe 2- Ejecuto el programa
💻 Logs
El output que conseguí al ejecutar un script que hace make y ejecuta con valgrind fue el siguiente: gcc -c -o obj/i-mongo-store-lib.o src/i-mongo-store-lib.c -I./include -I../shared/include -g -Wall
src/i-mongo-store-lib.c: In function 'inicializar_superbloque': src/i-mongo-store-lib.c:103:2: warning: implicit declaration of function 'fallocate' [-Wimplicit-function-declaration] fallocate(fd,0,0,2*sizeof(uint32_t)+block_amount); ^ gcc -o i-mongo-store obj/i-mongo-store.o obj/i-mongo-store-lib.o ../shared/obj/shared_utils.o -I./include -I../shared/include -g -Wall -lcommons -lpthread -lreadline -lcunit -lrt ==8073== Memcheck, a memory error detector ==8073== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==8073== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==8073== Command: ./i-mongo-store cfg/i-mongo-store.config cfg/i-mongo-store.log ==8073== [INFO] 19:42:33:867 I-MONGO-STORE/(8073:8073): FILESYSTEM INICIALIZADO DE 0 CON EXITO [INFO] 19:42:33:970 I-MONGO-STORE/(8073:8073): SERVIDOR LEVANTADO! ESCUCHANDO EN 5002
Y, al finalizar el módulo lo que tiró valgrind no fue muy relevante: (finalicé con SIGINT, quedaron bloques sin liberar).
Gracias y espero que me puedan dar una mano :D