You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@joshua.apache.org by mj...@apache.org on 2016/04/02 00:56:27 UTC
[04/10] incubator-joshua git commit: Forced synchronization on method
that still occasionally fails multi-threaded test. This is a fix for a very
rare multithreading issue we've observed in Joshua. We have a test that is
able to reproduce the error fairl
Forced synchronization on method that still occasionally fails multi-threaded test.
This is a fix for a very rare multithreading issue we've observed in Joshua. We have a test that is able to reproduce the error fairly often when run on a host with multiple physical cores. This patch fixes all errors seen in both the patch and during runtime.
Project: http://git-wip-us.apache.org/repos/asf/incubator-joshua/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-joshua/commit/cadd987c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-joshua/tree/cadd987c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-joshua/diff/cadd987c
Branch: refs/heads/master
Commit: cadd987c16ff012298b42074fb96bab8697fa84f
Parents: cabb52c
Author: Kellen Sunderland <ke...@amazon.com>
Authored: Tue Mar 29 15:46:27 2016 +0200
Committer: Kellen Sunderland <ke...@amazon.com>
Committed: Thu Mar 31 10:44:43 2016 +0200
----------------------------------------------------------------------
.../decoder/ff/tm/packed/PackedGrammar.java | 26 +++++++++++++++++---
1 file changed, 22 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/cadd987c/src/joshua/decoder/ff/tm/packed/PackedGrammar.java
----------------------------------------------------------------------
diff --git a/src/joshua/decoder/ff/tm/packed/PackedGrammar.java b/src/joshua/decoder/ff/tm/packed/PackedGrammar.java
index 2251f5a..18aa60e 100644
--- a/src/joshua/decoder/ff/tm/packed/PackedGrammar.java
+++ b/src/joshua/decoder/ff/tm/packed/PackedGrammar.java
@@ -46,6 +46,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
+import java.nio.BufferUnderflowException;
import java.nio.IntBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
@@ -487,6 +488,7 @@ public class PackedGrammar extends AbstractGrammar {
feature_position += EncoderConfiguration.ID_SIZE;
StringBuilder sb = new StringBuilder();
+
for (int i = 0; i < num_features; i++) {
int feature_id = encoding.readId(features, feature_position);
FloatEncoder encoder = encoding.encoder(feature_id);
@@ -505,18 +507,34 @@ public class PackedGrammar extends AbstractGrammar {
return sb.toString().trim();
}
- private final byte[] getAlignmentArray(int block_id) {
+ /**
+ * We need to synchronize this method as there is a many to one ratio between
+ * PackedRule/PhrasePair and this class (PackedSlice). This means during concurrent first
+ * getAlignments calls to PackedRule objects they could alter each other's positions within the
+ * buffer before calling read on the buffer.
+ */
+ private synchronized final byte[] getAlignmentArray(int block_id) {
if (alignments == null)
throw new RuntimeException("No alignments available.");
int alignment_position = alignmentLookup[block_id];
int num_points = (int) alignments.get(alignment_position);
byte[] alignment = new byte[num_points * 2];
-
+
alignments.position(alignment_position + 1);
- alignments.get(alignment, 0, num_points * 2);
+ try {
+ alignments.get(alignment, 0, num_points * 2);
+ } catch (BufferUnderflowException bue) {
+ Decoder.LOG(4, "Had an exception when accessing alignment mapped byte buffer");
+ Decoder.LOG(4, "Attempting to access alignments at position: " + alignment_position + 1);
+ Decoder.LOG(4, "And to read this many bytes: " + num_points * 2);
+ Decoder.LOG(4, "Buffer capacity is : " + alignments.capacity());
+ Decoder.LOG(4, "Buffer position is : " + alignments.position());
+ Decoder.LOG(4, "Buffer limit is : " + alignments.limit());
+ throw bue;
+ }
return alignment;
}
-
+
private final PackedTrie root() {
return getTrie(0);
}