Problemas e Decisões na Implementação


Objetos e estruturas

Um 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

Um problema interessante foi no uso de tipos do CORBA. A princípio utilizamos um vetor de caracteres dentro da estrutura Page. Mas tivemos problemas na leitura de arquivos binários, mas não na de arquivos texto. Isso ocorreu pois esse tipo sofre alterações no processo de comunicação do CORBA. Para tal, existe um tipo mais apropriado, que é o octect na IDL, e CORBA::Octect na implementação em C++.

O Módulo

Apesar 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:

  • Livio Baldini Soares
  • Márcio Rodrigo de Freitas Carneiro
  • Roberto Pires de Carvalho


Last modified: Thu Jun 6 00:31:45 EST 2002