Oggi è stata una giornata infernale...
Stamattina sql server bloccato, consumo di cpu a palla e le query che vanno in timeout, mi accorgo che ci sono un sacco (parlo di migliaia) di conversation_enpoints appesi e relativi a service che non esistono più, il log pieno di eventi che indicano che sql server non è riuscito a comunicare con i service che non ci sono più, un problema che ho riscontrato anche in passato. Passo uno script che termina forzatamente tutti gli endpoint "appesi" ma sql server non ne vuole sapere, riavvio sql server e da quel momento il finimondo.
Il db incriminato va in recovery, gli altri db non si aprono dando problemi di autenticazione anche se sono loggato con windows auth e sono amministratore. Chiamo Michele... SOS, proviamo a settare i permessi sui file ma niente da fare, posso scollegare e ricollegare i db ma non li apre. Michele mi suggerisce "disinstalla sql server e buttaci su la nuova r2" , ok mi rassegno e procedo, disintallo, riavvio, scarico il nuovo r2, installo e configuro.
Vado per fare l'attach dei file del vecchio db e tutti vanno tranne il database incriminato che ha causato tutto (e ti pareva), ho dovuto recuperare un backup ma alla fine tutto è andato online.
Morale della favola, ora vorrei capire cosa è successo e soprattutto come evitarlo.
Veniamo al problema delle sqldependency.
Con sqldependency puoi mettere dati in cache e farli invalidare in automatico quando il risultato di una determinata query cambia, il tutto con una notifica da parte di sql server e non con un pull continuo...figata, se non fosse per un piccolo particolare...scenario:
1-Avvio con sqldependency.Start() la gestione del service broker
2-utilizzo le dipendenze che mi creano tanti endpoint sul db
3-quando cambiano le tabelle gli endpoint comunicano con iis e invalidano la cache, tutto ok
4-l'applicazione va in riciclo
5-chiamo sqldependency.Stop() in Application_end che dovrebbe chiudere il servizio e tutte le code (ma purtroppo questo non avviene), così nel tempo mi ritrovo una valanga di endpoint senza più il servizio a cui si riferiscono e una valanga di errori del tipo
The query notification dialog on conversation handle '{....... }.' closed due to the following errorCannot find the remote service etc etc etc because it does not exist.
Ho notato che alle volte il riciclo dell'application pool va oltre il timeout fissato a 90 secondi e in quel caso mi sa che Application_end non viene richiamato, ho provato a portare il timeout a 180 e vediamo che succede, ma credo che anche se sqldependency.Stop() viene eseguito le cose non vanno proprio per il verso giusto. Daltronde c'è un modo per essere certi che Application_end sia eseguito?
Ho anche trovato questohttp://social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/03180f45-cd83-4913-8f0e-3d8306f01f06uno che ha addirittura creato un script (che periodicamente lancia con dei trigger) per ripulire gli endpoint, ma da altre parti leggo che chiudere gli endpoint così andrebbe fatto solo in fase di sviluppo.
Alla fine non so che fare, qualcuno ha suggerimenti da darmi?
P.S.:Grazie Michele per il supporto :)
Associazione Culturale DotNetCampania - C.F.: 95127870632