Sistema P2P com Timestamping para Sincronização de Diretórios Jaime, Alison, Nuno e Pedro Disciplina: Gerenciamento de Dados Distribuído Prof. Eduardo Cunha de Almeida Junho / 2010 Programa disponível no repositório http://code.google.com/p/syncp2p/ via subversion (svn)
SyncPatry: Objetivos Sincronizar diretórios em várias máquinas Sincronização automática Backup de arquivos sobrescritos Tratar escritas concorrentes Manter a consistência dos diretórios
SyncPatry: Projeto Ideias Principais Catálogo: descreve o estado dos diretórios em um arquivo xml e em um hash em memória principal Sistema distribuído de geração de timestamping - permite que os arquivos recebam um número sequencial de versão Propagação dos Catálogos via leafsets Backups: arquivos sobrescritos ou removidos remotamente são copiados para o diretório de backup
Funcionamento Thread 1 - Principal Entra na rede Executa laço: Atualiza o catálogo local Se encontra um arquivo novo ou modificado Solicita um novo timestamp para o arquivo Envia o catálogo para os peers no seu leafset Thread 2 - Aguarda mensagens e responde
Funcionamento - mensagens São 4 os tipos de mensagens trocadas entre os peers: 1.GET_TIMESTAMP - solicitação de timestamp 2.RSP_TIMESTAMP - resposta de timestamp 3.SEND_CATALOG - envio de catálogo 4.GET_FILE - solicita arquivo Além do envio e recebimento de arquivos.
Tratamento de Mensagens 1. GET_TIMESTAMP (filename) enviada ao peer responsável pelo ID=hash(filename) incrementa contador associado ao filename responde RSP_TIMESTAMP com o timestamp 2. RSP_TIMESTAMP atualiza o catálogo 3. SEND_CATALOG Remove localmente arquivos removidos remotamente Solicita arquivos novos ou modificados remotamente enviando GET_FILE
Tratamento de Mensagens 4. GET_FILE envia o arquivo solicitado No recebimento do arquivo salva o backup, se necessário salva o novo arquivo atualiza o catálogo com a data de modificação do arquivo
Organização das Classes Principais 4 pacotes Java: default, catalogo, kts e p2p Package Default: SyncPastry.java - método main() FileSync.java - entrada na rede e laço principal (thread 1) Package Catalogo Catalogo.java - manipula o catálogo em arquivo xml e em memória principal, compara catálogo com lista de arquivos locais e compara dois catálogos.
Organização das Classes Principais Package kts gerencia o contador local de timestamps Package p2p tratamento de mensagens recebimento e envio de arquivos
Exemplo de Catálogo
Exemplo de Catálogo No catálogo, o arquivo pode ter os seguintes status: STATUS_OK - timestamp atualizado STATUS_REQUEST - aguardando novo timestamp STATUS_DELETED - arquivo removida STATUS_REQUEST_FILE - arquivo alterado remotamente foi solicitado
SyncPatry: Conclusões Programa P2P para sincronização de diretórios Gerador distribuído de timestamping Backup de versões antigas dos arquivos Projeto modular e facilmente extensível Código bem organizado e comentado Possíveis melhorias: Otimizar transmissão de arquivos via diff Versão interativa que sincroniza somente quando o usuário solicita
Exemplo: um log de execução Senário: diretório A: /tmp/synca contendo arquivos arquivo1.txt arquivo2.txt diretório B: /tmp/syncb inicialmente vazio Ações: 1. Criar novo.txt em A 2. Remover arquivo1.txt em A 3. Criar novo2.txt em B 4. Modificar arquivo2.txt em B
Log do Peer A - Inicialização 1. GDD - Iniciando o programa 2. Iniciando a rede p2p 3. Finished creating new node PastryNode em //192.168.1.1:9001 4. [difffiles-add]arquivo:arquivo2.txt nao existe no catalogo. 5. [difffiles-add]arquivo:arquivo1.txt nao existe no catalogo. 6. Solicitando um novo timestamp para arquivo2.txt
Log do Peer A Obtendo timestamps 1. Mensagem recebida por /tmp/synca -> GET_TIMESTAMP 2. Solicitando um novo timestamp para arquivo1.txt 3. Enviando timestamp 0 para o arquivo arquivo2.txt 4. Mensagem recebida por /tmp/synca -> RSP_TIMESTAMP 5. Timestamp 0 recebido para arquivo2.txt 6. Mensagem recebida por /tmp/synca -> GET_TIMESTAMP 7. Enviando timestamp 0 para o arquivo arquivo1.txt 8. Mensagem recebida por /tmp/synca -> RSP_TIMESTAMP 9. Timestamp 0 recebido para arquivo1.txt
Log do Peer A Enviando Arquivos 1. Enviando o catalogo. 2. Mensagem recebida por /tmp/synca -> GET_FILE 3. Enviando arquivo /tmp/synca/arquivo2.txt 4. Mensagem recebida por /tmp/synca -> GET_FILE 5. Enviando arquivo /tmp/synca/arquivo1.txt 6. Catalogo recebido. 7. Enviando o catalogo.
Log do Peer A Novo arquivo 1. Arquivo: novo.txt nao existe no catalogo. 2. Solicitando um novo timestamp para novo.txt 3. Mensagem recebida por /tmp/synca -> GET_TIMESTAMP 4. Enviando timestamp 0 para o arquivo novo.txt 5. Mensagem recebida por /tmp/synca -> RSP_TIMESTAMP 6. Timestamp 0 recebido para novo.txt 7. Enviando o catalogo. 8. Mensagem recebida por /tmp/synca -> GET_FILE 9. Enviando arquivo /tmp/synca/novo.txt
Log do Peer A Remoção de Arquivo Local 1.Catalogo recebido. 2.Arquivo:arquivo1.txt deixou de existir no diretorio local. 3.Catalogo recebido.
Log do Peer A Novo arquivo Remoto 1. Catalogo recebido. 2. Arquivo: novo2.txt nao existe no catalogo local 3. Arquivo solicitado: novo2.txt 4. Arquivo Recebido: novo2.txt
Log do Peer A Respondendo a Solicitação de Timestamp 1. Enviando o catalogo. 2. Catalogo recebido. 3. Mensagem recebida por /tmp/synca -> GET_TIMESTAMP 4. Enviando timestamp 1 para o arquivo arquivo2.txt 5. Catalogo recebido.
Log do Peer A Arquivo Remoto Modificado 1. Catalogo recebido. 2. Arquivo arquivo2.txt tem um timestamp maior 3. Arquivo solicitado: arquivo2.txt 4. Arquivo Recebido: arquivo2.txt 5. Criando diretorio de backup em /tmp/synca/.backup 6. Backup do arquivo arquivo2.txt feito. 7. Enviando o catalogo. 8. Catalogo recebido.