From 7f40cb28b5e124b6a424690be38b94030234df78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Lalire?= Date: Mon, 12 Apr 2021 19:44:28 +0200 Subject: [PATCH] back to h2 & cache for performance --- .../java/fr/gaellalire/vote/VoteDemo.java | 16 +++++++------- .../vote/actor/citizen/CitizenActor.java | 22 ++++++++++++++----- .../vote/actor/citizen/CitizenActorData.java | 9 +++++++- .../vote/actor/state/StateActor.java | 22 +++++++++++++++++++ ...{persistence-h2.xml => persistence-pg.xml} | 8 ++++--- src/main/resources/META-INF/persistence.xml | 8 +++---- 6 files changed, 62 insertions(+), 23 deletions(-) rename src/main/resources/META-INF/{persistence-h2.xml => persistence-pg.xml} (89%) diff --git a/src/main/java/fr/gaellalire/vote/VoteDemo.java b/src/main/java/fr/gaellalire/vote/VoteDemo.java index 029d01b..75b807f 100644 --- a/src/main/java/fr/gaellalire/vote/VoteDemo.java +++ b/src/main/java/fr/gaellalire/vote/VoteDemo.java @@ -117,7 +117,8 @@ public class VoteDemo { DemoRMIOverrides overrides = new DemoRMIOverrides(); LOGGER.info("Creating state"); - overrides.stateService = StateActor.create(rsaTrustSystem, "localhost"); + StateActor stateActor = StateActor.create(rsaTrustSystem, "localhost"); + overrides.stateService = stateActor; LOGGER.info("State created"); LOGGER.info("Creating {} parties", partyNumber); @@ -161,6 +162,10 @@ public class VoteDemo { } LOGGER.info("Parties data initiated"); + LOGGER.info("Initiating vote"); + stateActor.initVote(); + LOGGER.info("Vote initiated"); + // 6 million -> 9 seconds // 60 -> 90 seconds ? @@ -276,13 +281,8 @@ public class VoteDemo { // without private key generation // 7 seconds for 500 citizens, 10 jours pour 67 millions - // 500 -> 2 min - // 1000 -> 4 min - // 10000 -> 40 min - // 100000 -> 400 min - // 1000000 -> 4000 min - // 67000000 -> 67*4000 min - + // vote time + // 16 seconds for 500 citizens : 20 jours pour 67 millions } } diff --git a/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActor.java b/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActor.java index dde727c..eb23714 100644 --- a/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActor.java +++ b/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActor.java @@ -69,6 +69,8 @@ public class CitizenActor { // should be kept in smartcard (maybe knox ?) private RSAPrivatePart ssPrivatePart; + private RSAPrivatePart votingPrivatePart; + private RSATrustSystem rsaTrustSystem; private AESUtils aesUtils; @@ -83,9 +85,11 @@ public class CitizenActor { private List partyServices; - public CitizenActor(final RSAPrivatePart ssPrivatePart, final RSATrustSystem rsaTrustSystem, final AESUtils aesUtils, final Citizen citizen, - final PollingStation pollingStation, final StateService stateService, final PollingStationService pollingStationService, final List partyServices) { + public CitizenActor(final RSAPrivatePart ssPrivatePart, final RSAPrivatePart votingPrivatePart, final RSATrustSystem rsaTrustSystem, final AESUtils aesUtils, + final Citizen citizen, final PollingStation pollingStation, final StateService stateService, final PollingStationService pollingStationService, + final List partyServices) { this.ssPrivatePart = ssPrivatePart; + this.votingPrivatePart = votingPrivatePart; this.rsaTrustSystem = rsaTrustSystem; this.aesUtils = aesUtils; this.citizen = citizen; @@ -119,7 +123,6 @@ public class CitizenActor { public RSAPrivatePart sendVotingPublicPartModulus(final BigInteger pollingStationPublicKeyModulus) throws Exception { // could also be generated in smartcard - RSAPrivatePart votingPrivatePart = rsaTrustSystem.generatePrivatePart(); RSAPublicPart votingPublicPart = votingPrivatePart.getPublicPart(); RSAPublicPart pollingStationPublicPart = rsaTrustSystem.publicPartByModulus(pollingStationPublicKeyModulus); @@ -269,18 +272,24 @@ public class CitizenActor { } RSAPrivatePart ssPrivatePart; + RSAPrivatePart votingPrivatePart; { // try to restore at least the key, because it takes a lot of time to create try { ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(dataFile)); try { CitizenActorData citizenActorData = (CitizenActorData) objectInputStream.readObject(); ssPrivatePart = citizenActorData.getSsPrivatePart(); + votingPrivatePart = citizenActorData.getVotingPrivatePart(); + if (votingPrivatePart == null) { + votingPrivatePart = rsaTrustSystem.generatePrivatePart(); + } } finally { objectInputStream.close(); } } catch (Exception e) { // sadly we have to create a key ssPrivatePart = rsaTrustSystem.generatePrivatePart(); + votingPrivatePart = rsaTrustSystem.generatePrivatePart(); } } @@ -316,7 +325,7 @@ public class CitizenActor { } if (dataFile != null) { - CitizenActorData citizenActorData = new CitizenActorData(stateHost, ssNumber, ssPrivatePart); + CitizenActorData citizenActorData = new CitizenActorData(stateHost, ssNumber, ssPrivatePart, votingPrivatePart); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(dataFile)); try { objectOutputStream.writeObject(citizenActorData); @@ -325,7 +334,7 @@ public class CitizenActor { } } - return new CitizenActor(ssPrivatePart, rsaTrustSystem, aesUtils, citizen, pollingStation, stateService, pollingStationService, partyServices); + return new CitizenActor(ssPrivatePart, votingPrivatePart, rsaTrustSystem, aesUtils, citizen, pollingStation, stateService, pollingStationService, partyServices); } public static CitizenActor restore(final RSATrustSystem rsaTrustSystem, final AESUtils aesUtils, final File dataFile) throws Exception { @@ -381,8 +390,9 @@ public class CitizenActor { } RSAPrivatePart ssPrivatePart = citizenActorData.getSsPrivatePart(); + RSAPrivatePart votingPrivatePart = citizenActorData.getVotingPrivatePart(); - return new CitizenActor(ssPrivatePart, rsaTrustSystem, aesUtils, citizen, pollingStation, stateService, pollingStationService, partyServices); + return new CitizenActor(ssPrivatePart, votingPrivatePart, rsaTrustSystem, aesUtils, citizen, pollingStation, stateService, pollingStationService, partyServices); } public static void main(final String[] args) throws Exception { diff --git a/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActorData.java b/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActorData.java index 24c6e54..2672076 100644 --- a/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActorData.java +++ b/src/main/java/fr/gaellalire/vote/actor/citizen/CitizenActorData.java @@ -34,10 +34,13 @@ public class CitizenActorData implements Serializable { // should be kept in smartcard (maybe knox ?) private RSAPrivatePart ssPrivatePart; - public CitizenActorData(final String stateHost, final String ssNumber, final RSAPrivatePart ssPrivatePart) { + private RSAPrivatePart votingPrivatePart; + + public CitizenActorData(final String stateHost, final String ssNumber, final RSAPrivatePart ssPrivatePart, final RSAPrivatePart votingPrivatePart) { this.stateHost = stateHost; this.ssNumber = ssNumber; this.ssPrivatePart = ssPrivatePart; + this.votingPrivatePart = votingPrivatePart; } public String getStateHost() { @@ -51,4 +54,8 @@ public class CitizenActorData implements Serializable { public RSAPrivatePart getSsPrivatePart() { return ssPrivatePart; } + + public RSAPrivatePart getVotingPrivatePart() { + return votingPrivatePart; + } } diff --git a/src/main/java/fr/gaellalire/vote/actor/state/StateActor.java b/src/main/java/fr/gaellalire/vote/actor/state/StateActor.java index eaaa8a6..d4f7dd1 100644 --- a/src/main/java/fr/gaellalire/vote/actor/state/StateActor.java +++ b/src/main/java/fr/gaellalire/vote/actor/state/StateActor.java @@ -26,6 +26,7 @@ import java.rmi.registry.Registry; import java.security.SecureRandom; import java.security.Security; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -393,8 +394,18 @@ public class StateActor extends RemoteActor implements StateService { return result; } + private volatile boolean voteInitiated = false; + @Override public List getPollingStationCitizenList(final String pollingStationName) throws RemoteException { + if (voteInitiated) { + synchronized (citizenListByPollingStationNameCache) { + List list = citizenListByPollingStationNameCache.get(pollingStationName); + if (list != null) { + return list; + } + } + } EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(Citizen.class); @@ -418,7 +429,18 @@ public class StateActor extends RemoteActor implements StateService { entityManager.refresh(citizen); result.add(convertToServiceCitizen(citizen, false)); } + if (voteInitiated) { + synchronized (citizenListByPollingStationNameCache) { + citizenListByPollingStationNameCache.put(pollingStationName, result); + } + } return result; } + private Map> citizenListByPollingStationNameCache = new HashMap>(); + + public void initVote() { + voteInitiated = true; + } + } diff --git a/src/main/resources/META-INF/persistence-h2.xml b/src/main/resources/META-INF/persistence-pg.xml similarity index 89% rename from src/main/resources/META-INF/persistence-h2.xml rename to src/main/resources/META-INF/persistence-pg.xml index c1371a5..b75ec0d 100644 --- a/src/main/resources/META-INF/persistence-h2.xml +++ b/src/main/resources/META-INF/persistence-pg.xml @@ -16,9 +16,11 @@ true - - - + + + + + diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index b75ec0d..c1371a5 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -16,11 +16,9 @@ true - - - - - + + + -- GitLab