Description
I found a bug in LongDoubleFloatDoubleVertex.write(DataOutput out) when running a small graph algorithm. The symptom is that a vertex read from a different worker becomes junk after the RPC communication. And the source of the problem is the writing of the messages in LongDoubleFloatDoubleVertex.write(DataOutput out):
for(double msg : messageList.elements()) {
out.writeDouble(msg);
}
Here messageList.elements() will returns all the elements currently stored in the mahout DoubleArrayList, even including invalid elements between size and capacity. Therefore, the write() function will write a bunch of invalid messages, which will cause error when reading them back in readfields().
The following is a simple solution:
double[] elements=messageList.elements();
for(int i=0; i<messageList.size(); i++) {
out.writeDouble(elements[i]);
}