Skip to content

Commit

Permalink
Issue #474
Browse files Browse the repository at this point in the history
Corretto problema deadlock durante l'elaborazione di un tracciato con un grande numero di righe che si verificava in GovPay in configurazione con piu' nodi.
  • Loading branch information
pintorig committed Mar 24, 2022
1 parent 638d69a commit 045d68d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 46 deletions.
67 changes: 22 additions & 45 deletions jars/core/src/main/java/it/govpay/core/business/BatchManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,20 +90,6 @@ public static boolean startEsecuzione(BDConfigWrapper configWrapper, String codB
}
} finally {
if(batchBD != null) {
try {
// disabilito selectforupdate
batchBD.disableSelectForUpdate();
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

try {
// reset autocommit
batchBD.setAutoCommit(true);
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

// chiusura connessione
batchBD.closeConnection();
}
Expand All @@ -118,16 +104,21 @@ private static Batch getRunningBatch(BatchBD batchBD, String codBatch) throws Se
return null;

try{
log.trace("lettura batch " + codBatch + " in corso...");
batch = batchBD.get(codBatch);
log.trace("lettura batch " + codBatch + " completata");
} catch(NotFoundException nfe) {
// Non c'e' un blocco, quindi non e' in esecuzione
log.trace("lettura batch " + codBatch + " completata, blocco non trovato, batch non in esecuzione");
return null;
}

if(batch.getNodo() == null) {
// Non c'e' un blocco, quindi non e' in esecuzione
log.trace("lettura batch " + codBatch + " blocco non trovato, batch non in esecuzione");
return null;
} else {
log.trace("lettura batch " + codBatch + " blocco presente, verifica timeout esecuzione");
// C'e' un blocco.
// Verifico se e' scaduto
long inizio = batch.getInizio().getTime();
Expand All @@ -147,6 +138,7 @@ private static Batch getRunningBatch(BatchBD batchBD, String codBatch) throws Se

public static void stopEsecuzione(BDConfigWrapper configWrapper, String codBatch) {
BatchBD batchBD = null;
log.debug("Stop esecuzione batch " + codBatch);
try {
// Se non ho configurato l'id del cluster, non gestisco i blocchi.
if(GovpayConfig.getInstance().getClusterId() == null) {
Expand Down Expand Up @@ -186,40 +178,35 @@ public static void stopEsecuzione(BDConfigWrapper configWrapper, String codBatch
} else {
// blocco non mio. lo lascio fare
log.warn("Errore nella rimozione del semaforo di concorrenza per il batch " + codBatch + ": semaforo di altro nodo");
batchBD.commit();
return;
}
} catch (NotFoundException nfe) {
// strano... vabeh...
log.debug("stop esecuzione batch " + codBatch + " errore nella rimozione del semaforo di concorrenza: semaforo non presente.");
log.warn("Errore nella rimozione del semaforo di concorrenza per il batch " + codBatch + ": semaforo non presente");
return;
}
} catch(Throwable se) {
log.error("Errore nella rimozione del semaforo di concorrenza per il batch " + codBatch, se);
} finally {
if(batchBD != null) {
try {
// disabilito selectforupdate
batchBD.disableSelectForUpdate();
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

try {
// reset autocommit
batchBD.setAutoCommit(true);
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

// chiusura connessione
batchBD.closeConnection();
}
}
}


public static void aggiornaEsecuzione(BDConfigWrapper configWrapper, String codBatch) throws ServiceException {
log.debug("Aggiorno il batch " + codBatch);
aggiornaEsecuzione(configWrapper, codBatch, null);
}

public static void aggiornaEsecuzione(BDConfigWrapper configWrapper, String codBatch, String msg) throws ServiceException {
if(msg == null) {
log.trace("aggiorna esecuzione batch " + codBatch);
} else {
log.trace("aggiorna esecuzione batch " + codBatch + ": " + msg);
}

// Se non ho configurato l'id del cluster, non gestisco i blocchi.
if(GovpayConfig.getInstance().getClusterId() == null) {
Expand All @@ -246,32 +233,22 @@ public static void aggiornaEsecuzione(BDConfigWrapper configWrapper, String codB

Batch batch = getRunningBatch(batchBD, codBatch);

if(batch != null && GovpayConfig.getInstance().getClusterId() == batch.getNodo()) {
if(batch != null && GovpayConfig.getInstance().getClusterId().equals(batch.getNodo())) {
log.trace("aggiorna esecuzione batch " + codBatch + " aggiornamento in corso...");
batch.setAggiornamento(new Date());
batchBD.update(batch);
batchBD.commit();
log.debug("Aggiornato semaforo rosso per il batch " + codBatch + " inserito per il nodo " + GovpayConfig.getInstance().getClusterId() + ".");
return;
} else {
log.trace("aggiorna esecuzione batch " + codBatch + ": non trovato eseguo solo il commit.");
batchBD.commit();
}
} catch (NotFoundException e) {
log.error("Errore nell'aggiornamento del semaforo di concorrenza per il batch " + codBatch, e);
return;
} finally {
if(batchBD != null) {
try {
// disabilito selectforupdate
batchBD.disableSelectForUpdate();
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

try {
// reset autocommit
batchBD.setAutoCommit(true);
} catch (ServiceException e) {
log.error("Errore " +e.getMessage() , e);
}

// chiusura connessione
batchBD.closeConnection();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -754,7 +754,7 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,
tracciatiBD.commit();
log.debug("Aggiornati metadati tracciato dopo il completamento del Thread ["+sender.getNomeThread()+"]");

BatchManager.aggiornaEsecuzione(configWrapper, Operazioni.BATCH_TRACCIATI);
BatchManager.aggiornaEsecuzione(configWrapper, Operazioni.BATCH_TRACCIATI, ("Completamento del Thread["+sender.getNomeThread() +"]"));
log.debug("Aggiornata esecuzione del batch dopo il completamento del Thread ["+sender.getNomeThread()+"]");
}
}
Expand Down

0 comments on commit 045d68d

Please sign in to comment.