Mark S created SOLR-4733:
----------------------------
Summary: Rollback does not work correctly
Key: SOLR-4733
URL: https://issues.apache.org/jira/browse/SOLR-4733
Project: Solr
Issue Type: Bug
Affects Versions: 4.2.1
Environment: Ubuntu 12.04.2 LTS
Reporter: Mark S
I wrote a simple test that seems to reproduce the unexpected behaviour. See the
below test case "addBeanThenRollbackThenAddBeanThenRollbackTest()".
It seems on rollback the bean is not written to Solr system, though I think the
client remembers the bean which then creates a version conflict SolrException.
* *The test case:*
{code:java}
@Test
public void addBeanThenRollbackThenAddBeanThenRollbackTest() throws Exception {
MyTestBean myTestBean = createTestBean("addBeanTest");
UpdateResponse updateResponseOne = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponseOne.getStatus());
rollback();
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
UpdateResponse updateResponseTwo = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponseTwo.getStatus());
rollback();
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
}
{code}
* *The stack trace:*
{code}
org.apache.solr.common.SolrException: version conflict for
154ff2e0-621b-4eb0-a1d3-4bbe7ea01573 expected=-1 actual=1432619355523252224
at
org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:404)
at
org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:181)
at
org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:117)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116)
at org.apache.solr.client.solrj.SolrServer.addBean(SolrServer.java:136)
at org.apache.solr.client.solrj.SolrServer.addBean(SolrServer.java:125)
at
test.SolrJBeanTest.addBeanThenRollbackThenAddBeanThenRollbackTest(SolrJBeanTest.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
{code}
* *The test class:*
{code:java}
package test;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import junit.framework.Assert;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.beans.Field;
import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SolrJBeanTest {
private static HttpSolrServer server;
static {
String url = "http://localhost:8080/solr/collection1";
server = new HttpSolrServer(url);
server.setRequestWriter(new BinaryRequestWriter());
// server.setParser(new XMLResponseParser()); // binary parser is used
by default
server.setSoTimeout(5000); // socket read timeout
server.setConnectionTimeout(30000);
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false); // defaults to false
// allowCompression defaults to false.
// Server side must support gzip or deflate for this to have any effect.
server.setAllowCompression(true);
server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
}
@Before
public void setUp() throws Exception {
UpdateResponse updateResponse = server.deleteByQuery("type_s:" +
"MyTestBean");
Assert.assertEquals(0, updateResponse.getStatus());
commit();
}
@After
public void tearDown() throws Exception {
UpdateResponse updateResponse = server.deleteByQuery("type_s:" +
"MyTestBean");
Assert.assertEquals(0, updateResponse.getStatus());
commit();
List<MyTestBean> beans = getTestBeans();
Assert.assertEquals(0, beans.size());
}
private static void commit() throws Exception {
UpdateResponse updateResponseForCommit = server.commit();
Assert.assertEquals(0, updateResponseForCommit.getStatus());
}
private static void rollback() throws Exception {
UpdateResponse updateResponseForCommit = server.rollback();
Assert.assertEquals(0, updateResponseForCommit.getStatus());
}
@Test
public void addBeanTest() throws Exception {
MyTestBean myTestBean = createTestBean("addBeanTest");
UpdateResponse updateResponse = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponse.getStatus());
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
UpdateResponse updateResponseForCommit = server.commit();
Assert.assertEquals(0, updateResponseForCommit.getStatus());
// Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNotNull(myTestBeanStored);
Assert.assertEquals(myTestBean.getId(), myTestBeanStored.getId());
Assert.assertEquals(myTestBean.getType(),
myTestBeanStored.getType());
Assert.assertEquals(myTestBean.getValue(),
myTestBeanStored.getValue());
Assert.assertEquals(myTestBean.getCreatedDate(),
myTestBeanStored.getCreatedDate());
Assert.assertEquals(-1L, myTestBean.get_version_().longValue());
Assert.assertTrue(myTestBeanStored.get_version_() > 0);
}
}
@Test
public void addBeanThenRollbackTest() throws Exception {
MyTestBean myTestBean = createTestBean("addBeanTest");
UpdateResponse updateResponse = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponse.getStatus());
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
UpdateResponse updateResponseForCommit = server.rollback();
Assert.assertEquals(0, updateResponseForCommit.getStatus());
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
}
@Test
public void addBeanThenRollbackThenAddBeanThenRollbackTest() throws
Exception {
MyTestBean myTestBean = createTestBean("addBeanTest");
UpdateResponse updateResponseOne = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponseOne.getStatus());
rollback();
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
UpdateResponse updateResponseTwo = server.addBean(myTestBean);
Assert.assertEquals(0, updateResponseTwo.getStatus());
rollback();
Thread.sleep(1000);
// No Bean Found
{
MyTestBean myTestBeanStored = getTestBean(myTestBean.getId());
Assert.assertNull(myTestBeanStored);
}
}
private MyTestBean createTestBean(String value) {
MyTestBean myTestBean = new MyTestBean();
myTestBean.setId(UUID.randomUUID().toString().toLowerCase(Locale.ENGLISH));
myTestBean.setType("MyTestBean");
myTestBean.setCreatedDate(new Date());
myTestBean.setValue(value);
myTestBean.set_version_(-1L);
return myTestBean;
}
private static List<MyTestBean> getTestBeans() throws Exception {
return getTestBeans(null, null);
}
private static MyTestBean getTestBean(String id) throws Exception {
List<MyTestBean> beans = getTestBeans(id, null);
if (beans == null || beans.size() == 0) {
return null;
}
return beans.get(0);
}
private static List<MyTestBean> getTestBeans(String id, String value)
throws Exception {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
if (id != null) {
solrQuery.addFilterQuery("id:" + id);
}
solrQuery.addFilterQuery("type_s:" + "MyTestBean");
if (value != null) {
solrQuery.addFilterQuery("value:" + value);
}
QueryResponse queryResponse = server.query(solrQuery);
List<MyTestBean> beans = queryResponse.getBeans(MyTestBean.class);
return beans;
}
public static class MyTestBean implements Serializable {
private static final long serialVersionUID = 1L;
@Field("id")
private String id;
@Field("type_s")
private String type;
@Field("value_s")
private String value;
@Field("created_dt")
private Date createdDate;
@Field("_version_")
private Long _version_;
public MyTestBean() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Long get_version_() {
return _version_;
}
public void set_version_(Long _version_) {
this._version_ = _version_;
}
@Override
public String toString() {
return "MyTestBean [id=" + id + ", type=" + type + ", value=" +
value + ", createdDate=" + createdDate
+ ", _version_=" + _version_ + "]";
}
}
}
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]