| Mensagem |
Resposta |
Login
Nessa iteração são trocadas as chaves públicas
do cliente e do servidor.
C->S: (LOGIN, novo cliente)
|
1) S->C: (LOGIN_OK, server Id)
2) S->C: (LOGIN_ERROR,
"already logged in") |
Logout
O servidor limpa as entradas do cliente
C->S: (LOGOUT) |
1) S->C: (LOGOUT_OK)
2) S->C: (LOGOUT_ERROR,
"not logged in.") |
Share
O cliente publica o objeto "brasil.frutas.Banana"
C->S: (SHARE, "brasil.frutas.Banana")
|
1) S->C: (SHARE_OK,
stamp1)
2) S->C: (SHARE_ERROR,
"brasil.frutas.Banana", "brasil.frutas.Banana is already shared.") |
Unshare
O cliente remove o objeto "brasil.frutas.Banana"
C->S: (UNSHARE, "brasil.frutas.Banana")
|
1) S->C: (UNSHARE_OK)
2) S->C: (UNSHARE_ERROR,
"brasil.frutas.Banana", "object is not shared")
3) S->C: (UNSHARE_ERROR,
"brasil.frutas.Banana", "you are not the owner of brasil.frutas.Banana.") |
Request
O cliente C1 pede uma cópia de Banana, que está com o cliente C2.
C1->S: (REQUEST, "brasil.frutas.Banana") |
1) S->C1: (REQUEST_OK,
C2)
2) S->C1: (REQUEST_ERROR,
"brasil.frutas.Banana","object is not shared") |
Reload
C1 pede Banana
para C2:
C1->C2: (RELOAD, "brasil.frutas.Banana") |
1) C2->C1: (RELOAD_OK,
brasil.frutas.Banana)
2) C2->C1: (RELOAD_ERROR,
"brasil.frutas.Banana", "object is not shared") |
Validate
O cliente C1verifica sua cópia de Banana. No primeiro caso, a cópia é válida,
e no segundo, antiga.
C1->S: (VALIDATE, "brasil.frutas.Banana",
stamp1) |
1) S->C: (VALIDATE_OK)
2) S->C: (VALIDATE_OK,
C2)
3) S->C1: (VALIDATE_ERROR,
"brasil.frutas.Banana", "object is not shared"
4) S->C1: (VALIDATE_ERROR,
"brasil.frutas.Banana", "timestamp signature check failed." |
BeginTrans
C1 pede direitos de escrita em Banana. A resposta (3) não foi implementada
nesta versão.
C1->S: (BEGIN_TRANS, "brasil.frutas.Banana")
|
1) S->C1: (BEGIN_TRANS_OK,
stamp1, C2)
2) S->C1: (BEGIN_TRANS_ERROR,
"brasil.frutas.Banana", "already locked")
3*) S->C1: (BEGIN_TRANS_ERROR,
"brasil.frutas.Banana", "you don't have permission to lock brasil.frutas.Banana.")
|
Commit
C1 inicia a primeira etapa do commit:
pedir ao servidor um novo TimeStamp para o objeto
modificado, e também um host para quem
mandá-lo:
C1->S: (COMMIT, "brasil.frutas.Banana")
|
1) S->C1: (COMMIT_OK,
stamp2, C2)
2) S->C1: (COMMIT_ERROR,
"brasil.frutas.Banana", "you don't have the lock")
3) S->C1: (COMMIT_ERROR,
"brasil.frutas.Banana", "owner not found, may have logged out.") |
Update
O servidor conclue a primeira etapa do commit: avisa C2 que um commit foi realizado:
S->C2: (UPDATE, "brasil.frutas.Banana")
|
Não há resposta. C2 envia
um GET a C1. |
Get
C2 inicia a segunda etapa do commit:
pegar de C1 o objeto modificado:
C1->C2: (GET, "brasil.frutas.Banana",
brasil.frutas.Banana, stamp2 ) |
1) C2->C1: (GET_OK,
brasil.frutas.Banana)
2) C2->C1: (GET_ERROR,
"brasil.frutas.Banana", "object is not shared") |
Unlock
A segunda etapa do commit termina quando C2
libera o lock de escrita no servidor:
C2->S: (UNLOCK, "brasil.frutas.Banana",
stamp2) |
1) S->C2: (UNLOCK_OK)
2) S->C2: (UNLOCK_ERROR,
"brasil.frutas.Banana", "object is not shared"))
3) S->C2: (UNLOCK_ERROR,
"brasil.frutas.Banana", "invalid timestamp"))
4) S->C2: (UNLOCK_ERROR,
"brasil.frutas.Banana", "object is not locked")) |
Rollback
C1 descarta mudanças. A operação
também libera o lock de escrita.
C1->S: (ROLLBACK, "brasil.frutas.Banana")
|
S->C1: (ROLLBACK_OK)
S->C1: (ROLLBACK_ERROR, "brasil.frutas.Banana", "you don't
have the lock") |
Ping
Servidor verifica se o cliente está acessível. Como a mensagem
é enviada por TCP, a simples conexão é suficiente para
um resultado positivo.
S->C: (PING) |
Não há resposta. |
Get Class
C1 esta carregando brasil.frutas.Banana e precisa da classe brasil.frutas.FrutaImpl.
C1->C2: (GET_CLASS, "brasil.frutas.Banana",
"brasil.frutas.FrutaImpl") |
1) C2->C1: (GET_CLASS_OK,
byte[])
2) C2->C1: (GET_ERROR,
"brasil.frutas.FrutaImpl", "class not found") |