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: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org