public <T> T retryWithHandle(final HandleCallback<T> callback) { return retryWithHandle(callback, shouldRetry); }
@Override public boolean addLock(final String entryId, final LockType lock) { return connector.retryWithHandle( new HandleCallback<Boolean>() { @Override public Boolean withHandle(Handle handle) throws Exception { return addLock(handle, entryId, lock); } } ); }
@Override public void removeLock(final long lockId) { connector.retryWithHandle( new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) { removeLock(handle, lockId); return null; } } ); }
@Override public boolean deleteDataSourceMetadata(final String dataSource) { return connector.retryWithHandle( new HandleCallback<Boolean>() { @Override public Boolean withHandle(Handle handle) { int rows = handle.createStatement( StringUtils.format("DELETE from %s WHERE dataSource = :dataSource", dbTables.getDataSourceTable()) ) .bind("dataSource", dataSource) .execute(); return rows > 0; } } ); }
@Override public boolean addLog(final String entryId, final LogType log) { return connector.retryWithHandle( new HandleCallback<Boolean>() { @Override public Boolean withHandle(Handle handle) throws Exception { return handle.createStatement( StringUtils.format( "INSERT INTO %1$s (%2$s_id, log_payload) VALUES (:entryId, :payload)", logTable, entryTypeName ) ) .bind("entryId", entryId) .bind("payload", jsonMapper.writeValueAsBytes(log)) .execute() == 1; } } ); }
@Override public boolean setStatus(final String entryId, final boolean active, final StatusType status) { return connector.retryWithHandle( new HandleCallback<Boolean>() { @Override public Boolean withHandle(Handle handle) throws Exception { return handle.createStatement( StringUtils.format( "UPDATE %s SET active = :active, status_payload = :status_payload WHERE id = :id AND active = TRUE", entryTable ) ) .bind("id", entryId) .bind("active", active) .bind("status_payload", jsonMapper.writeValueAsBytes(status)) .execute() == 1; } } ); }
@Override public Optional<EntryType> getEntry(final String entryId) { return connector.retryWithHandle( new HandleCallback<Optional<EntryType>>() { @Override public Optional<EntryType> withHandle(Handle handle) throws Exception { byte[] res = handle.createQuery( StringUtils.format("SELECT payload FROM %s WHERE id = :id", entryTable) ) .bind("id", entryId) .map(ByteArrayMapper.FIRST) .first(); return Optional.fromNullable( res == null ? null : jsonMapper.readValue(res, entryType) ); } } ); }
@Override public Optional<StatusType> getStatus(final String entryId) { return connector.retryWithHandle( new HandleCallback<Optional<StatusType>>() { @Override public Optional<StatusType> withHandle(Handle handle) throws Exception { byte[] res = handle.createQuery( StringUtils.format("SELECT status_payload FROM %s WHERE id = :id", entryTable) ) .bind("id", entryId) .map(ByteArrayMapper.FIRST) .first(); return Optional.fromNullable( res == null ? null : jsonMapper.readValue(res, statusType) ); } } ); }
@Override public List<LogType> getLogs(final String entryId) return connector.retryWithHandle( new HandleCallback<List<LogType>>()
enum DataSourceMetadataUpdateResult { SUCCESS, FAILURE, TRY_AGAIN }
@Override public void deleteAllRecords(final String tableName) { try { retryWithHandle( new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) { if (tableExists(handle, tableName)) { log.info("Deleting all records from table[%s]", tableName); final Batch batch = handle.createBatch(); batch.add("DELETE FROM " + tableName); batch.execute(); } else { log.info("Table[%s] does not exit.", tableName); } return null; } } ); } catch (Exception e) { log.warn(e, "Exception while deleting records from table"); } } }
public void createTable(final String tableName, final Iterable<String> sql) { try { retryWithHandle( new HandleCallback<Void>() { @Override public Void withHandle(Handle handle) { if (!tableExists(handle, tableName)) { log.info("Creating table[%s]", tableName); final Batch batch = handle.createBatch(); for (String s : sql) { batch.add(s); } batch.execute(); } else { log.info("Table[%s] already exists", tableName); } return null; } } ); } catch (Exception e) { log.warn(e, "Exception creating table"); } }
); return connector.retryWithHandle( new HandleCallback<Boolean>()
@Override public List<DataSegment> getUsedSegmentsForIntervals(final String dataSource, final List<Interval> intervals) { return connector.retryWithHandle( handle -> { final VersionedIntervalTimeline<String, DataSegment> timeline = getTimelineForIntervalsWithHandle( handle, dataSource, intervals ); return intervals .stream() .flatMap((Interval interval) -> timeline.lookup(interval).stream()) .flatMap(timelineObjectHolder -> { return StreamSupport.stream(timelineObjectHolder.getObject().payloads().spliterator(), false); }) .distinct() .collect(Collectors.toList()); } ); }
@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(); } ); }
@Override @Nullable public TaskInfo<EntryType, StatusType> getTaskInfo(String entryId) { return connector.retryWithHandle(handle -> { final String query = StringUtils.format( "SELECT id, status_payload, payload, datasource, created_date FROM %s WHERE id = :id", entryTable ); return handle.createQuery(query) .bind("id", entryId) .map(taskInfoMapper) .first(); }); }
@Override public void removeTasksOlderThan(final long timestamp) { DateTime dateTime = DateTimes.utc(timestamp); connector.retryWithHandle( (HandleCallback<Void>) handle -> { handle.createStatement(getSqlRemoveLogsOlderThan()) .bind("date_time", dateTime.toString()) .execute(); handle.createStatement( StringUtils.format( "DELETE FROM %s WHERE created_date < :date_time AND active = false", entryTable ) ) .bind("date_time", dateTime.toString()) .execute(); return null; } ); }
@Override public List<Pair<DataSegment, String>> getUsedSegmentAndCreatedDateForInterval(String dataSource, Interval interval) return connector.retryWithHandle( handle -> handle.createQuery( StringUtils.format(
getConnector().retryWithHandle( (HandleCallback<Void>) handle -> { final String sql = StringUtils.format(