Validando Sistemas Distrıbuidos em Java com RMI Utilizando Injeç

Propaganda
Validando Sistemas Distrı́buidos em Java com RMI
Utilizando Injeção de Falhas
Vieira, Marcio. J.1
1
Departamento de Informática – Universidade Federal do Paraná (UFPR)
Curitiba – PR – Brasil
[email protected]
Abstract. This article presents as fault injection of imperfections for experimental validation of Java applications with RMI (Remote Method Invocation),and
the behavior of these distributed systems, after the injection of software imperfections affecting attributes and public object methods of the interface Through
an application they are intercepting the remote calls of protocol RMI during the
execution of the class stub, for the injection of imperfections.
Resumo. Este artigo apresenta como realizar injeção de falhas para validação
experimental de aplicações Java com RMI ( Remote Method Invocation ),
e o comportamento deste sistemas distribuı́dos, após a injeção de falhas de
software afetando atributos e métodos de objeto público da interface. Através
de uma aplicação são interceptando as chamadas remotas do protocolo RMI
durante a execução da classe stub, para a injeção de falhas.
1. Introdução
Sistemas distribuı́do é uma referência à computação paralela e descentralizada,
realizada por dois ou mais computadores conectados através de uma rede, cujo objetivo
é concluir uma tarefa em comum. Os Sistemas distribuı́dos em Java são muitos usados
para serviços de alta disponibilidade que exigem que mecanismos de tolerância a falhas
sejam validados, para que não apresentarem um comportamento inesperado no momento
que que são requisitados no ambiente operacional. Injeção de Falhas é uma técnica para
melhorar a cobertura de um teste introduzindo falhas ao sistema. Java é uma linguagem
de programação orientada a objeto desenvolvida pela Sun Microsystems [Spec 2007]
e o RMI (Remote Method Invocation) é uma interface de programação que permite a
execução de chamadas remotas no estilo RPC em aplicações desenvolvidas em Java.
Para validar este ambiente sugerimos neste trabalho a injeção de falhas para validação
experimental de aplicações Java com RMI. As falhas injetadas serão baseadas em falhas
de interface seguindo um sistema de padrões para injeção de falhas [Leme 2001]. A
incorporação de sistemas computacionais ao cotidiano para o atendimento de serviços
de missão crı́tica exige confiança no comportamento deste serviço, pois uma falha
descoberta após o sistema estar em operac cão pode gerar consequências desastrosas.
O middleware para objetos distribuı́dos, Remote Method Invocation (RMI) da SUN
Microsystem [Spec 2007] é muito utilizado para o desenvolvimento de aplicações Java
distribuı́das, embora ainda disponha de uma infra-estrutura básica para a construção
de aplicações distribuı́das, devem existir mecanismos de tolerância a falhas para que
estes sistemas não apresentem um comportamento inesperado no momento que são
requisitados no ambiente operacional. Este artigo apresenta o comportamento de
sistemas distribuı́dos desenvolvidos sobre Java com RMI na injeção de falhas, auxiliando
na validação de aplicações desenvolvidas sobre esta plataforma, utilizando uma aplicação
para injeção de falhas de software afetando atributos e métodos de objeto publico da
interface [Regina O. M. 2003], e assim definição de um modelo de falhas para RMI.
2. Injeção de Falhas
Injeção de falhas é uma técnica de teste em que se procura produzir ou
simular falhas e observar o sistema sob teste para verificar sua resposta nesta condição
[Hsueh 1997]. Quando conhecemos o modelo de falhas no sistema podemos criar falhas
para injeta-las. Experimentos de injeção de falhas também podem revelar problemas de
software, que não são encontrados com técnicas tradicionais de testes e métodos formais
[Voas 1997].
2.1. Injeção de falhas por Software
Uma ferramenta de injeção de falhas por software geralmente é um trecho de
código que usa todos os ganchos ( hooks ) possı́veis do processador e do sistema para
criar um comportamento incorreto de maneira controlada [Carreira 1998]. Está técnica
pode simular folhas de hardware, de software e de interface. Neste artigo vamos injetar
falhas por software em uma aplicação distribuı́da desenvolvida sobre a arquitetura da
RMI.
2.2. Ferramentas de Injeção de Software
Para que se possa injetar falhas é necessário dispor de ferramentas apropriadas. Essas ferramentas executam o sistema sobre teste e produzem ou simulam a
presena de falhas, monitorando o sistema para verificar qual é o seu comportamento
[Gabriela J.; Regina O. M.; Taisy S.; Martins 2004].Jaca é uma ferramenta de Injeção de
Software desenvolvida em Java com alta portabilidade [Regina O. M. 2003] usando um
o Javassist reflection toolkit [Chiba 1998], compatı́vel com JVM padrões, tanto o Jaca
como Javassist não necessitam do código fonte da aplicação para serem utilizados, porém
e necessário conhecer o mı́nimo de informação sobre a aplicação Java Distribuı́da.
2.3. Sistemas padrões de Injeção de Falhas
No desenvolvimento de software e comum deparar-se com problemas que são
recorrentes dentro de um determinado domı́nio de aplicações e nã o raro, resolvem-se
esses problemas de forma similar a outras solucoes já utilizadas por outros desenvolvedores.Essas solucoes podem ser documentadas em forma de padrões que são independentes
de linguagens de programacao. Esses padrões auxiliam o desenvolvimento mais
eficiente,robusto, portável e reutilizável [Schmidt 1995], facilitando o entendimento e
instanciando soluções que tém sido consideradas eficientes para solucionar os problemas
a que se propõem.
3. Remote Method Invocation RMI
A RMI permite que objetos Java executados num mesmo computador ou em
computadores separados se comuniquem entre si via chamadas de métodos remotos. A
RMI está baseada em uma tecnologia anterior semelhante para programação procedural,
chamadas de chamadas de procedimento remoto ( remote procedure call RPCs ). A
RPC permite que um programa procedural chame uma função de outro computador
tão convenientemente como esta função fosse parte do mesmo programa executado no
mesmo computador [Deitel 2004]. A RMI é a implementação da RPC por Java para
comunicação distribuı́da de um objeto Java com outro. Uma vez que um método (ou
serviço) de um objeto Java é registrado como sendo remotamente acessı́vel, um cliente
pode “pesquisar“ (“lookup“) esse serviço e receber uma referência que permita ao cliente
utilizar esse servio. Como com RPC, a ordenação (marshal) de dados é tratada por
RMI. A RMI oferece transferência de objetos de tipos de dados complexos através do
mecanismo de serialização de objeto [Deitel 2004].
4. Reflexão Computacional
De acordo com Maes [Maes 1987], computação reflexiva é a atividade desempenhada por um sistema computacional quando a computação realizada é sobre a
sua própria computação. A Reflexo Computacional é definida como uma técnica de
programaç ão que permite ao programador obter informações a respeito do próprio
programa, com o objetivo de monitorá-lo, adicionar novas funcionalidades e mesmo
fazer alterações adaptativas em tempo de execuo [Silveira 2003]. Sua utilização no
processo de teste possibilita realizar uma anlise da aplicao de forma dinãmica, sem a
necessidade de instrumentar o cdigo-fonte da aplicao. Atravs da reflexão é possı́vel
monitorar classes e objetos especı́ficos, realizando uma intervenção na computação da
aplicação em teste [Silveira 2003]. neste trabalho usaremos como apoio a ferramenta
Javassist. [Chiba 2004] para reflexão.
4.1. Javassist
Javassist (Java Programming Assistant) faz simples manipulação bytecode java.
Isto é, uma biblioteca para editar bytecodes em Java, habilita programas desenvolvidos
em Java para definir uma nova classe em tempo de execução modificando o arquivo da
classe que a JVM ( Java Virtual Machine ) está carregando [Chiba 2006].
5. Metodologia
Através de uma aplicação será interceptando as chamadas remotas do protocolo
RMI ( Remote Method Invocation ) durante a execução da classe stub, para a injeção
de falhas, as interceptações serão realizadas em um sistema distribuı́da simples que será
utilizado apenas como base de estudos. Todas as falhas apresentadas serão catalogadas.
As classes stub são geradas pelo compilador RMI ( rmic ) e não são considaredas
classes do sistema podendo ser reflexionadas pelo carregador de classes do Javassist.
Na Figura 1, demostramos a idéia básica que vamos implementar para validara injeo de
falhas em RMI, através da classe stub, uma aplicação exemplo com applet Java, chama
um método remoto ( RMI ) de um determinado web-server.
Figura 1. Chamada de método remoto por RMI.
6. Cronograma de Atividades
A tabela 1 apresenta as atividades e serem desenvolvidas pelo projeto com
datas previstas e o estado atual de realização. o contato com os desenvolvedores de uma
ferramenta chamada Jaca, que implementa injeções semenhantes foi realizado solicitando
o código fonte para darmos continuidade ao trabalho já realizado anteriormente.
Data
Atividade
Estado
10/04/2007 Aplicação distribuı́da usando RMI.
Concluı́do
16/04/2007 Entrega da proposta de trabalho.
A validar
16/04/2007 Fazer Contato com Desenvolvedor do JACA.
Concluı́do
30/04/2007 Alterar Jaca para injetar falhas em RMI .
A realizar
01/05/2007 Melhorar e complementar artigo com base em novas referências A realizar
07/05/2007 Analizer Projeto com Prof. Aldri.
A eealizar
15/05/2007 Descrever conclusões Sobre testes realizados.
A realizar
Tabela 1. Cronograma de Atividades.
7. Conclusão
O artigo tem intensão de apresentar uma solução para injeção de falhas na
arquitetura de sistemas distribuı́dos baseados em RMI. trabalhos publicados anteriormente não implementaram está solução para arquitetura RMI mas com base no estudo
de Martins, E. [Gabriela J.; Regina O. M.; Taisy S.; Martins 2004], podemos afirmar que
possivel implementar a proposta descrita neste artigo.
Referências
Carreira, J. e Silva, J. G. (1998). Why do some (weird) people inject faults? acm sigsoft.
In Software Engineering Notes. Volume 23, Número 1, pp. 42-43. Janeiro 1998.
Chiba, S. (1998). Javassist - a reflection-based programming wizard for java. In Proc. of
the ACM OOPSLA 9́8. Outubro, 98.
Chiba, S. (2004). Javassist: Java bytecode engineering made simple java. In Developerś
Journal. vol. 9, issue 1, January 8, 2004.
Chiba, S. (2006). Javassist. url: http://www.csg.is.titech.ac.jp/ chiba/javassist/ acessado
em 20/04/2007.
Deitel, H. M. (2004). Java, como Programar. Bookman, 4 edition.
Gabriela J.; Regina O. M.; Taisy S.; Martins, E. (2004). Validando sistemas distribuı́dos
desenvolvidos em java utilizando injeção de falhas de comunicação por software. In
SBRC 2004.
Hsueh, M. T. T. I. R. (1997). Fault injection techniques and tools. In IEEE Computer.
Volume 30, Número 4, pp. 75-82.Abril 1997.
Leme, N.G.M. e Martins, E. R. e. C. (2001). A software fault injection pattern system. In
Proc. of the IX Brasilian Symposium on Fault-Tolerant Computing. Florianópolis ,SC,
Brasil, Març01, pag99-113.
Maes, P. (1987). Concepts and experiments in computational reflection. In Proceeding of
OOPSLA 1987. Orlando,Estados Unidos,outubro 1987.
Regina O. M., Martins, E. (2003). Jaca a software fault injection tooll. In DNS 2003.
Schmidt, D. C. (1995). Using design patterns to develop reusable object-oriented communication software. In Communications of the ACM. v. 38(10), pp. 65-74. Outubro
1995.
Silveira, F. F. (2003).
Ferramenta de apoio ao teste de aplicações
java baseada em reflexão computacional.
In Disponı́vel em:
¡http://www.inf.ufrgs.br/pos/SemanaAcademica/Semana2000/FabioSilveira¿. Acesso
em: 20 set. 2003.
Spec, J. (2007). Java Especification. url: http://java.com.sun/ acessado em 10/04/2007.
Voas, J. (1997). Software fault injection: Growing “safer“ system. In Proceedings of
IEEE Aerospace Conference 1997. v.2, pp.551-561.Aspen, Estados Unidos. Fevereiro
1997.
Download