Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Nacho Ruiz de Erenchun -
Número de respuestas: 14
Hola a todos.
Me gustaría saber si alguien se ha encontrado con este problema y cómo lo ha solucionado.

Cuando un usuario se pone una foto en su ficha, moodle crea un subdirectorio en la carpeta /moodledata/users con su id y pone los ficheros de imagen correspondiente.
El problema es que todas esas carpetas están en el mismo nivel (/users) y mi sistema ha llegado a su límite (32.000) por lo que no puede crear más carpetas y en consecuencia las fotos no quedan "registradas" en el sistema.

Creo que no hay forma (o yo no la he visto) que moodle "jerarquice" la estructura de directorios para no tener una única bolsa y así dividir el número de subcarpetas.

Espero que alguien pueda echarme una mano, porque sino ya me veo parcheando el código... muerto

Un saludo,
NAcho
Promedio de valoraciones: -
En respuesta a Nacho Ruiz de Erenchun

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Hola Nacho,

algunos SO/FileSystems permiten ampliar ese límite modificando las correspondientes variables del sistema/kernel/lo que sea. Esa es la única solución que se me ocurre como inmediata.

La correcta, evitar ese número de directorios en el mismo nivel, conlleva realizar un desarrollo más serio y que esté soportado por Moodle.

Para ello he delineado un plan inicial en el tracker de Moodle, para ver si se hace algo, aunque en principio me atrevería a afirmar que es prácticamente imposible para la versión 1.8.

http://tracker.moodle.org/browse/MDL-8605

Ciao sonrisa
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Nacho Ruiz de Erenchun -
Eloy, lo primero, gracias por todo.

Ampliar el parámetro del número de directorios, es lo primero que miramos pero no es viable porque el FS de RedHat no lo permite. Hay FS que lo puedes modificar pero no están soportados por RedHat.
De momento, creo que los fraccionaremos en un par de niveles y generaremos softlinks (aquí si que no tenemos ninguna limitación) en el /users para que el moodle no "se entere" del cambio.confuso

Con respecto al tracker abierto, espero que se resuelva en futuras versiones (así no tendremos que hacer "inventos del TBO") y lástima que no entre para la 1.8 triste.
Sólo dos apuntes:
  • La solución que comentan puede ser demasiado fraccionada (ID=999999 hash_fix_length=6 userid_to_path(ID=0)-> /9/9/9/9/9/9/). A lo mejor se pueden "paquetizar" cada 2 ó 3 (/99/99/99/, /999/999/) para no tener tantos niveles de directorios.
  • Deberíais valorar esta misma solución para otras "situaciones". Por ejemplo, los directorios de un curso también siguen el mismo esquema y podrían con el tiempo tener el mismo problema.

Un saludo,
NAcho
En respuesta a Nacho Ruiz de Erenchun

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Ah, lo del 9/9/9/9/9 no es mío. Es de José Rama.

Lo que yo propongo es crear un "hash" único, base 36 (0..z), que convertirá el id del usuario a una cadenita de 6 cc, que dividiremos de dos en dos (3 niveles).

Cada directorio, como máximo, tendrá 36 * 36 (1296) directorios. En el bug puedes ver un adjunto en PHP que simula el algoritmo. Creo que puede servir perfectamente para este caso (y otros, como muy bien comentas, en el futuro).

Ciao sonrisa
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de José Rama -
Lo del 9/9/9/9/9 era una interpretacion libre!! de tu idea, Eloy, me parece lo mas que correcto pasar el el ID a base 36, y aprovecho para preguntarte pq las imagenes no las almacenamos en la base de datos, junto con la info del usuario o en una tabla aparte, no son archivos muy grandes y de cualquier manera van a parar al disco, pero no se si hay alguna otra razon de diseño que se me este escapando.
En respuesta a José Rama

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Hola Jose,

respecto a lo que preguntas, se me ocurren (me las acabo de inventar!) varias razones:

1) En principio, servir ficheros estáticos (de disco) se supone bastante más rápido que acceder a los mismos a través de una conexión a base de datos. Y digo se supone, porque dependiendo de múltiples parámetros esto puede ser más o menos cierto.

2) La estructura actual permite "crecer". Es decir, si se crean nuevas funcionalidades en Moodle, como la de que cada usuario tenga su área de ficheros, con el modelo actual ya tenemos perfectamente identificado el lugar en el que estarán los ficheros de cada uno. En una implementación en BD este cualidad no estaría disponible de forma inmediata.

3) Seguramente, en un futuro, si finalmente se realiza un rediseño de toda la zona de archivos de Moodle y esta se abstrae lo suficiente, podrán crearse, a modo de "plugins" sistemas de almacenamiento de lo más variopinto. Uno de ellos sería el actual de sistema de ficheros, pero seguro que no tardarían en llegar otros basados en BD o en otros sistemas de transmisión/almacenamiento. guay

4) Simplemente, ha funcionado y funciona bien.

Eso es, básicamente, lo que se me ha ocurrido según iba escribiendo. Seguro que puede haber alguna razón más (como que es más legible humanamente gran sonrisa ), pero la verdad es que, de momento, no se ha planteado cambiar (al menos hasta que el punto 3 anterior se convierta en una realidad). La premisa actual es que todos los ficheros se almacenan en sistema de ficheros.

Ciao sonrisa
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de José Rama -
Es que es un tema muy discutido y hay bibliotecas para ambos lados, por eso la pregunta iba orientada hacia si existe una pauta de diseño en Moodle sobre el tema , por lo que me dices asi es.
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Nacho Ruiz de Erenchun -
No pretendo crear ningún tipo de discusión (porque además entiendo que éste no es el foro adecuado) pero sí me gustaría puntualizar que un hash, aunque es una idea atrayente, no es intuitivo para un humano en cambio el id sí.

Saludines.
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
Eloy, en realidad no necesitas un hash. Ya tienes un valor numérico único, que además tiene estructura. Lo único que tienes que hacer es decidir cual es el número máximo de usuarios que tu esquema pretender soportar. Digamos que es 999.999.999 usuarios (para tirar por lo alto y no pillarnos los dedos en, digamos, 2 ó 3 años sonrisa. Sólo tienes que escribir el id del usuario en formato nnn.nnn.nnn (algo que un sprintf te hará sin problemas, por ejemplo). Y después creas una estructura en 3 niveles: el primer nivel contiene los tres primeros dígitos del id, el segundo nivel los 3 siguientes y el tercer nivel con los 3 últimos que ya apunta al directorio del usuario en cuestión.

Así tenemos un máximo de 1000 entradas por directorio en cada nivel, que además de no suponer un problema de cara al número máximo de entradas en un directorio, acelera considerablemente el acceso a los subdirectorios (que en sistemas de archivos[1] que no usan indices para esta tarea supone un impacto nada despreciable), y se usa un esquema sencillo y rápido de implementar en código, y fácil de interpretar por un humano.

Saludos. Iñaki.

[1] ext2 y ext3 en linux no los usan por defecto, a menos que se active la opción dir_index durante la creación o posteriormente con tune2fs (ojo, que los núcleos anteriores a 2.6.20 tienen un bug en el código de ext3 que hacen que si se usa dir_index, bajo ciertas condiciones el rendimiento es aún peor).
En respuesta a Iñaki Arenaza

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Denise Rodaro -

Hola, queridos amigos, esta semana conocí Moodle y ya la instalé pero no estoy habituada a los temas informaticos y a sus terminos. Estoy leyendo atentamente este foro y desearia que alguien me explique, por favor:

---Sólo tienes que escribir el id del usuario en formato nnn.nnn.nnn (algo que un sprintf te hará sin problemas, por ejemplo). ......¿QUE ES UN sprintf ???.

------Y después creas una estructura en 3 niveles: el primer nivel contiene los tres primeros dígitos del id, el segundo nivel los 3 siguientes y el tercer nivel con los 3 últimos que ya apunta al directorio del usuario en cuestión......¿DONDE SE CREA ESTA ESTRUCTURA, ES DECIR, desde que opcion de administracion???

Mil graciasss por respobder

Denise

En respuesta a Denise Rodaro

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
No te preocupes Denise, no hace falta que crees nada. Todo esto lo hará Moodle sólo (cuando se añada esa funcionalidad a la plataforma) sonrisa

Saludos. Iñaki.
En respuesta a Iñaki Arenaza

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Denise Rodaro -

Gracias, amigo. Muy amable por responderme

Saludos

P/D: Ahora tengo un problemónnnn....creo los cursos pero no puedo acceder a ninguno . Da un mensaje asi" este curso no permite acceso publico". (hasta hace 4 horas podia ingresar...y de pronto....puffff....POdes ayudarme?)

Milll gracias, CHE!!!

En respuesta a Denise Rodaro

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
Según parece has activado la opción de no permitir el acceso de los usuarios invitados a los cursos que has creado. Tienes dos opciones: o permitir el acceso de invitados, o iniciar la sesión en Moodle con un usuario que esté matriculado en esos cursos.

Saludos. Iñaki.
En respuesta a Iñaki Arenaza

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Hey,

que lo del "hash" era solo un ejemplo, en base 36, con el que estuve probando el base_convert() y jugando un poco. Al final dejé ese por la sencilla razón de que me pareció bastante compacto y con 6 "cifras" se alcanzaban identificadores muy "gordos", bastante por encima, obviamente, de los alcanzados en base 10.

Aunque coincido en que utilizando directamente base 10 puede resultar más legible para "algunos" sacar lengua humanos, también es cierto que me pregunto qué valor añadido tiene el número identificador de usuario en base 10 (el actual) frente a uno en base 36 (el propuesto en el ejemplo) para cualquiera de nosotros.

Con otras palabras, cuántos de vosotros, oh humanos, os sabéis vuestro userid en, por ejemplo, moodle.org ? Cuántas veces habéis hecho uso humano del vuestro glamuroso identificadorcito base 10? guiño

Ciao sonrisa
En respuesta a Eloy Lafuente (stronk7)

Re: Imposibilidad de poner fotos a los usuarios por límite de subdirectorios en moodledata/users

de José Rama -
buen, punto, pero creo que cualquiera de las versiones de la funcion solo difieren en parametros, como ser base y longuitud de "hash", no creo que sea para calentarse la cabeza, creo que lo que tiene a favor de la base 36 es lo compacto.