/** * Unlock the record if it was in a locked state, does nothing otherwise. * * @return self {@link StateRecord} */ public StateRecord unlock() { switch (state) { case LOCKED: setState(ItemState.APPROVED); setLockedByRecordId(0); break; case LOCKED_FOR_CREATION: destroy(); break; default: break; } return this; }
@Override public Map<HashId,StateRecord> findUnfinished() { return protect(() -> { HashMap<HashId, StateRecord> map = new HashMap<>(); try (ResultSet rs = inPool(db -> db.queryRow("select * from sr_find_unfinished()"))) { if (rs != null) { do { StateRecord record = new StateRecord(this, rs); if (record.isExpired()) { record.destroy(); } else { map.put(record.getId(), record); } } while (rs.next()); } } catch (Exception e) { e.printStackTrace(); throw e; } return map; }); }
protected synchronized void destroyCurrentFromAllNodesIfExists(Contract finalC) { for (Node nodeS : nodesMap.values()) { StateRecord r = nodeS.getLedger().getRecord(finalC.getId()); if (r != null) { r.destroy(); } } }
protected synchronized void destroyFromAllNodesExistingNew(Contract c50_1) { StateRecord orCreate; for (Approvable c : c50_1.getNewItems()) { for (Node nodeS : nodesMap.values()) { orCreate = nodeS.getLedger().getRecord(c.getId()); if (orCreate != null) orCreate.destroy(); } } }
@Override public StateRecord getRecord(HashId itemId) { StateRecord sr = protect(() -> { StateRecord cached = getFromCache(itemId); if (cached != null) return cached; try (ResultSet rs = inPool(db -> db.queryRow("SELECT * FROM ledger WHERE hash = ? limit 1", itemId.getDigest()))) { if (rs != null) { StateRecord record = new StateRecord(this, rs); putToCache(record); return record; } } catch (Exception e) { e.printStackTrace(); throw e; } return null; }); if (sr != null && sr.isExpired()) { sr.destroy(); return null; } return sr; }
@Override public StateRecord getRecord(HashId itemId) { StateRecord sr = protect(() -> { StateRecord cached = getFromCache(itemId); if (cached != null) return cached; try (ResultSet rs = db.queryRow("SELECT * FROM ledger WHERE hash = ? limit 1", itemId.getDigest())) { if (rs != null) { StateRecord record = new StateRecord(this, rs); putToCache(record); return record; } } return null; }); if (sr != null && sr.isExpired()) { sr.destroy(); return null; } return sr; }
@Override public StateRecord getLockOwnerOf(StateRecord rc) { StateRecord cached = getFromCacheById(rc.getLockedByRecordId()); if (cached != null) { return cached; } StateRecord sr = protect(() -> dbPool.execute(db -> { try (ResultSet rs = db.queryRow("SELECT * FROM ledger WHERE id = ? limit 1", rc.getLockedByRecordId())) { if (rs == null) return null; StateRecord r = new StateRecord(this, rs); putToCache(r); return r; } catch (Exception e) { e.printStackTrace(); throw e; } }) ); if (sr != null && sr.isExpired()) { sr.destroy(); return null; } return sr; }
@Test public void destroy() throws Exception { StateRecord r1 = ledger.findOrCreate(HashId.createRandom()); r1.destroy(); assertNull(ledger.getRecord(r1.getId())); }
@Test public void destroy() throws Exception { StateRecord r1 = ledger.findOrCreate(HashId.createRandom()); r1.destroy(); assertNull(ledger.getRecord(r1.getId())); }
node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.waitItem(c.getId(), 3000).state);
node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.waitItem(c.getId(), 3000).state);
node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId());
addToAllLedgers(c, ItemState.APPROVED); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state);
addToAllLedgers(c, ItemState.APPROVED); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state);
node.getLedger().getRecord(contract.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(contract.getId()).state);
@Test(timeout = 15000) public void resyncApproved() throws Exception { Contract c = new Contract(TestKeys.privateKey(0)); c.seal(); addToAllLedgers(c, ItemState.APPROVED); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId()); assertEquals(ItemState.APPROVED, node.waitItem(c.getId(), 15000).state); }
@Test(timeout = 15000) public void resyncWithTimeout() throws Exception { Contract c = new Contract(TestKeys.privateKey(0)); c.seal(); addToAllLedgers(c, ItemState.APPROVED); Duration wasDuration = config.getMaxResyncTime(); config.setMaxResyncTime(Duration.ofMillis(2000)); for (int i = 0; i < NODES/2; i++) { ((TestEmulatedNetwork)network).switchOffNodeTestMode(nodes.get(NODES-i-1)); } node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId()); assertEquals(ItemState.PENDING, node.checkItem(c.getId()).state); assertEquals(ItemState.UNDEFINED, node.waitItem(c.getId(), 15000).state); config.setMaxResyncTime(wasDuration); ((TestEmulatedNetwork)network).switchOnAllNodesTestMode(); }
@Test(timeout = 15000) public void resyncDeclined() throws Exception { Contract c = new Contract(TestKeys.privateKey(0)); c.seal(); addToAllLedgers(c, ItemState.DECLINED); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId()); assertEquals(ItemState.DECLINED, node.waitItem(c.getId(), 12000).state); }
@Test(timeout = 15000) public void resyncRevoked() throws Exception { Contract c = new Contract(TestKeys.privateKey(0)); c.seal(); addToAllLedgers(c, ItemState.REVOKED); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId()); assertEquals(ItemState.REVOKED, node.waitItem(c.getId(), 13000).state); }
@Test(timeout = 15000) public void resyncOther() throws Exception { Contract c = new Contract(TestKeys.privateKey(0)); c.seal(); addToAllLedgers(c, ItemState.PENDING_POSITIVE); node.getLedger().getRecord(c.getId()).destroy(); assertEquals(ItemState.UNDEFINED, node.checkItem(c.getId()).state); node.resync(c.getId()); assertEquals(ItemState.PENDING, node.checkItem(c.getId()).state); assertEquals(ItemState.UNDEFINED, node.waitItem(c.getId(), 12000).state); }