Projet Système - Système de fichiers de tags
Ce projet n'a été effectué qu'en 2015-2016. Le sujet des années avant et après est ici.
Déroulement
Consignes

Projet à réaliser en équipe de 5 étudiants. Les équipes seront tirées au sort et gérées sur le serveur thor/ruby.

Le langage de programmation devra être le C. Vous devez créer un repository SVN ou GIT sur le serveur thor/ruby.

Rapport et démonstration intermédiaires

Une démonstration des fonctionnalités implémentées devra être présentée lors de la 5ème ou 6ème séance (date exacte à confirmer pour chaque groupe). L'encadrant passera une dizaine de minutes avec chaque équipe pour faire un point détaillé sur ce qui marche ou ne marche pas, notamment en faisant tourner les différents programmes de tests.

Un rapport intermédiaire (environ 4 pages) sera envoyé 3 jours avant en PDF par mail à votre encadrant et à Brice Goglin. Il décrira ce qui marche ou ne marche pas, pourquoi, et ce que vous avez prévu de faire pour la suite du projet. Inutile de rappeler le sujet !

Rapport et soutenance de fin de projet

La soutenance finale aura lieu en salle TD8 aux créneaux suivants:

HoraireMercredi 11Vendredi 13
9h00G1-T1G3-T5
9h20G2-T1G3-T4
9h40G2-T4G4-T2
10h00G1-T3G3-T3
10h20G2-T5G4-T5
10h40G1-T5G3-T1
11h00G1-T2G3-T2
11h20G2-T2G4-T1
11h40G1-T4G4-T3
12h00G2-T3G4-T4

Elle durera environ 13 minutes suivies d'environ 5 mn de questions, et consistera en une présentation sur vidéoprojecteur et une démonstration. Vérifiez avant de venir que vous savez utiliser un vidéoprojecteur avec votre ordinateur, et allumez votre ordinateur avant d'entrer dans la salle.

Un rapport d'environ 8 pages devra être rendu avant lundi 09 à 23h59 pour les groupes G1, G2 et G4, mardi 10 à 23h59 pour G3, au format PDF par mail à votre encadrant et à Brice Goglin. Le rapport décrira ce qui a été implémenté, comment et pourquoi. Il sera accompagné d'une archive tar.gz (pas de .rar!) contenant tout le code source et un minimum de documentation permettant de compiler et tester le projet.

Les rapports et soutenance devront notamment expliquer comment vos tests montrent la validité du comportement de votre bibliothèque et indiquer les différents coûts que vous avez mesurés (voir la partie premiers objectifs ci-dessous). Inutile d'écrire des pages pour rappeler le sujet, il faudra se concentrer sur les choses utiles et prêtant à discussion (performance, complexité, modification de l'interface de programmation, ...).

Evaluation

A partir des rapports (intermédiaire et final), de la démo à mi-parcours et de la soutenance finale, on jugera:

Objectif général

On veut développer un système de fichiers permettant d'appliquer des tags à des fichiers, par exemple des photos (ou de la musique). Une photo pourra par exemple avoir les tags "paysage" et "nuit".

Les photos considérées sont situées dans un seul répertoire sans sous-répertoire. Avant et après utilisation, la base de données est stockée dans un fichier spécial dont le format est le suivant :

tag appliqué à tous les fichiers
[filename1]
tag1 appliqué au fichier filename1
# ligne ignorée car commence par '#' ou vide
tag2 appliqué au fichier filename1
[filename2]
tag3 appliqué au fichier filename2
...
Les fichiers sans aucun tag n'apparaissent pas du tout dans ce fichier.

Le nouveau système de fichiers développé dans le projet crée un répertoire virtuel contenant les mêmes photos, et également des répertoires virtuels pour décrire les tags appliqués à chaque photo. Le répertoire virtuel foo/bar/ contiendra ainsi les photos qui ont les tags foo et bar. Il contient également des sous-répertoires virtuels correspondant à chaque tag qu'une de ces photos pourrait également avoir.

Sémantique du contenu des répertoires

Par exemple, avec ces photos originales :

$ ls /home/login/Photos
a.jpg
b.jpg
et cette base de données :
$ cat /home/login/Photos/.tags
[a.jpg]
foo
bar
[b.jpg]
foo

Si votre programme s'appelle tagfs, on montera le système de fichiers virtuel ainsi :

$ mkdir /home/login/Photos-avec-tags
$ tagfs /home/login/Photos /home/login/Photos-avec-tags
$ ls /home/login/Photos-avec-tags
a.jpg
b.jpg
foo/
bar/
$ ls /home/login/Photos-avec-tags/foo/
a.jpg
b.jpg
bar/
$ ls /home/login/Photos-avec-tags/foo/bar/
a.jpg
$ ls /home/login/Photos-avec-tags/bar/
a.jpg
foo/
$ ls /home/login/Photos-avec-tags/bar/foo/
a.jpg
$ ls /home/login/Photos-avec-tags/coin/
ls: cannot access 'coin': No such file or directory

Au démontage de /home/login/Photos-avec-tags/, la base de données éventuellement modifiée est sauvegardée dans le fichier /home/login/Photos/.tags (après avoir fait un backup de l'ancienne version).

$ fusermount -u /home/login/Photos-avec-tags

Sémantique de la modification des tags

Pour ajouter un tag "baz" à la photo a.jpg :

$ ln a.jpg baz/a.jpg
Tagguer un fichier autrement n'est pas autorisé.

Pour enlever le tag "foo" :

$ rm foo/a.jpg

Remplacer le tag "foo" par "baz" :

$ mv foo/a.jpg baz/a.jpg

Ces trois opérations de modification ne sont autorisées que dans les répertoires de 1er niveau. Elles sont interdites dans le répertoire racine ou dans les sous-sous-répertoires (voir les extensions plus bas).

Pour créer un tag:

$ mkdir montag/
$ ln a.jpg montag/a.jpg
Pour supprimer un tag inutilisé:
$ rm montag/a.jpg
$ rmdir montag

Consignes

On commencera par utiliser FUSE sous Linux. Ca nécessite d'avoir l'en-tête fuse/fuse.h (qui vient avec le paquet libfuse-dev sous Debian/Ubuntu), et d'avoir les droits en lecture/écriture sur le fichier /dev/fuse.

On pourra se baser sur l'exercice 1 du TD4 (sujet et fichiers source).

Toute l'implémentation devra se faire avec une complexité raisonnable :

Ceci devra être illustré en montrant le cout des opérations de base (ls, ln, rm, mv selon les nombres de fichiers totaux et concernés, et selon le nombre de tags totaux et concernés).

Des tests de fonctionnement et de performance sont fournis ici.
Il est vivement conseillé d'ajouter d'autres tests pour vérifier que vos extensions fonctionnent.

Si vous modifiez la sémantique du système de fichiers, il faudra adapter les tests ci-dessus.

Extensions proposées
Remarques
Updated on 2023/06/28.