@Test public void test5CacheUpdatedMultipleDbs() { database1 = new ODatabaseDocumentTx(url).open("admin", "admin"); database2 = new ODatabaseDocumentTx(url).open("admin", "admin"); // Create docA in db1 database1.begin(TXTYPE.OPTIMISTIC); ODocument vDocA_db1 = database1.newInstance(); vDocA_db1.field(NAME, "docA"); database1.save(vDocA_db1); database1.commit(); // Keep the ID. ORID vDocA_Rid = vDocA_db1.getIdentity().copy(); // Update docA in db2 database2.begin(TXTYPE.OPTIMISTIC); ODocument vDocA_db2 = database2.load(vDocA_Rid); vDocA_db2.field(NAME, "docA_v2"); database2.save(vDocA_db2); database2.commit(); // Later... read docA with db1. database1.begin(TXTYPE.OPTIMISTIC); ODocument vDocA_db1_later = database1.load(vDocA_Rid, null, true); Assert.assertEquals(vDocA_db1_later.field(NAME), "docA_v2"); database1.commit(); database1.close(); database2.close(); }
private ODocument createPerson(final ODatabaseDocumentTx db) { ODocument doc = db.newInstance("Person"); doc.field("name", "Luke"); doc.field("surname", "Skywalker"); doc.field("city", new ODocument("City").field("name", "Rome").field("country", "Italy")); doc.save(); return doc; }
@Test public void test3RollbackWithCopyCacheStrategy() throws IOException { database1 = new ODatabaseDocumentTx(url).open("admin", "admin"); database2 = new ODatabaseDocumentTx(url).open("admin", "admin"); database1.getLevel2Cache().setStrategy(STRATEGY.COPY_RECORD); // Create docA. ODocument vDocA_db1 = database1.newInstance(); vDocA_db1.field(NAME, "docA"); database1.save(vDocA_db1); // Keep the IDs. ORID vDocA_Rid = vDocA_db1.getIdentity().copy(); database2.begin(TXTYPE.OPTIMISTIC); try { // Get docA and update in db2 transaction context ODocument vDocA_db2 = database2.load(vDocA_Rid); vDocA_db2.field(NAME, "docA_v2"); database2.save(vDocA_db2); database1.begin(TXTYPE.OPTIMISTIC); try { vDocA_db1.field(NAME, "docA_v3"); database1.save(vDocA_db1); database1.commit(); } catch (OConcurrentModificationException e) { Assert.fail("Should not failed here..."); } Assert.assertEquals(vDocA_db1.field(NAME), "docA_v3"); // Will throw OConcurrentModificationException database2.commit(); Assert.fail("Should throw OConcurrentModificationException"); } catch (OConcurrentModificationException e) { database2.rollback(); } // Force reload all (to be sure it is not a cache problem) database1.close(); database2.close(); database2 = new ODatabaseDocumentTx(url).open("admin", "admin"); // docB should be in the last state : "docA_v3" ODocument vDocB_db2 = database2.load(vDocA_Rid); Assert.assertEquals(vDocB_db2.field(NAME), "docA_v3"); database1.close(); database2.close(); }
private void createExceptionRecords(int count, boolean batch) throws Exception { ODatabaseDocumentTx database = null; try { database = ODatabaseDocumentPool.global().acquire(getDatabaseURL(), "admin", "admin"); database.begin(); for (int x = 0; x < count; x++) { String ID = UUID.randomUUID().toString(); ODocument document = database.newInstance("ExceptionRecord"); document.field("id", ID); document.field("data", DATA); document.field("status", "original"); document.field("approved", false); document.field("groupNonException", false); document.field("comment", ""); document.field("jobId", "1"); document.field("dataflowName", "Error_Handling_V5"); document.field("username", "admin"); document.field("timestamp", new Date().getTime()); document.field("stageLabel", "Exception Monitor"); document.field("groupColumn", ""); document.field("lastModifiedBy", "admin"); document.field("lastModified", new Date()); database.save(document); createExceptionRecordVersion(database, ID, "1"); if (batch && (x % BATCH_SIZE) == 0) { System.out.println("Committing batch of " + BATCH_SIZE); database.commit(); database.begin(); } } database.commit(); } catch (Throwable e) { database.rollback(); throw e; } finally { if (database != null) { database.close(); } } }
private void createExceptionRecordVersion(ODatabaseDocumentTx database, String id, String version) throws Exception { try { int numRetries = 0; while (numRetries < NUM_RETRIES) { try { ODocument document = database.newInstance("ExceptionRecordVersion"); document.field("key-exceptionId", id); document.field("key-version", version); document.field("jobId", "1"); document.field("dataflowName", "Error_Handling_V5"); document.field("exceptionVersion-version", DATA); database.save(document); break; } catch (Throwable e) { logger.log(Level.SEVERE, "********************************"); logger.log( Level.SEVERE, "Create Iteration=" + numRetries + ", id=" + id + ", version=" + version + ", " + e.toString(), e); logger.log(Level.SEVERE, "********************************"); if (numRetries++ == NUM_RETRIES) { throw e; } } } } finally { } }
@BeforeClass public void beforeClass() throws Exception { db = new ODatabaseDocumentTx(DB_STORAGE + ":" + DB_NAME); db.create(); getProfilerInstance().startRecording(); db.command(new OCommandSQL("CREATE class foo")).execute(); db.command(new OCommandSQL("CREATE property foo.name STRING")).execute(); db.command(new OCommandSQL("CREATE property foo.bar INTEGER")).execute(); db.command(new OCommandSQL("CREATE property foo.address EMBEDDED")).execute(); db.command(new OCommandSQL("CREATE property foo.comp STRING")).execute(); db.command(new OCommandSQL("CREATE property foo.osite INTEGER")).execute(); db.command(new OCommandSQL("CREATE index foo_name on foo (name) NOTUNIQUE")).execute(); db.command(new OCommandSQL("CREATE index foo_bar on foo (bar) NOTUNIQUE")).execute(); db.command(new OCommandSQL("CREATE index foo_comp_osite on foo (comp, osite) NOTUNIQUE")) .execute(); db.command( new OCommandSQL( "insert into foo (name, bar, address) values ('a', 1, {'street':'1st street', 'city':'NY', '@type':'d'})")) .execute(); db.command(new OCommandSQL("insert into foo (name, bar) values ('b', 2)")).execute(); db.command(new OCommandSQL("insert into foo (name, bar) values ('c', 3)")).execute(); db.command(new OCommandSQL("insert into foo (comp, osite) values ('a', 1)")).execute(); db.command(new OCommandSQL("insert into foo (comp, osite) values ('b', 2)")).execute(); db.command(new OCommandSQL("CREATE class bar")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('a', 1)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('b', 2)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('c', 3)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('d', 4)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('e', 5)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('f', 1)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('g', 2)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('h', 3)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('i', 4)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('j', 5)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('k', 1)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('l', 2)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('m', 3)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('n', 4)")).execute(); db.command(new OCommandSQL("insert into bar (name, foo) values ('o', 5)")).execute(); db.command(new OCommandSQL("CREATE class ridsorttest")).execute(); db.command(new OCommandSQL("CREATE property ridsorttest.name INTEGER")).execute(); db.command(new OCommandSQL("CREATE index ridsorttest_name on ridsorttest (name) NOTUNIQUE")) .execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (1)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (5)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (3)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (4)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (1)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (8)")).execute(); db.command(new OCommandSQL("insert into ridsorttest (name) values (6)")).execute(); db.command(new OCommandSQL("CREATE class unwindtest")).execute(); db.command( new OCommandSQL("insert into unwindtest (name, coll) values ('foo', ['foo1', 'foo2'])")) .execute(); db.command( new OCommandSQL("insert into unwindtest (name, coll) values ('bar', ['bar1', 'bar2'])")) .execute(); db.command(new OCommandSQL("CREATE class edge")).execute(); db.command(new OCommandSQL("CREATE class TestFromInSquare")).execute(); db.command( new OCommandSQL( "insert into TestFromInSquare set tags = {' from ':'foo',' to ':'bar'}")) .execute(); db.command(new OCommandSQL("CREATE class TestMultipleClusters")).execute(); db.command( new OCommandSQL("alter class TestMultipleClusters addcluster testmultipleclusters1 ")) .execute(); db.command( new OCommandSQL("alter class TestMultipleClusters addcluster testmultipleclusters2 ")) .execute(); db.command(new OCommandSQL("insert into cluster:testmultipleclusters set name = 'aaa'")) .execute(); db.command(new OCommandSQL("insert into cluster:testmultipleclusters1 set name = 'foo'")) .execute(); db.command(new OCommandSQL("insert into cluster:testmultipleclusters2 set name = 'bar'")) .execute(); db.command(new OCommandSQL("CREATE class TestUrl")).execute(); db.command( new OCommandSQL("insert into TestUrl content { \"url\": \"http://www.google.com\" }")) .execute(); db.command(new OCommandSQL("CREATE class TestParams")).execute(); db.command( new OCommandSQL( "insert into TestParams set name = 'foo', surname ='foo', active = true")) .execute(); db.command( new OCommandSQL( "insert into TestParams set name = 'foo', surname ='bar', active = false")) .execute(); db.command(new OCommandSQL("CREATE class TestParamsEmbedded")).execute(); db.command( new OCommandSQL( "insert into TestParamsEmbedded set emb = { \n" + " \"count\":0,\n" + " \"testupdate\":\"1441258203385\"\n" + " }")) .execute(); db.command( new OCommandSQL( "insert into TestParamsEmbedded set emb = { \n" + " \"count\":1,\n" + " \"testupdate\":\"1441258203385\"\n" + " }")) .execute(); db.command(new OCommandSQL("CREATE class TestBacktick")).execute(); db.command(new OCommandSQL("insert into TestBacktick set foo = 1, bar = 2, `foo-bar` = 10")) .execute(); // /*** from issue #2743 OSchema schema = db.getMetadata().getSchema(); if (!schema.existsClass("alphabet")) { schema.createClass("alphabet"); } ORecordIteratorClass<ODocument> iter = db.browseClass("alphabet"); while (iter.hasNext()) { iter.next().delete(); } // add 26 entries: { "letter": "A", "number": 0 }, ... { "letter": "Z", "number": 25 } String rowModel = "{\"letter\": \"%s\", \"number\": %d}"; for (int i = 0; i < 26; ++i) { String l = String.valueOf((char) ('A' + i)); String json = String.format(rowModel, l, i); ODocument doc = db.newInstance("alphabet"); doc.fromJSON(json); doc.save(); } db.command(new OCommandSQL("create class OCommandExecutorSQLSelectTest_aggregations")) .execute(); db.command( new OCommandSQL( "insert into OCommandExecutorSQLSelectTest_aggregations set data = [{\"size\": 0}, {\"size\": 0}, {\"size\": 30}, {\"size\": 50}, {\"size\": 50}]")) .execute(); initExpandSkipLimit(db); initMassiveOrderSkipLimit(db); initDatesSet(db); initMatchesWithRegex(db); initDistinctLimit(db); }
@Test public void test1RollbackOnConcurrentException() throws IOException { database1 = new ODatabaseDocumentTx(url).open("admin", "admin"); database2 = new ODatabaseDocumentTx(url).open("admin", "admin"); database1.begin(TXTYPE.OPTIMISTIC); // Create docA. ODocument vDocA_db1 = database1.newInstance(); vDocA_db1.field(NAME, "docA"); database1.save(vDocA_db1); // Create docB. ODocument vDocB_db1 = database1.newInstance(); vDocB_db1.field(NAME, "docB"); database1.save(vDocB_db1); database1.commit(); // Keep the IDs. ORID vDocA_Rid = vDocA_db1.getIdentity().copy(); ORID vDocB_Rid = vDocB_db1.getIdentity().copy(); ORecordVersion vDocA_version = OVersionFactory.instance().createUntrackedVersion(); ORecordVersion vDocB_version = OVersionFactory.instance().createUntrackedVersion(); database2.begin(TXTYPE.OPTIMISTIC); try { // Get docA and update in db2 transaction context ODocument vDocA_db2 = database2.load(vDocA_Rid); vDocA_db2.field(NAME, "docA_v2"); database2.save(vDocA_db2); // Concurrent update docA via database1 -> will throw OConcurrentModificationException at // database2.commit(). database1.begin(TXTYPE.OPTIMISTIC); try { vDocA_db1.field(NAME, "docA_v3"); database1.save(vDocA_db1); database1.commit(); } catch (OConcurrentModificationException e) { Assert.fail("Should not failed here..."); } Assert.assertEquals(vDocA_db1.field(NAME), "docA_v3"); // Keep the last versions. // Following updates should failed and reverted. vDocA_version = vDocA_db1.getRecordVersion(); vDocB_version = vDocB_db1.getRecordVersion(); // Update docB in db2 transaction context -> should be rollbacked. ODocument vDocB_db2 = database2.load(vDocB_Rid); vDocB_db2.field(NAME, "docB_UpdatedInTranscationThatWillBeRollbacked"); database2.save(vDocB_db2); // Will throw OConcurrentModificationException database2.commit(); Assert.fail("Should throw OConcurrentModificationException"); } catch (OConcurrentModificationException e) { database2.rollback(); } // Force reload all (to be sure it is not a cache problem) database1.close(); database2.getStorage().close(); database2 = new ODatabaseDocumentTx(url).open("admin", "admin"); ODocument vDocA_db2 = database2.load(vDocA_Rid); Assert.assertEquals(vDocA_db2.field(NAME), "docA_v3"); Assert.assertEquals(vDocA_db2.getRecordVersion(), vDocA_version); // docB should be in the first state : "docB" ODocument vDocB_db2 = database2.load(vDocB_Rid); Assert.assertEquals(vDocB_db2.field(NAME), "docB"); Assert.assertEquals(vDocB_db2.getRecordVersion(), vDocB_version); database1.close(); database2.close(); }