Author: echatellier Date: 2012-09-11 09:57:50 +0200 (Tue, 11 Sep 2012) New Revision: 3772 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3772 Log: Support delete and close for both database and file result storages. Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2012-09-07 23:51:36 UTC (rev 3771) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2012-09-11 07:57:50 UTC (rev 3772) @@ -102,6 +102,38 @@ this.simulation = simulation; } + @Override + public void delete() { + TopiaContext tx = null; + boolean mustClose = false; + + try { + if (simulation == SimulationContext.get().getSimulationStorage()) { + tx = SimulationContext.get().getDbResult(); + } + + if (tx == null) { + // not in simulation, create transaction + tx = simulation.getStorage().beginTransaction(); + mustClose = true; + } + + tx.execute("DELETE " + Result.class.getName()); + if (mustClose) { + tx.closeContext(); + } + } catch (Exception ex) { + if (log.isErrorEnabled()) { + log.error("Can't delete results", ex); + } + } + } + + @Override + public void close() { + // do nothing, closed by simulation storage closing + } + protected void putInCache(TimeStep step, String name, MatrixND mat, TopiaContext context) { String key = step.getStep() + ":" + name; putInCache(key, mat, context); @@ -518,7 +550,7 @@ // echatellier 20120829 : vidage du cache hibernate // sinon on fait trop de lecture que la meme transaction // et le cache hibernate se remplit sans se vider - tx.clearCache(); + //tx.clearCache(); } } catch (Exception eee) { if (log.isWarnEnabled()) { @@ -604,7 +636,7 @@ // echatellier 20120829 : vidage du cache hibernate // sinon on fait trop de lecture que la meme transaction // et le cache hibernate se remplit sans se vider - tx.clearCache(); + //tx.clearCache(); } } catch (TopiaException eee) { if (log.isWarnEnabled()) { Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java 2012-09-07 23:51:36 UTC (rev 3771) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java 2012-09-11 07:57:50 UTC (rev 3772) @@ -56,6 +56,7 @@ import java.util.TreeMap; import org.apache.commons.collections.BidiMap; import org.apache.commons.collections.bidimap.DualHashBidiMap; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -421,7 +422,22 @@ super.finalize(); raf.close(); } + + @Override + public void delete() { + close(); + File file = SimulationStorage.getResultFile(simulation.getDirectory()); + file.delete(); + } + @Override + public void close() { + if (raf != null) { + IOUtils.closeQuietly(raf); + raf = null; + } + } + /** * Methode interne pour que les deux Map soit mise a jour en meme temps * C'est la seul methode qui permet d'ajouter des noms de result dans les Map Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java 2012-09-07 23:51:36 UTC (rev 3771) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java 2012-09-11 07:57:50 UTC (rev 3772) @@ -149,4 +149,21 @@ * @return last simulation date */ public TimeStep getLastStep(); + + /** + * Delete all result for this result storage. + * + * In case of sensitivity analysis, after export, result are no longer + * needed and can be deleted to save disk space. + * + * @since 4.1.1.2 + */ + public void delete(); + + /** + * Close result storage. + * + * @since 4.1.1.2 + */ + public void close(); } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2012-09-07 23:51:36 UTC (rev 3771) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2012-09-11 07:57:50 UTC (rev 3772) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2002 - 2010 Ifremer, Code Lutin, Benjamin Poussin + * Copyright (C) 2002 - 2012 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -56,6 +56,7 @@ import fr.ifremer.isisfish.aspect.CacheAspect; import fr.ifremer.isisfish.aspect.RuleAspect; import fr.ifremer.isisfish.aspect.TraceAspect; +import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.SimulatorStorage; import fr.ifremer.isisfish.simulator.SimulationContext; @@ -66,8 +67,8 @@ import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.simulator.SimulationPreScript; import fr.ifremer.isisfish.simulator.Simulator; +import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.types.TimeStep; -import fr.ifremer.isisfish.types.Month; /** * Fait une simulation dans la meme jvm. @@ -420,9 +421,11 @@ // suppression des résultats si l'utilisateur a demande à ne conserver // que les resultats de seulement la première simulation d'une AS + ResultStorage resultStorage = simulation.getResultStorage(); if (parameters.isSensitivityAnalysisOnlyKeepFirst() && !control.getId().endsWith("_0")) { - context.getDbResult().clear(true); + resultStorage.delete(); } + resultStorage.close(); } catch (OutOfMemoryError eee) { log.error(_("isisfish.error.during.simulation"), eee); @@ -437,14 +440,13 @@ // // Finaly close all TopiaContext used during simulation // - SimulationContext context = SimulationContext.get(); context.closeDB(); context.closeDBResult(); try { - // close all transaction + // close all transaction (root context) if (context.getSimulationStorage() != null) { context.getSimulationStorage().closeMemStorage(); context.getSimulationStorage().closeStorage();
participants (1)
-
echatellier@users.forge.codelutin.com