sisoputnfrba / foro

Foro de consultas para el trabajo práctico
148 stars 7 forks source link

Error al levantar sac-cli #1524

Closed agustinpriano closed 4 years ago

agustinpriano commented 4 years ago

Buenas, estaba teniendo un problema cuando quiero inciar el cliente de SAC. Me tira que no está la función implementada, no entiendo por qué tira este error si no está atendiendo ninguna operación, simplemente está levantando. O por defecto al levantar pide alguna función en particular?. El main es del cliente:

int main(int argc, const char* argv[]) {
    struct fuse_args args = FUSE_ARGS_INIT(argc, argv);

    // Limpio la estructura que va a contener los parametros
    memset(&runtime_options, 0, sizeof(struct t_runtime_options));

    // Esta funcion de FUSE lee los parametros recibidos y los intepreta
        if (fuse_opt_parse(&args, &runtime_options, fuse_options, NULL) == -1){
            /** error parsing options */
            perror("Invalid arguments!");
            return EXIT_FAILURE;

        }
        return fuse_main(args.argc, args.argv, &do_operations, NULL);
}

En do_operations están las operaciones de fuse con su nuevo nombre redefinidas

Por consola muestra el siguiente error:

FUSE library version: 2.9.4
nullpath_ok: 0
nopath: 0
utime_omit_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
INIT: 7.23
flags=0x0003fffb
max_readahead=0x00020000
   INIT: 7.19
   flags=0x00000011
   max_readahead=0x00020000
   max_write=0x00020000
   max_background=0
   congestion_threshold=0
   unique: 1, success, outsize: 40
unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 3185
   unique: 2, error: -38 (Function not implemented), outsize: 16
unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 3185
LOOKUP /.Trash
getattr /.Trash
fuse: bad error value: 1
   unique: 3, error: -34 (Numerical result out of range), outsize: 16
unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 3185
LOOKUP /.Trash-1000
getattr /.Trash-1000
fuse: bad error value: 1
   unique: 4, error: -34 (Numerical result out of range), outsize: 16
tferraro commented 4 years ago

👋 Nos contás un que funciones tenés implementadas, como lo estás corriendo el programa, etc?

Desde la distancia es bastante dificil debuggear código ajeno 😥

agustinpriano commented 4 years ago

Dale, el struct de funciones es: operations

Y las Run Configurations del archivo .c del cliente: runConfigurations

mgarciaisaia commented 4 years ago

Estimo que aún no lo sabés, pero acá hay una contradicción, mirá:

[...] no entiendo por qué tira este error si no está atendiendo ninguna operación [...]

Por consola muestra el siguiente error:

[...]
unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 3185
   unique: 2, error: -38 (Function not implemented), outsize: 16
unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 3185
LOOKUP /.Trash
getattr /.Trash
fuse: bad error value: 1
   unique: 3, error: -34 (Numerical result out of range), outsize: 16
unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 3185
LOOKUP /.Trash-1000
getattr /.Trash-1000
fuse: bad error value: 1
   unique: 4, error: -34 (Numerical result out of range), outsize: 16

El log de debug de FUSE te muestra que le está cayendo al menos una operación de getattr sobre el path /.Trash de tu filesystem (y después otro para /.Trash-1000).

Además, te está diciendo que hay un error - que el valor que tu función getattr devuelve está fuera del intervalo válido para esa función. Es decir: tu función getattr no cumple con el protocolo especificado por FUSE.

No miré tu código, pero imagino que, claro - estás arrancando con esto, entonces seguramente hardcodeaste un return 1 en el cuerpo de la función para ver de qué va la mano. Súper entendible, eh 👍 Nomás que, buen - el valor no le gusta a FUSE, y te lo hace saber.

Estimo, igual, que solucionar ese problema... Más o menos te darás maña. Pero lo que realmente te está intrigando es la otra parte de tu mensaje:

simplemente está levantando. O por defecto al levantar pide alguna función en particular?

Y acá es importantísimo que entiendas qué está haciendo tu programa.

Tu programa es una implementación de un filesystem, y, al ejecutarlo, estás montando un nuevo filesystem en tu Linux. Es decir, ejecutar tu programa monta un nuevo volúmen a tu máquina, por lo que ahora todas las syscalls que involucren al directorio en que montaste tu FS (y todos los archivos y directorios descendientes de ese punto de montaje) van a terminar siendo resueltas por tu programa.

Entonces, tu programa "simplemente está levantado", sí. Tu main sólo dice eso: montate, y quedate esperando a que te hagan pedidos.

Pero, al mismo tiempo, que tu programa esté levantado (y tu FS montado) significa que cualquier otro proceso puede pedir información sobre el contenido de tu FS (en forma de syscalls), y que eventualmente te van a ejecutar las funciones que vos definiste para resolver las distintas operaciones.

Y ¿quién te va a hacer pedidos? Bueno... Cualquier proceso que esté corriendo en tu máquina y tenga permisos para hacerlo.

En particular, lo que estamos viendo en el log es que algún proceso preguntó por un archivo .Trash en la raíz de tu FS. Lo otro que vemos (bah, que lo ves más vos que nosotros, porque en el log no hay timestamps - pero corregime si estoy mintiendo) es que ese pedido llega siempre al toque de que iniciás tu programa - es decir, al toque de que montás tu FS.

Lo que está pasando es que algún proceso, seguramente parte del escritorio gráfico que está corriendo en tu Linux, se entera de que hay un nuevo FS montado en la máquina, y lo primero que hace es preguntar si existe un directorio que tenga pinta de ser la papelera de reciclaje.

Cómo funciona la papelera de reciclaje en Linux Mito resuelto: en Linux, la papelera de reciclaje se suele implementar haciendo que, en vez de borrar un archivo (con la syscall `unlink`), se lo mueva (con la syscall `rename`) a un directorio `.Trash` en la raíz del FS. De esa manera, podrías, por ejemplo, "borrar" (a la papelera) un archivo de un pendrive en tu máquina, y si lo llevás a otra máquina con un entorno de escritorio compatible con el tuyo, al conectar el pendrive verías que la papelera tiene cosas.

Entonces, sí - simplemente levantaste tu FS; pero no sos vos (como developer) quien controla cuándo te caen pedidos: eso lo decide el kernel, a partir de los pedidos de los procesos que corren en la máquina.

Quizá (no estoy seguro) en la Ubuntu Server no te pase esto de que te pregunten por el .Trash. De todos modos, el problema a resolver no es "quién me está haciendo este pedido", si no "implementemos bien la función para poder atender el request como FUSE especifica"..

afilgueira commented 4 years ago

Buenas! Sirvieron las respuestas? Saludos!