diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 5b6be086895..1aea04cf35f 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -63,6 +63,9 @@ Other Changes * SOLR-8860: Remove back-compat handling of router format made in SOLR-4221 in 4.5.0. (shalin) +* SOLR-8866: UpdateLog will now throw an exception if it doesn't know how to serialize a value. + (David Smiley) + ================== 6.0.0 ================== Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release diff --git a/solr/core/src/java/org/apache/solr/update/TransactionLog.java b/solr/core/src/java/org/apache/solr/update/TransactionLog.java index 474bcafce29..673d6832511 100644 --- a/solr/core/src/java/org/apache/solr/update/TransactionLog.java +++ b/solr/core/src/java/org/apache/solr/update/TransactionLog.java @@ -95,7 +95,9 @@ public class TransactionLog implements Closeable { codec.writeByteArray(br.bytes, br.offset, br.length); return null; } - return o; + // Fallback: we have no idea how to serialize this. Be noisy to prevent insidious bugs + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, + "TransactionLog doesn't know how to serialize " + o.getClass() + "; try implementing ObjectResolver?"); } }; diff --git a/solr/core/src/test/org/apache/solr/update/TestUpdate.java b/solr/core/src/test/org/apache/solr/update/TestUpdate.java index 381231f0fdd..13a24797e83 100644 --- a/solr/core/src/test/org/apache/solr/update/TestUpdate.java +++ b/solr/core/src/test/org/apache/solr/update/TestUpdate.java @@ -18,9 +18,11 @@ package org.apache.solr.update; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.SolrException; +import org.apache.solr.common.SolrInputDocument; import org.junit.BeforeClass; import org.junit.Test; +import java.io.IOException; import java.util.concurrent.Callable; public class TestUpdate extends SolrTestCaseJ4 { @@ -243,4 +245,23 @@ public class TestUpdate extends SolrTestCaseJ4 { } + @Test // SOLR-8866 + public void testUpdateLogThrowsForUnknownTypes() throws IOException { + SolrInputDocument doc = new SolrInputDocument(); + doc.addField("id", "444"); + doc.addField("text", new Object());//Object shouldn't be serialized later... + + AddUpdateCommand cmd = new AddUpdateCommand(req()); + cmd.solrDoc = doc; + try { + h.getCore().getUpdateHandler().addDoc(cmd); // should throw + } catch (SolrException e) { + if (e.getMessage().contains("serialize")) { + return;//passed test + } + throw e; + } + fail(); + } + } diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java index 63c1b282a15..fe9ad08ee48 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java @@ -207,7 +207,9 @@ public class JavaBinCodec { if (writeKnownType(tmpVal)) return; } } - + // Fallback to do *something*. + // note: if the user of this codec doesn't want this (e.g. UpdateLog) it can supply an ObjectResolver that does + // something else like throw an exception. writeVal(val.getClass().getName() + ':' + val.toString()); }