Skip to content

Fix/add lock acapy 012#7

Open
Alisson-tech wants to merge 3 commits into
main-0.12.1from
fix/add_lock_acapy_012
Open

Fix/add lock acapy 012#7
Alisson-tech wants to merge 3 commits into
main-0.12.1from
fix/add_lock_acapy_012

Conversation

@Alisson-tech

Copy link
Copy Markdown

Contexto & Problema

Durante testes de carga com emissões simultâneas de credenciais revogáveis, o ACA-Py apresentou falhas de concorrência. Ao receber múltiplas requisições paralelas para a mesma definição de credencial, ocorriam condições de corrida (race conditions) na reserva de índices do registro de revogação e na inicialização da rotação do arquivo Tails. Esse conflito corrompia o estado das transações no banco de dados e interrompia o fluxo de emissão.

Solução Proposta

Lock Pessimista no Banco de Dados: Adicionamos um lock pessimista no momento em que o agente consulta e reserva o índice no registro de revogação.
Garantia de Integridade: O recurso (revocation_registry_definition e seus índices) fica travado transacionalmente durante o acesso concorrente da credencial corrente, enfileirando de forma segura as próximas requisições de escrita.
Impacto

Eliminação de colisões de índices sob alta concorrência.
Maior segurança e robustez transacional no banco de dados.
Estabilidade no processo automático de rotação de registros sob picos de carga.

CATEGORY_REV_REG_DEF = "revocation_reg_def"
CATEGORY_REV_REG_DEF_PRIVATE = "revocation_reg_def_private"
CATEGORY_REV_REG_ISSUER = "revocation_reg_def_issuer"
CATEGORY_REV_REG_DEF_LOCK = "revocation_reg_def_lock"

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tag para o lock

"Revocation registry definition private data not found"
# If an index was already pre-allocated by the caller (using a distributed lock),
# we don't need a transaction to increment it here. We just fetch the current state.
if preallocated_rev_reg_index is not None:

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verifica se o rev_reg_index está disponível ou foi preallocado por outra requisição


async def _get_and_reserve_revocation_index(
self, cred_def_id: str
) -> Tuple[bool, Optional[str], Optional[str], Optional[int]]:

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Método para reservar o index do lock

rev_info_tags = rev_list_entry.tags
rev_reg_index = rev_info["next_index"]

if rev_reg_index >= anoncreds_rev_reg_def.max_cred_num:

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se mantém a lógica anterior a rotação acontece no penultimo index:

max_cred_def = 500
rotação = 499

Lembrando que o index 0 é ignorado no acapy (base 1).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant