Author: bpoussin Date: 2017-08-18 12:10:01 +0200 (Fri, 18 Aug 2017) New Revision: 4419 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4419 Log: fixes #9334: Probl?\195?\168me lors de l'utilisation de script d'optimisation (lock de la base) Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/IsisH2Config.java trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationStorage.java trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContext.java trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContextInternal.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/IsisH2Config.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/IsisH2Config.java 2017-05-29 17:40:23 UTC (rev 4418) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/IsisH2Config.java 2017-08-18 10:10:01 UTC (rev 4419) @@ -57,7 +57,7 @@ /** Set in static field to be overridden by tests. Default to swing callback. */ protected static Class<?> databaseMigrationClass = DatabaseMigrationClass.class; - protected static final String COMMON_URL = + protected static final String COMMON_URL = // Sets the default lock timeout (in milliseconds) in this database // that is used for the new sessions. "DEFAULT_LOCK_TIMEOUT=1000;" + @@ -89,6 +89,13 @@ // changes is disabled (default), 2: logging of both data and index // changes are enabled "LOG=1;" + + // permet de prevenir le bug lorsqu'on utilise un script d'optimisation + // la simulation est deja creer (pour etre configurable par le script) + // et on dezippe dessus la simulation a faire si la simulation se fait + // sur la meme machine. Normalement la simulation devrait etre ferme + // fr.ifremer.isisfish.simulator.launcher.OptimizationPrepareJob.run#118 + // mais certaine fois non (pourquoi ???) + "AUTO_SERVER=TRUE;" + COMMON_URL; protected static final String H2_MEM_URL = Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationStorage.java 2017-05-29 17:40:23 UTC (rev 4418) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationStorage.java 2017-08-18 10:10:01 UTC (rev 4419) @@ -808,6 +808,8 @@ File data = result.getDataBackupFile(); if (data.exists()) { TopiaContext tx = result.getStorage().beginTransaction(); + // force to have clean database before import +// tx.executeSQL("DROP ALL OBJECTS;"); tx.restore(data); tx.commitTransaction(); result.closeStorage(); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContext.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContext.java 2017-05-29 17:40:23 UTC (rev 4418) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContext.java 2017-08-18 10:10:01 UTC (rev 4419) @@ -36,6 +36,8 @@ */ public interface OptimizationContext extends SimulationPlanContext { + String TEMP_PREFIX = "__tmp__"; + /** * Return the current generation. * 0 for no generation (in firstGeneration) Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContextInternal.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContextInternal.java 2017-05-29 17:40:23 UTC (rev 4418) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/OptimizationContextInternal.java 2017-08-18 10:10:01 UTC (rev 4419) @@ -71,6 +71,9 @@ * @return null or empty collection if no more simulation to do */ public List<SimulationStorage> clearNextSimulation() { + // /!\ la collection renvoyee est modifiee par l'appelant (OptimizationPrepareJob) + // les simulations ancienne et temporaire on ete supprimer + // et remplacer par les simulations qui ont ete faites List<SimulationStorage> result = nextSimulations; if (CollectionUtils.isNotEmpty(result)) { @@ -96,7 +99,7 @@ @Override public SimulationStorage newSimulation() { try { - String simId = id + "_" + number; + String simId = TEMP_PREFIX + id + "_" + number; SimulationParameter childParam = param.copy(); childParam.setSimulationPlanNumber(number); childParam.setOptimizationGeneration(generations.size()); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java 2017-05-29 17:40:23 UTC (rev 4418) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java 2017-08-18 10:10:01 UTC (rev 4419) @@ -33,8 +33,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.ListIterator; import java.util.Map; +import fr.ifremer.isisfish.simulator.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,11 +46,7 @@ import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Observation; import fr.ifremer.isisfish.export.ExportInfo; -import fr.ifremer.isisfish.simulator.Objective; -import fr.ifremer.isisfish.simulator.Optimization; -import fr.ifremer.isisfish.simulator.OptimizationContextInternal; -import fr.ifremer.isisfish.simulator.SimulationControl; -import fr.ifremer.isisfish.simulator.SimulationParameter; + import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileReader; @@ -110,12 +108,17 @@ List<SimulationStorage> sims = optimizationContext.clearNextSimulation(); while (!exception && !control.isStopSimulationRequest() && CollectionUtils.isNotEmpty(sims)) { + List<String> simulationNames = new ArrayList<>(sims.size()); for (SimulationStorage s : sims) { if (!exception && !control.isStopSimulationRequest()) { - String simId = s.getName(); + // on renomme en la version final + String simId = s.getName().replaceFirst(OptimizationContext.TEMP_PREFIX, ""); + simulationNames.add(simId); File zip = s.createZip(); + // on ferme et on supprime les simulations temporaire utilisee pour la configuration s.closeStorage(); + s.delete(false); SimulationParameter childParam = s.getParameter(); int childNumber = childParam.getSimulationPlanNumber(); @@ -147,6 +150,14 @@ // FIXME echatellier 20140418 exception is always false, it's value never changes if (!exception && !control.isStopSimulationRequest()) { + // tous les simulations ont ete faites, on recreer les storages avec les nouveaux nom en local + // /!\ on modifie la collection qu'on nous a envoyer, on utilise un effet de bord + // le probleme est que la simulation qui etait precedement dans la collection n'est plus valide + sims.clear(); + for (String name : simulationNames) { + sims.add(SimulationStorage.getSimulation(name)); + } + optimization.endSimulation(optimizationContext); optimizationContext.incGenerationNumber(); // close current generation simulations
participants (1)
-
bpoussin@users.forge.codelutin.com