Murtadha Hubail has uploaded a new change for review. https://asterix-gerrit.ics.uci.edu/1457
Change subject: Replace Java serialization in checkpoints by Json ...................................................................... Replace Java serialization in checkpoints by Json Change-Id: Id4353716267d45ce21580ac2856b6a552d05d1f7 --- M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java M asterixdb/asterix-common/pom.xml M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java M asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java 4 files changed, 49 insertions(+), 23 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/57/1457/1 diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java index bdce0ca..1df94d9 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java @@ -30,8 +30,8 @@ import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.asterix.common.config.PropertiesAccessor; import org.apache.asterix.common.config.GlobalConfig; +import org.apache.asterix.common.config.PropertiesAccessor; import org.apache.asterix.common.exceptions.AsterixException; import org.apache.asterix.hyracks.bootstrap.CCApplicationEntryPoint; import org.apache.asterix.hyracks.bootstrap.NCApplicationEntryPoint; diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml index cb5075a..f13f64d 100644 --- a/asterixdb/asterix-common/pom.xml +++ b/asterixdb/asterix-common/pom.xml @@ -311,6 +311,11 @@ <groupId>org.apache.hyracks</groupId> <artifactId>hyracks-data-std</artifactId> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>2.8.0</version> + </dependency> </dependencies> </project> diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java index 8bbdab7..dc38392 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java @@ -18,11 +18,16 @@ */ package org.apache.asterix.common.transactions; -import java.io.Serializable; +import java.io.IOException; -public class Checkpoint implements Serializable, Comparable<Checkpoint> { +import org.apache.hyracks.api.exceptions.HyracksDataException; - private static final long serialVersionUID = 1L; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class Checkpoint implements Comparable<Checkpoint> { private final long checkpointLsn; private final long minMCTFirstLsn; @@ -31,8 +36,11 @@ private final boolean sharp; private final int storageVersion; - public Checkpoint(long checkpointLsn, long minMCTFirstLsn, int maxJobId, long timeStamp, boolean sharp, - int storageVersion) { + @JsonCreator + public Checkpoint(@JsonProperty("checkpointLsn") long checkpointLsn, + @JsonProperty("minMCTFirstLsn") long minMCTFirstLsn, @JsonProperty("maxJobId") int maxJobId, + @JsonProperty("timeStamp") long timeStamp, @JsonProperty("sharp") boolean sharp, + @JsonProperty("storageVersion") int storageVersion) { this.checkpointLsn = checkpointLsn; this.minMCTFirstLsn = minMCTFirstLsn; this.maxJobId = maxJobId; @@ -107,4 +115,22 @@ result = prime * result + (int) (timeStamp ^ (timeStamp >>> 32)); return result; } -} + + public String asJson() throws HyracksDataException { + final ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + throw new HyracksDataException(e); + } + } + + public static Checkpoint fromJson(String json) throws HyracksDataException { + final ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.readValue(json, Checkpoint.class); + } catch (IOException e) { + throw new HyracksDataException(e); + } + } +} \ No newline at end of file diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java index 0b86ea5..d2650e9 100644 --- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java +++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java @@ -18,14 +18,14 @@ */ package org.apache.asterix.transaction.management.service.recovery; +import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -84,15 +84,12 @@ if (checkpoints == null || checkpoints.length == 0) { return null; } - - Checkpoint checkpointObject; List<Checkpoint> checkpointObjectList = new ArrayList<>(); for (File file : checkpoints) { - try (FileInputStream fis = new FileInputStream(file); - ObjectInputStream oisFromFis = new ObjectInputStream(fis)) { - checkpointObject = (Checkpoint) oisFromFis.readObject(); - checkpointObjectList.add(checkpointObject); - } catch (IOException | ClassNotFoundException e) { + try { + String jsonString = new String(Files.readAllBytes(Paths.get(file.getAbsolutePath()))); + checkpointObjectList.add(Checkpoint.fromJson(jsonString)); + } catch (IOException e) { throw new ACIDException("Failed to read a checkpoint file", e); } } @@ -139,12 +136,10 @@ // Construct checkpoint file name String fileName = checkpointDir.getAbsolutePath() + File.separator + CHECKPOINT_FILENAME_PREFIX + Long.toString(checkpoint.getTimeStamp()); - //TODO: replace java serialization // Write checkpoint file to disk - try (FileOutputStream fos = new FileOutputStream(fileName); - ObjectOutputStream oosToFos = new ObjectOutputStream(fos)) { - oosToFos.writeObject(checkpoint); - oosToFos.flush(); + Path path = Paths.get(fileName); + try (BufferedWriter writer = Files.newBufferedWriter(path)) { + writer.write(checkpoint.asJson()); } catch (IOException e) { throw new HyracksDataException("Failed to write checkpoint to disk", e); } -- To view, visit https://asterix-gerrit.ics.uci.edu/1457 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id4353716267d45ce21580ac2856b6a552d05d1f7 Gerrit-PatchSet: 1 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Murtadha Hubail <hubail...@gmail.com>