Problemas e Decisões na Implementação
Objetos e estruturasUm dos maiores problemas no processo de implementação
foi a decisão de qual entidade do VFS seria um objeto, e qual apenas
seria uma estrutura. Mesmo implementado em C, o sistema de arquivos virtuais
do Linux tenta aplicar conceitos de orientação a objetos a
suas estruturas. Para tanto, quase todas as estruturas internas (inode, superblock,
dentry, etc.) recebem ponteiros de funções, para se comportarem
de maneira flexível (e para terem corportamento). A princípio,
pensamos em criar interface para Superblock e Inode, já
que o Inode é um objeto básico e necessário na comunicação
entre cliente e servidor. Dentry e File poderiam ficar apenas
localmente, pois são abstrações para organização
e acesso aos dados, respectivamente. Entretando, após um desenvolvimento inicial, vimos que a
vida dos Inodes no espaço de usuários era extremamente pequena.
Criavamos objetos apenas para trocar algumas informações, depois
teríamos que criá-los novamente para gravar uma página,
e novamente para outra, e assim por diante. Decidimos então pela transformação
do Inode em estrutura, contendo uma referência ao Superblock que representa
o diretório em disco. Assim, na realização da operação
writepage, por exemplo, após conseguir o Inode com o método
readinode do Superblock representando o espaço de nome todo, basta
invocar o método writepage no superbloco do Inode recebido. A maioria
dos métodos funcionam dessa maneira. As outras estruturas criadas são obviamente de fluxo de dados.
Statfs, Dirent, e Page, apenas carregam informações importantes
na comunicação.
Representação de dados
O MóduloApesar de termos a disposição módulos para os sistemas de arquivos Coda e PVFS, decidimos começar um módulo do "zero", já que o objetivo do projeto era o aprendizado. Isso nos obrigou a aprender a criar módulos no Linux e o funcionamento do VFS. Esse aprendizado fez com que demorássemos mais do que imaginávemos, além disso, por ser nosso primeiro sistema de arquivos, imaginamos que o código está extramamente instável. Um agravante, e que foi a maior dificuldade que tivemos ao implementar o módulo, é que o VFS tem como política fazer caching intensivo tanto dos meta-dados, como dos dados em si. Isso tipo de cache é muitas vezes indesejado em sistemas distribuídos devido à dificuldade em se manter uma coerência completa entre todos os participantes do sistema. A solução adotada foi de sempre invalidar os dados e meta-dados dos arquivos após serem usados. Obviamente, essa política resultado num sistema extremamente ineficiente, mas foi a maneira mais simples para resolvermos a questão. Um outro problema que tivemos foi a falta de documentação com relação à interface de alguns métodos do VFS. Um exemplo é com relação ao readdir que deve retornar entradas do diretório aberto. Não sabíamos como atualizar corretamente o conteúdo do filp->f_pos. E ao olhar em outros FSes do Linux parece que alguns atualizavam por número de entradas lidas, e outros por bytes. Tivemos que testar todas as possibilidades aparentemente possíveis até chegar numa versão que funcionasse.
Autores:
Last modified: Thu Jun 6 00:31:45 EST 2002 |