gestão de dados partilhados em ambientes de computação móvel

gestão de dados partilhados em ambientes de computação móvel gestão de dados partilhados em ambientes de computação móvel

asc.di.fct.unl.pt
from asc.di.fct.unl.pt More from this publisher
11.04.2013 Views

220 APÊNDICE A. DOORS Para detectar esta situação, para cada volume, mantém-se a informação sobre o momento em que se realizaram (directa ou transitivamente) as últimas sessões de sincronização com os outros servidores — esta informação é transmitida e actualizada durante as sessões de sincronização. O facto de um servidor activo na vista instalada localmente não participar nas sessões de sincronização durante um período de tempo longo, considerando a frequência esperada das sessões de sincronização, pode indiciar que o servidor foi removido usando como patrocinador um servidor que é desconhecido (outra hipótese é tratar-se de um servidor desconectado temporariamente do sistema). Um servidor, i, que detecte a situação anterior deve tentar estabelecer uma sessão de sincronização com o servidor, j, que não tem participado nas sessões de sincronização. Se o servidor j responder, duas hipóteses são possíveis. Primeiro, j ainda pertence ao grupo de replicadores — neste caso a sessão de sincronização decorre normalmente. Segundo, j já não pertence ao grupo de replicadores e devolve a lista dos servidores que pertenciam ao grupo de replicadores no momento da sua remoção. No caso de existir algum elemento que não faça parte da vista instalada localmente, i deve tentar estabelecer uma sessão de sincronização com esse servidor. Caso todos os elementos da lista devolvida por j pertençam ao conjunto de replicadores conhecidos em i, i deve aguardar que a informação da remoção de j do grupo de replicadores seja propagada até si (ou pode, alternativamente, estabelecer uma sessão de sin- cronização com o patrocinador da remoção de j). Se o servidor j não responder, o servidor i pode usar o mecanismo de descoberta dos servidores que replicam um dado volume (descrito na secção 6.2.3) para tentar encontrar novos servidores que pertençam ao grupo de replicadores. A.2.5 Disseminação de novas operações Além do mecanismo básico de sincronização usando sessões epidémicas, cada servidor propaga os even- tos submetidos localmente usando um canal de disseminação não fiável (descrito na secção 6.2.3). O evento propagado tem a seguinte forma newop(viewid,id,op,nseqold), com viewid o identificador da vista no servidor que submete o evento, id o identificador do coobjecto no qual a operação foi sub- metida, op a sequência de operações que o servidor está a disseminar (op.srv e op.nseq identificam a operação), e nseqold o número de sequência da operação que tinha sido identificada anteriormente em op.srv. Um servidor, ao receber um evento newop(viewid,id,op,nseqold), verifica se o identificador da vista é igual ao identificador da vista instalada localmente e se o coobjecto referido é conhecido localmente. Em caso afirmativo, a operação op é entregue ao coobjecto com identificador id e o sumário das opera- ções conhecidas localmente é actualizado se se verificar que não existe nenhuma outra operação iden- tificada nesse servidor que não seja conhecida, i.e., seja o o coobjecto com identificador id, tem-se que o.l[op.srv] ≥ nseqold ⇒ o.l[op.srv] ← op.nseq.

Apêndice B Mobisnap B.1 Transacções móveis:linguagem As transacções móveis são especificadas num subconjunto da linguagem PL/SQL [112]. As (poucas) modificações introduzidas estão ligadas com as especificidades das transacções móveis e com limitações do protótipo do sistema Mobisnap. De seguida, apresentam-se brevemente os elementos que podem ser usados na definição de uma transacção móvel: Tipos Estão disponíveis os seguintes tipos escalares pré-definidos no PL/SQL: carácter e cadeia de caracteres, número inteiro e real com precisão variável, data, booleano. Constantes e variáveis É possível definir constantes e variáveis dos tipos pré-definidos. Instrução de atribuição Atribui o valor de uma expressão a uma variável. Bloco begin — [exception —] end Define uma sequência de instruções, com tratamento opcional de excepções. Uma excepção pode ser criada (lançada) usando a instrução raise. Instrução if Permite definir código executado condicionalmente (estão definidas as seguintes variantes: if — then, if — then — else, if — then — elseif ). Instrução select into Atribui o resultado de uma interrogação à base de dados a uma variável. Ao contrário do PL/SQL normalizado, esta instrução pode ser usada para obter o primeiro resultado de uma pergunta que tenha múltiplas respostas. Instruções update, insert e delete Modifica o estado da base de dados. Função notify Envia uma mensagem a um utilizador — permite especificar o destinatário da mensagem, o transporte a utilizar, e o conteúdo da mensagem a transmitir. 221

220 APÊNDICE A. DOORS<br />

Para <strong>de</strong>tectar esta situação, para cada volume, mantém-se a informação sobre o momento <strong>em</strong> que se<br />

realizaram (directa ou transitivamente) as últimas sessões <strong>de</strong> sincronização com os outros servidores —<br />

esta informação é transmitida e actualizada durante as sessões <strong>de</strong> sincronização. O facto <strong>de</strong> um servidor<br />

activo na vista instalada localmente não participar nas sessões <strong>de</strong> sincronização durante um período<br />

<strong>de</strong> t<strong>em</strong>po longo, consi<strong>de</strong>rando a frequência esperada das sessões <strong>de</strong> sincronização, po<strong>de</strong> indiciar que<br />

o servidor foi r<strong>em</strong>ovido usando como patrocinador um servidor que é <strong>de</strong>sconhecido (outra hipótese é<br />

tratar-se <strong>de</strong> um servidor <strong>de</strong>sconectado t<strong>em</strong>porariamente do sist<strong>em</strong>a).<br />

Um servidor, i, que <strong>de</strong>tecte a situação anterior <strong>de</strong>ve tentar estabelecer uma sessão <strong>de</strong> sincronização<br />

com o servidor, j, que não t<strong>em</strong> participado nas sessões <strong>de</strong> sincronização. Se o servidor j respon<strong>de</strong>r, duas<br />

hipóteses são possíveis. Primeiro, j ainda pertence ao grupo <strong>de</strong> replicadores — neste caso a sessão <strong>de</strong><br />

sincronização <strong>de</strong>corre normalmente. Segundo, j já não pertence ao grupo <strong>de</strong> replicadores e <strong>de</strong>volve a<br />

lista dos servidores que pertenciam ao grupo <strong>de</strong> replicadores no momento da sua r<strong>em</strong>oção. No caso <strong>de</strong><br />

existir algum el<strong>em</strong>ento que não faça parte da vista instalada localmente, i <strong>de</strong>ve tentar estabelecer uma<br />

sessão <strong>de</strong> sincronização com esse servidor. Caso todos os el<strong>em</strong>entos da lista <strong>de</strong>volvida por j pertençam<br />

ao conjunto <strong>de</strong> replicadores conhecidos <strong>em</strong> i, i <strong>de</strong>ve aguardar que a informação da r<strong>em</strong>oção <strong>de</strong> j do<br />

grupo <strong>de</strong> replicadores seja propagada até si (ou po<strong>de</strong>, alternativamente, estabelecer uma sessão <strong>de</strong> sin-<br />

cronização com o patrocinador da r<strong>em</strong>oção <strong>de</strong> j). Se o servidor j não respon<strong>de</strong>r, o servidor i po<strong>de</strong> usar o<br />

mecanismo <strong>de</strong> <strong>de</strong>scoberta dos servidores que replicam um dado volume (<strong>de</strong>scrito na secção 6.2.3) para<br />

tentar encontrar novos servidores que pertençam ao grupo <strong>de</strong> replicadores.<br />

A.2.5 Diss<strong>em</strong>inação <strong>de</strong> novas operações<br />

Além do mecanismo básico <strong>de</strong> sincronização usando sessões epidémicas, cada servidor propaga os even-<br />

tos submetidos localmente usando um canal <strong>de</strong> diss<strong>em</strong>inação não fiável (<strong>de</strong>scrito na secção 6.2.3). O<br />

evento propagado t<strong>em</strong> a seguinte forma newop(viewid,id,op,nseqold), com viewid o i<strong>de</strong>ntificador da<br />

vista no servidor que submete o evento, id o i<strong>de</strong>ntificador do coobjecto no qual a operação foi sub-<br />

metida, op a sequência <strong>de</strong> operações que o servidor está a diss<strong>em</strong>inar (op.srv e op.nseq i<strong>de</strong>ntificam a<br />

operação), e nseqold o número <strong>de</strong> sequência da operação que tinha sido i<strong>de</strong>ntificada anteriormente <strong>em</strong><br />

op.srv.<br />

Um servidor, ao receber um evento newop(viewid,id,op,nseqold), verifica se o i<strong>de</strong>ntificador da vista<br />

é igual ao i<strong>de</strong>ntificador da vista instalada localmente e se o coobjecto referido é conhecido localmente.<br />

Em caso afirmativo, a operação op é entregue ao coobjecto com i<strong>de</strong>ntificador id e o sumário das opera-<br />

ções conhecidas localmente é actualizado se se verificar que não existe nenhuma outra operação i<strong>de</strong>n-<br />

tificada nesse servidor que não seja conhecida, i.e., seja o o coobjecto com i<strong>de</strong>ntificador id, t<strong>em</strong>-se que<br />

o.l[op.srv] ≥ nseqold ⇒ o.l[op.srv] ← op.nseq.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!