Skip to content

deps: rust-samp 3.6.0, transporte pela mainthread e fecha a 1.4.0 - #67

Merged
NullSablex merged 1 commit into
masterfrom
deps/rust-samp-3.6.0
Oct 11, 2026
Merged

NullSablex merged 1 commit into
masterfrom
deps/rust-samp-3.6.0

Conversation

@NullSablex

@NullSablex NullSablex commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

Sobe o SDK para 3.6.0, passa o transporte de resultado para a fila da mainthread, corrige duas falhas que uma rajada de queries expunha e fecha a seção 1.4.0 do changelog.

mainthread como transporte

A 3.6.0 traz post_with, que entrega &mut T ao job — a rota que faltava para o resultado de uma worker thread aterrissar no estado do plugin. Com ela, os canais mpsc de resultado deixam de existir, tanto em query.rs quanto em password.rs (o mpsc que resta ali é só a fila de trabalho dos workers).

O worker que termina uma query, ou um hash Argon2id, chama post_with::<MysqlPlugin> entregando o resultado ao accept() do manager e some. O SDK drena essa fila imediatamente antes do on_tick, então o despacho continua acontecendo no on_tick e nada chega um tick depois do que chegava.

Entregar e despachar seguem sendo dois passos, por necessidade: post_with proíbe chamar Pawn de dentro do job, e a razão se aplica aqui exatamente — um public reentrando numa native pegaria um segundo &mut do mesmo plugin, porque o #[native] resolve o plugin com plugin::get cru, não com o with_instance, que recusaria. O post_with_amx separa as metades, mas entrega a resposta ao script só depois de o empréstimo terminar: tarde para manter um cache ativo durante a chamada. Bufferizar no job e despachar no tick atende às duas coisas.

A ordem FIFO continua nossa, no buffer de sequência, porque os jobs rodam em ordem de conclusão.

Rajada de queries matava o servidor, e travava a fila FIFO

Submeter 2000 queries num tick abortava o processo com memory allocation of 4194304 bytes failed. A causa é específica da arquitetura: uma thread por query, com a pilha padrão de 8 MiB, dentro de um servidor 32-bit — algumas centenas de workers vivos esgotam o espaço de endereçamento.

Dois problemas, os dois corrigidos:

  • Pilha de 256 KiB por worker. Um worker abre conexão, roda um statement e monta um cache; não recursa. O teto medido saiu de ~1700 workers para mais de 9000.
  • Thread recusada pelo SO não é mais pânico. thread::spawn entra em pânico quando o SO diz não; o wrapper da native engolia o pânico e a submissão se perdia — junto com o número de sequência, de modo que toda callback ordenada atrás dela esperaria para sempre. Agora é um resultado com erro comum: a sequência é contabilizada, o OnQueryError dispara e a native devolve false. Toda native de submissão devolve o resultado real da submissão.

RUSTSEC-2026-0253 deixou de se aplicar

O mysql 28.0.3 exige lru 0.18, e o lockfile agora traz 0.18.5. A correção estava mergeada no upstream desde 21/09 e nenhum cargo update a alcançava enquanto o driver pedia a faixa 0.16 — precisava de uma versão nova do driver, que chegou.

Sobra um aviso informativo, o do rustls-pemfile: sem manutenção, sem correção nem no master do driver, e removê-lo aqui significaria abrir mão do TLS ou manter um fork.

Dependências e workflows

  • cargo update fechando o lockfile: dez crates transitivos (cc, generic-array, powerfmt, serde e companhia, twox-hash, uuid, zeroize).
  • Sete actions re-pinadas para a release atual — upload-artifact v7.0.2, codeql-action v4.38.3, scorecard-action v2.4.4, install-action v2.87.27, action-gh-release v3.0.3, rust-cache v2.9.2, release-drafter v7.10.0 — SHA e comentário # vX.Y.Z juntos.
  • argon2 fica no 0.5 de propósito. O 0.6.0 é breaking exatamente onde não pode quebrar em silêncio: a feature std saiu, SaltString e OsRng mudaram de lugar, hash_password trocou de assinatura e PasswordHash está deprecado. Hashes já gravados por mysql_hash_password têm de continuar verificando após o bump, e provar isso merece PR própria.

Changelog

Seção ## [1.4.0] — 2026/10/11, cobrindo tudo desde a 1.3.0, com as entradas novas do transporte pela mainthread, da correção da rajada, do fechamento de lockfile/actions e da decisão sobre o argon2.

Verificação

Alvo i686-unknown-linux-gnu e um SA-MP 0.3.7 com MariaDB 11.8:

  • 196 testes passando, cargo clippy --all-targets -- -D warnings e cargo fmt --check limpos
  • cargo audit: um aviso informativo, nenhuma vulnerabilidade
  • mkdocs build --strict, verificação de codificação Pawn (21 fontes ASCII), --selftest (6 fixtures) e --check do gerador — todos limpos
  • Teste de força bruta: 9000 queries em rajada sem aborto, sem desordem na FIFO e sem submissão perdida
  • Teste de fumaça: conexão, MYSQL_SYNC, diagnóstico de TLS, leitura de limite, callback assíncrono e OnQueryError com ordem e mensagem corretas

Sobe o SDK para 3.6.0 (crates.io) e usa a fila da mainthread como
transporte de resultado: o worker que termina uma query, ou um hash
Argon2id, entrega o resultado ao plugin via post_with e some; os canais
mpsc de resultado do query.rs e do password.rs deixam de existir. O SDK
drena a fila imediatamente antes do on_tick, entao o despacho continua
no on_tick e nada chega um tick depois. A ordem FIFO segue nossa, no
buffer de sequencia.

Entregar e despachar ficam separados por necessidade, nao por gosto:
chamar Pawn de dentro do job deixaria um public reentrar numa native e
pegar um segundo &mut do plugin, porque o #[native] resolve o plugin com
plugin::get cru.

Corrige duas falhas que uma rajada de queries expunha. Worker agora
nasce com pilha de 256 KiB — num servidor 32-bit, algumas centenas de
workers com os 8 MiB default esgotavam o espaco de enderecos e abortavam
o processo; o teto medido foi de ~1700 para mais de 9000 workers. E
thread recusada pelo SO nao e mais panico: thread::spawn entrava em
panico, o wrapper da native engolia, e a submissao se perdia junto com o
numero de sequencia, travando para sempre as callbacks ordenadas na
fila. Agora virou resultado com erro: a sequencia e contabilizada, o
OnQueryError dispara e a native devolve false.

Fecha o changelog da 1.4.0 com data de release, atualiza o lockfile e
re-pina as sete actions que estavam atras da release atual. O argon2
fica no 0.5 de proposito: o 0.6.0 quebra a API de hash e a
compatibilidade dos hashes ja gravados merece PR propria.
@NullSablex
NullSablex force-pushed the deps/rust-samp-3.6.0 branch from e7496a5 to d68b3f0 Compare October 11, 2026 14:38
@NullSablex NullSablex changed the title deps: rust-samp 3.6.0, e fecha o changelog da 1.4.0 deps: rust-samp 3.6.0, transporte pela mainthread e fecha a 1.4.0 Oct 11, 2026
@NullSablex
NullSablex merged commit 10008bc into master Oct 11, 2026
11 checks passed
@NullSablex
NullSablex deleted the deps/rust-samp-3.6.0 branch October 11, 2026 14:43
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