merged from master to kisskys/master_fix_issue_510
diff --git a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/MetadataManager.java b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/MetadataManager.java
index bd98e62..2870cd3 100644
--- a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/MetadataManager.java
+++ b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/MetadataManager.java
@@ -22,6 +22,7 @@
import edu.uci.ics.asterix.common.config.AsterixMetadataProperties;
import edu.uci.ics.asterix.common.exceptions.ACIDException;
+import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.common.feeds.FeedConnectionId;
import edu.uci.ics.asterix.common.functions.FunctionSignature;
import edu.uci.ics.asterix.common.transactions.JobId;
@@ -42,6 +43,7 @@
import edu.uci.ics.asterix.metadata.entities.Library;
import edu.uci.ics.asterix.metadata.entities.Node;
import edu.uci.ics.asterix.metadata.entities.NodeGroup;
+import edu.uci.ics.asterix.om.types.ARecordType;
import edu.uci.ics.asterix.transaction.management.service.transaction.JobIdFactory;
import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
@@ -383,7 +385,17 @@
datatype = cache.getDatatype(dataverseName, datatypeName);
if (datatype != null) {
// Datatype is already in the cache, don't add it again.
- return datatype;
+ try {
+ //create a new Datatype object with a new ARecordType object in order to avoid
+ //concurrent access to UTF8StringPointable comparator in ARecordType object.
+ //see issue 510
+ ARecordType aRecType = (ARecordType) datatype.getDatatype();
+ return new Datatype(datatype.getDataverseName(), datatype.getDatatypeName(), new ARecordType(
+ aRecType.getTypeName(), aRecType.getFieldNames(), aRecType.getFieldTypes(), aRecType.isOpen()),
+ datatype.getIsAnonymous());
+ } catch (AsterixException e) {
+ throw new MetadataException(e);
+ }
}
try {
datatype = metadataNode.getDatatype(ctx.getJobId(), dataverseName, datatypeName);