Postmortem di un problema

Posted on Sep 20, 2021

Questo articolo vuole essere un’analisi post-mortem di un problema che mi è costato svariate ore di lavoro.

Problema

Sto lavorando ad un’applicazione Spring Boot 2.x utilizzando Spring Data Mongodb. Per il calcolo di alcune statistiche ho utilizzato il framework di aggregazione messo a disposizione dal database.

Ho iniziato con il definire la query mongodb necessaria a risolvere il problema.

Dopo aver costruito la query sono passato ad implementare il relativo codice nel progetto Spring.

L’esecuzione del codice generava un’eccezione del driver mongodb utilizzando una particolare funzione che permette di considerare il timezone durante l’estrazione del mese da un campo data.

Risultato che volevo raggiungere:

month: {$month : { date: "$date", timezone: "Europe/Rome"}}

Codice Java incriminato

DateOperators.Month.monthOf("date").withTimezone(Timezone.valueOf("Europe/Rome"))

Ho investito parecchio tempo per capire dove stava il problema, provando varie azioni:

  • modificando il codice,
  • leggendo la documentazione della classe,
  • facendo ricerche in rete,
  • descrivendo il problema su StackOverflow,
  • chiedendo aiuto al jvm user group della mia zona.

Non arrivando ad una soluzione, ho deciso di creare un progetto ad-hoc estrapolando solo il codice problematico per semplificarne l’analisi.

Il codice eseguito nel nuovo contesto non lanciava alcuna eccezione. Questo mi ha permesso di scremare alcuni dubbi. Su tutti: un baco della versione di Spring Data Mongodb oppure un mio errore nello scrivere il codice.

In cosa differivano i due contesti ? L’eccezione veniva lanciata nell’esecuzione di un test, da lì l’illuminazione: i test non utilizzano l’istanza reale di MongoDb, ma un mongodb embedded.

Provando l’esecuzione reale del progetto ho avuto la conferma che il codice era pienamente funzionante e il problema era dovuto al database embedded.

Conclusione

Da questa esperienza porto a casa due insegnamenti:

  • Se ci si trova davanti ad un problema persistente, meglio investire del tempo prima possibile per creare un progetto ad-hoc per investigarlo meglio.
  • I database embedded sono molto pratici da usare nei test, ma bisogna ricordarsi che non sono esattamente uguali alle istanze reali.