@Test public void testGetLockId() throws EntryExistsException { final String entryId = "ABC123"; Map<String, Integer> entry = ImmutableMap.of("a", 1); Map<String, Integer> status = ImmutableMap.of("count", 42); handler.insert(entryId, DateTimes.of("2014-01-01"), "test", entry, true, status); Assert.assertEquals( ImmutableMap.<Long, Map<String, Integer>>of(), handler.getLocks("non_exist_entry") ); Assert.assertEquals( ImmutableMap.<Long, Map<String, Integer>>of(), handler.getLocks(entryId) ); final ImmutableMap<String, Integer> lock1 = ImmutableMap.of("lock", 1); final ImmutableMap<String, Integer> lock2 = ImmutableMap.of("lock", 2); Assert.assertTrue(handler.addLock(entryId, lock1)); Assert.assertNotNull(handler.getLockId(entryId, lock1)); Assert.assertNull(handler.getLockId(entryId, lock2)); }
getConnector().retryWithHandle( (HandleCallback<Void>) handle -> { final String sql = StringUtils.format( "INSERT INTO %s (id, created_date, datasource, payload, active, status_payload) " + "VALUES (:id, :created_date, :datasource, :payload, :active, :status_payload)", getEntryTable() ); handle.createStatement(sql) return null; }, e -> getConnector().isTransientException(e) && !(isStatementException(e) && getEntry(id).isPresent()) ); if (isStatementException(e) && getEntry(id).isPresent()) { throw new EntryExistsException(id, e); } else {
@Override public boolean replaceLock(final String entryId, final long oldLockId, final LockType newLock) { return connector.retryTransaction( (handle, transactionStatus) -> { int numDeletedRows = removeLock(handle, oldLockId); if (numDeletedRows != 1) { transactionStatus.setRollbackOnly(); final String message = numDeletedRows == 0 ? StringUtils.format("Cannot find lock[%d]", oldLockId) : StringUtils.format("Found multiple locks for lockId[%d]", oldLockId); throw new RuntimeException(message); } return addLock(handle, entryId, newLock); }, 3, SQLMetadataConnector.DEFAULT_MAX_TRIES ); }
@Override public List<TaskInfo<EntryType, StatusType>> getActiveTaskInfo(@Nullable String dataSource) { return getConnector().retryWithHandle( handle -> { final Query<Map<String, Object>> query = createActiveTaskInfoQuery( handle, dataSource ); return query.map(taskInfoMapper).list(); } ); }
@Override public List<TaskInfo<EntryType, StatusType>> getCompletedTaskInfo( DateTime timestamp, @Nullable Integer maxNumStatuses, @Nullable String dataSource ) { return getConnector().retryWithHandle( handle -> { final Query<Map<String, Object>> query = createCompletedTaskInfoQuery( handle, timestamp, maxNumStatuses, dataSource ); return query.map(taskInfoMapper).list(); } ); }
Map<String, Integer> entry1 = ImmutableMap.of("numericId", 1234); Map<String, Integer> status1 = ImmutableMap.of("count", 42, "temp", 1); handler.insert(entryId1, DateTimes.of("2014-01-01T00:00:00.123"), "testDataSource", entry1, false, status1); Assert.assertTrue(handler.addLog(entryId1, ImmutableMap.of("logentry", "created"))); handler.insert(entryId2, DateTimes.of("2014-01-01T00:00:00.123"), "test", entry2, true, status2); Assert.assertTrue(handler.addLog(entryId2, ImmutableMap.of("logentry", "created"))); handler.insert(entryId3, DateTimes.of("2014-01-02T12:00:00.123"), "testDataSource", entry3, false, status3); Assert.assertTrue(handler.addLog(entryId3, ImmutableMap.of("logentry", "created"))); Assert.assertEquals(Optional.of(entry1), handler.getEntry(entryId1)); Assert.assertEquals(Optional.of(entry2), handler.getEntry(entryId2)); Assert.assertEquals(Optional.of(entry3), handler.getEntry(entryId3)); handler.getActiveTaskInfo(null).stream() .map(taskInfo -> taskInfo.getId()) .collect(Collectors.toList()) handler.getCompletedTaskInfo(DateTimes.of("2014-01-01"), null, null).stream() .map(taskInfo -> taskInfo.getId()) .collect(Collectors.toList()) handler.removeTasksOlderThan(DateTimes.of("2014-01-02").getMillis()); handler.getActiveTaskInfo(null).stream() .map(taskInfo -> taskInfo.getId()) .collect(Collectors.toList())
Map<String, Integer> status = ImmutableMap.of("count", 42); handler.insert(entryId, DateTimes.of("2014-01-01"), "test", entry, true, status); handler.getLocks("non_exist_entry") ); handler.getLocks(entryId) ); final ImmutableMap<String, Integer> lock2 = ImmutableMap.of("lock", 2); Assert.assertTrue(handler.addLock(entryId, lock1)); Assert.assertTrue(handler.addLock(entryId, lock2)); final Map<Long, Map<String, Integer>> locks = handler.getLocks(entryId); Assert.assertEquals(2, locks.size()); handler.removeLock(lockId); locks.remove(lockId); final Map<Long, Map<String, Integer>> updated = handler.getLocks(entryId); Assert.assertEquals( new HashSet<>(locks.values()),
handler.insert(entryId, DateTimes.of("2014-01-02T00:00:00.123"), "testDataSource", entry, true, null); handler.getEntry(entryId) ); Assert.assertEquals(Optional.absent(), handler.getEntry("non_exist_entry")); Assert.assertEquals(Optional.absent(), handler.getStatus(entryId)); Assert.assertEquals(Optional.absent(), handler.getStatus("non_exist_entry")); Assert.assertTrue(handler.setStatus(entryId, true, status1)); handler.getActiveTaskInfo(null).stream() .map(taskInfo -> Pair.of(taskInfo.getTask(), taskInfo.getStatus())) .collect(Collectors.toList()) ); Assert.assertTrue(handler.setStatus(entryId, true, status2)); handler.getActiveTaskInfo(null).stream() .map(taskInfo -> Pair.of(taskInfo.getTask(), taskInfo.getStatus())) .collect(Collectors.toList()) handler.getCompletedTaskInfo(DateTimes.of("2014-01-01"), null, null) ); Assert.assertTrue(handler.setStatus(entryId, false, status1));
@Test public void testLogs() throws Exception { final String entryId = "abcd"; Map<String, Integer> entry = ImmutableMap.of("a", 1); Map<String, Integer> status = ImmutableMap.of("count", 42); handler.insert(entryId, DateTimes.of("2014-01-01"), "test", entry, true, status); Assert.assertEquals( ImmutableList.of(), handler.getLogs("non_exist_entry") ); Assert.assertEquals( ImmutableMap.of(), handler.getLocks(entryId) ); final ImmutableMap<String, String> log1 = ImmutableMap.of("logentry", "created"); final ImmutableMap<String, String> log2 = ImmutableMap.of("logentry", "updated"); Assert.assertTrue(handler.addLog(entryId, log1)); Assert.assertTrue(handler.addLog(entryId, log2)); Assert.assertEquals( ImmutableList.of(log1, log2), handler.getLogs(entryId) ); }
@Override @Nullable public Long getLockId(String entryId, LockType lock) { return getLocks(entryId).entrySet().stream() .filter(entry -> entry.getValue().equals(lock)) .map(Entry::getKey) .findAny() .orElse(null); } }
@Test public void testGetRecentStatuses() throws EntryExistsException { for (int i = 1; i < 11; i++) { final String entryId = "abcd_" + i; final Map<String, Integer> entry = ImmutableMap.of("a", i); final Map<String, Integer> status = ImmutableMap.of("count", i * 10); handler.insert(entryId, DateTimes.of(StringUtils.format("2014-01-%02d", i)), "test", entry, false, status); } final List<TaskInfo<Map<String, Integer>, Map<String, Integer>>> statuses = handler.getCompletedTaskInfo( DateTimes.of("2014-01-01"), 7, null ); Assert.assertEquals(7, statuses.size()); int i = 10; for (TaskInfo<Map<String, Integer>, Map<String, Integer>> status : statuses) { Assert.assertEquals(ImmutableMap.of("count", i-- * 10), status.getStatus()); } }
@Override @Nullable public Long getLockId(String entryId, LockType lock) { return getLocks(entryId).entrySet().stream() .filter(entry -> entry.getValue().equals(lock)) .map(Entry::getKey) .findAny() .orElse(null); } }
@Override public List<TaskInfo<EntryType, StatusType>> getActiveTaskInfo(@Nullable String dataSource) { return getConnector().retryWithHandle( handle -> { final Query<Map<String, Object>> query = createActiveTaskInfoQuery( handle, dataSource ); return query.map(taskInfoMapper).list(); } ); }
@Override public List<TaskInfo<EntryType, StatusType>> getCompletedTaskInfo( DateTime timestamp, @Nullable Integer maxNumStatuses, @Nullable String dataSource ) { return getConnector().retryWithHandle( handle -> { final Query<Map<String, Object>> query = createCompletedTaskInfoQuery( handle, timestamp, maxNumStatuses, dataSource ); return query.map(taskInfoMapper).list(); } ); }
@Test public void testGetRecentStatuses2() throws EntryExistsException { for (int i = 1; i < 6; i++) { final String entryId = "abcd_" + i; final Map<String, Integer> entry = ImmutableMap.of("a", i); final Map<String, Integer> status = ImmutableMap.of("count", i * 10); handler.insert(entryId, DateTimes.of(StringUtils.format("2014-01-%02d", i)), "test", entry, false, status); } final List<TaskInfo<Map<String, Integer>, Map<String, Integer>>> statuses = handler.getCompletedTaskInfo( DateTimes.of("2014-01-01"), 10, null ); Assert.assertEquals(5, statuses.size()); int i = 5; for (TaskInfo<Map<String, Integer>, Map<String, Integer>> status : statuses) { Assert.assertEquals(ImmutableMap.of("count", i-- * 10), status.getStatus()); } }
@Test public void testReplaceLock() throws EntryExistsException { final String entryId = "ABC123"; Map<String, Integer> entry = ImmutableMap.of("a", 1); Map<String, Integer> status = ImmutableMap.of("count", 42); handler.insert(entryId, DateTimes.of("2014-01-01"), "test", entry, true, status); Assert.assertEquals( ImmutableMap.<Long, Map<String, Integer>>of(), handler.getLocks("non_exist_entry") ); Assert.assertEquals( ImmutableMap.<Long, Map<String, Integer>>of(), handler.getLocks(entryId) ); final ImmutableMap<String, Integer> lock1 = ImmutableMap.of("lock", 1); final ImmutableMap<String, Integer> lock2 = ImmutableMap.of("lock", 2); Assert.assertTrue(handler.addLock(entryId, lock1)); final Long lockId1 = handler.getLockId(entryId, lock1); Assert.assertNotNull(lockId1); Assert.assertTrue(handler.replaceLock(entryId, lockId1, lock2)); }
getConnector().retryWithHandle( (HandleCallback<Void>) handle -> { final String sql = StringUtils.format( "INSERT INTO %s (id, created_date, datasource, payload, active, status_payload) " + "VALUES (:id, :created_date, :datasource, :payload, :active, :status_payload)", getEntryTable() ); handle.createStatement(sql) return null; }, e -> getConnector().isTransientException(e) && !(isStatementException(e) && getEntry(id).isPresent()) ); if (isStatementException(e) && getEntry(id).isPresent()) { throw new EntryExistsException(id, e); } else {
@Override public boolean replaceLock(final String entryId, final long oldLockId, final LockType newLock) { return connector.retryTransaction( (handle, transactionStatus) -> { int numDeletedRows = removeLock(handle, oldLockId); if (numDeletedRows != 1) { transactionStatus.setRollbackOnly(); final String message = numDeletedRows == 0 ? StringUtils.format("Cannot find lock[%d]", oldLockId) : StringUtils.format("Found multiple locks for lockId[%d]", oldLockId); throw new RuntimeException(message); } return addLock(handle, entryId, newLock); }, 3, SQLMetadataConnector.DEFAULT_MAX_TRIES ); }