Un limite nascosto di 50 byte nei pattern LIKE di SQLite ha causato il crash di Cloudflare Workers quando il progetto Agentic Inbox ha tentato di cercare oggetti di email lunghi; limitare le stringhe di ricerca a 48 caratteri ha risolto il problema.

Cosa ha interrotto l'edge runtime

Agentic Inbox esegue ogni casella postale all'interno di un Cloudflare Durable Object, utilizzando un database SQLite embedded per l'archiviazione. L'agente basato su IA costruisce un pattern di ricerca come %search_term%. SQLite impone un limite rigido di 50 byte sulla lunghezza totale di un pattern LIKE. Quando un utente inseriva un oggetto più lungo di 48 caratteri, i simboli % circostanti spingevano il pattern oltre tale limite. SQLite ha generato un errore di runtime non gestito, che l'ambiente limitato del Worker ha trattato come fatale. L'intero script si è interrotto, rendendo la casella postale inutilizzabile e l'agente IA fuori uso.

Come è stato scoperto il bug

Sentry ha registrato le eccezioni non gestite provenienti dai Worker. Al verificarsi del crash, Sentry ha registrato l'esatta riga in cui SQLite ha sollevato l'errore. La sua funzione "Seer AI" ha analizzato lo stack trace, evidenziato la costruzione del pattern LIKE e suggerito che la lunghezza del pattern fosse la causa. Una rapida consultazione della documentazione di SQLite relativa al tempo di compilazione ha confermato la restrizione di 50 byte, e il team ha utilizzato Gemini per verificare il limite e calcolare una lunghezza massima sicura per l'input dell'utente.

La correzione chirurgica

La risoluzione ha richiesto tre piccole modifiche, tutte all'interno della routine di ricerca esistente:

  • Imporre un limite rigido di 48 caratteri su qualsiasi termine di ricerca in entrata.
  • Tagliare la stringa di input a quella lunghezza prima di concatenare i wildcard %.
  • Lasciare invariato il resto della query, preservando l'accuratezza della ricerca senza aggiungere nuove librerie.

Poiché la regolazione avviene prima che la query raggiunga SQLite, il pattern finale non supera mai la soglia dei 50 byte e il Worker non va più in crash. Non sono state aggiunte dipendenze extra, mantenendo il codebase leggero.

Perché è importante

I database ospitati sull'edge sono attraenti per casi d'uso a bassa latenza, ma ereditano i medesimi vincoli delle versioni on-premises. Un oscuro limite di compilazione può trasformarsi in un bug che blocca la produzione quando un runtime tratta qualsiasi eccezione non gestita come fatale. In questo caso, il crash ha impedito il funzionamento di un assistente email basato su IA per qualsiasi utente che digitasse un oggetto lungo, colpendo direttamente l'esperienza utente e la promessa di affidabilità delle piattaforme serverless.

Cosa si sarebbe potuto fare diversamente

La correzione è semplice, ma evidenzia un passaggio di validazione mancante. Una sanificazione dell'input che controlli la lunghezza del pattern prima di costruire la stringa SQL avrebbe permesso di individuare il problema durante lo sviluppo anziché in produzione.

A cosa prestare attenzione in futuro

Gli sviluppatori che distribuiscono SQLite su runtime edge dovrebbero controllare tutte le costruzioni di query che prevedono il pattern matching, specialmente quelle che aggiungono wildcard o caratteri di escape. Sentry ha catturato l'esatta riga in cui SQLite è fallito. Man mano che l'edge computing guadagna terreno, i limiti nascosti delle piattaforme emergeranno più spesso, e l'abitudine di validare gli input rispetto ai vincoli documentati porterà i suoi frutti.

In sintesi: Un limite di 50 byte sui pattern LIKE di SQLite può causare il crash di Cloudflare Workers, ma limitare i termini di ricerca a 48 caratteri elimina l'errore senza alcun carico aggiuntivo: la prova che un piccolo passaggio di validazione può mantenere stabili i servizi edge.