diff --git a/dynamometer-blockgen/src/main/java/com/linkedin/dynamometer/blockgenerator/XMLParser.java b/dynamometer-blockgen/src/main/java/com/linkedin/dynamometer/blockgenerator/XMLParser.java
index 3b915c23b2..9c26f15048 100644
--- a/dynamometer-blockgen/src/main/java/com/linkedin/dynamometer/blockgenerator/XMLParser.java
+++ b/dynamometer-blockgen/src/main/java/com/linkedin/dynamometer/blockgenerator/XMLParser.java
@@ -38,8 +38,9 @@
*/
class XMLParser {
+ // Legacy block IDs can be negative
private static final Pattern BLOCK_PATTERN =
- Pattern.compile("(\\d+)(\\d+)(\\d+)");
+ Pattern.compile("(-?\\d+)(\\d+)(\\d+)");
private State currentState = State.DEFAULT;
private short currentReplication;
diff --git a/dynamometer-infra/src/main/java/com/linkedin/dynamometer/SimulatedMultiStorageFSDataset.java b/dynamometer-infra/src/main/java/com/linkedin/dynamometer/SimulatedMultiStorageFSDataset.java
index 54cc38bf86..1642740744 100644
--- a/dynamometer-infra/src/main/java/com/linkedin/dynamometer/SimulatedMultiStorageFSDataset.java
+++ b/dynamometer-infra/src/main/java/com/linkedin/dynamometer/SimulatedMultiStorageFSDataset.java
@@ -581,14 +581,14 @@ public synchronized void injectBlocks(String bpid,
for (Block b: injectBlocks) {
BInfo binfo = new BInfo(bpid, b, false);
- blockMaps.get((int) (b.getBlockId() % storages.size())).put(binfo.theBlock, binfo);
+ blockMaps.get((int) Math.floorMod(b.getBlockId(), storages.size())).put(binfo.theBlock, binfo);
}
}
}
/** Get the storage that a given block lives within. */
private SimulatedStorage getStorage(Block b) {
- return storages.get((int) (b.getBlockId() % storages.size()));
+ return storages.get((int) Math.floorMod(b.getBlockId(), storages.size()));
}
/**