SOLR-8866: UpdateLog now throws an error if it can't serialize a field value

(cherry picked from commit a22099a)
This commit is contained in:
David Smiley 2016-03-17 13:22:16 -04:00
parent c33e8b1e21
commit 4ee908eb80
4 changed files with 30 additions and 2 deletions

View File

@ -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

View File

@ -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?");
}
};

View File

@ -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();
}
}

View File

@ -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());
}