optimad/bitpit-private

VTK: bug in metodo write

edoardolombardi opened this issue · 5 comments

Il metodo write di VTK che prende una stringa come input va in deadlock.

void VTK::write( const std::string &name, VTKWriteMode writeMode ){

@haysam @andrea-iob potreste risovlerlo oppure togliere direttamente il metodo se non si riesce a sistemarlo? La funzione write senza stringa in input sembra funzionare definendo il nome del file e la directory con i relatvi metodi.

E' strano perchè il metodo non fa altro che memorizzare temporaneamente il vecchio nome, settare il nuovo, scrivere (con la write di default) e poi rimettere il vecchio nome.
In più nel intero modulo non c'è una chiamata MPI e quindi è difficile che le VTK vanno in deadlock.
Per capire qualcosa bisogna avere il codice che crea il problema. Possiamo vederlo nei prossimi giorni insieme.

I metodi di default di gestione dei counter sono diversi, il problema forse è lì.

void write( VTKWriteMode writeMode=VTKWriteMode::DEFAULT ) ;
void write( const std::string &, VTKWriteMode writeMode=VTKWriteMode::NO_INCREMENT ) ;

Credo anche che ci sia qualche bachetto e/o controllo mancante nelle condizioni di controllo dei metodi di gestione del counter.

if( writeMode == VTKWriteMode::DEFAULT || writeMode == VTKWriteMode::NO_INCREMENT ){
m_fh.incrementCounter() ;
}

if( writeMode == VTKWriteMode::NO_INCREMENT ){
counter = getCounter() -1 ;
setCounter( counter) ;
}

Ho risolto. Il problema in verità era il nome del file passato come argomento al metodo che pensavamo dovesse contenere la directory, ma in verità viene sovrascritto solo il nome a cui viene preposta la path vecchia.
Se la path deve essere comunque fissata con setDirectory forse conviene o inserire anche l'argomento directory o eliminare questo metodo che prende in argomento il nome e l'utente cambia a proprio piacimento nome directory.

Faccio il push di un nuovo branch in cui ho reso coerenti i VTKWriteMode di default dei due metodi e aggiunto un check sulla bontà del filehandler in testa al metodo write. Vedi tu se ti sfagiola.

Chiudo perché il baco non c'era, restano i dubbi sulle condizioni per la gestione del counter.

Immagino che i default diversi non siano una svista, quando si usa la funzione write con il nome del file è probabile che si stia scrivendo un file al di fuori della storia temporale e che quindi non si voglia incrementare il contatore (@haysam potrà confermare o smentire questa mia supposizione).

A occhio anche la gestione del counter sembra corretta: nel caso "NO_INCREMENT" si riporta il counter al valore dell'ultima scrittura, si scrive il file e poi si rimette il counter al valore iniziale. Non ho fatto prove, sto solo guardando il codice. Se hai notato numerazioni sbagliate aspettiamo il parere di Haysam.

@andrea-iob ok, thanks; mi era oscuro il motivo dei default diversi.
Mò ho capito l'uso del counter. Viene incrementato dopo ogni scrittura non prima.
Non ho notato nessuna numerazione sbagliata, la uso raramente e solo in debug, mi era comparso il dubbio vedendo il codice nel cercare il motivo del deadlock che avevo.