Search in sources :

Example 1 with Config

use of io.datarouter.storage.config.Config in project datarouter by hotpads.

the class JobletService method requeueJobletRequest.

private void requeueJobletRequest(PhaseTimer timer, JobletRequest jobletRequest) {
    if (jobletRequest.getQueueMessageKey() == null) {
        return;
    }
    // rather than ack/put, is there an ack(false) mechanism?
    // maybe https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html
    ack(jobletRequest);
    timer.add("requeue ack");
    JobletRequestQueueKey queueKey = jobletRequestQueueManager.getQueueKey(jobletRequest);
    jobletQueueDao.getQueue(queueKey).put(jobletRequest, new Config().setPutMethod(PutMethod.UPDATE_OR_BUST));
    timer.add("requeue put");
}
Also used : Config(io.datarouter.storage.config.Config) JobletRequestQueueKey(io.datarouter.joblet.storage.jobletrequestqueue.JobletRequestQueueKey)

Example 2 with Config

use of io.datarouter.storage.config.Config in project datarouter by hotpads.

the class QueueJobletRequestSelector method getJobletRequestForProcessing.

@Override
public Optional<JobletRequest> getJobletRequestForProcessing(PhaseTimer timer, JobletType<?> type, String reservedBy) {
    for (JobletPriority priority : JobletPriority.values()) {
        JobletRequestQueueKey queueKey = new JobletRequestQueueKey(type, priority);
        if (jobletRequestQueueManager.shouldSkipQueue(queueKey)) {
            datarouterJobletCounters.incQueueSkip(queueKey.getQueueName());
            continue;
        }
        // set timeout to 0 so we return immediately. processor threads can do the waiting
        Config config = new Config().setTimeout(Duration.ofMillis(0)).setVisibilityTimeoutMs(datarouterJobletSettingRoot.jobletTimeout.get().toMillis());
        logger.info("jobletType={} queue={}", type, jobletQueueDao.getQueue(queueKey));
        QueueMessage<JobletRequestKey, JobletRequest> message = jobletQueueDao.getQueue(queueKey).peek(config);
        timer.add("peek");
        if (message == null) {
            jobletRequestQueueManager.onJobletRequestQueueMiss(queueKey);
            continue;
        }
        datarouterJobletCounters.incQueueHit(queueKey.getQueueName());
        JobletRequest jobletRequest = message.getDatabean();
        boolean existsInDb = jobletRequestDao.exists(jobletRequest.getKey());
        timer.add("check exists");
        if (!existsInDb) {
            logger.warn("draining non-existent JobletRequest without processing jobletRequest={}", jobletRequest);
            datarouterJobletCounters.ignoredRequestMissingFromDb(type);
            jobletQueueDao.getQueue(queueKey).ack(message.getKey());
            timer.add("ack missing request");
            continue;
        }
        jobletRequest.setQueueMessageKey(message.getKey());
        jobletRequest.setReservedBy(reservedBy);
        jobletRequest.setReservedAt(System.currentTimeMillis());
        jobletRequest.setStatus(JobletStatus.RUNNING);
        jobletRequestDao.put(jobletRequest);
        if (!jobletRequest.getRestartable()) {
            // don't let SQS give this joblet out again
            jobletQueueDao.getQueue(queueKey).ack(message.getKey());
            timer.add("ack non-restartable");
        }
        return Optional.of(jobletRequest);
    }
    return Optional.empty();
}
Also used : JobletRequestKey(io.datarouter.joblet.storage.jobletrequest.JobletRequestKey) JobletPriority(io.datarouter.joblet.enums.JobletPriority) Config(io.datarouter.storage.config.Config) JobletRequestQueueKey(io.datarouter.joblet.storage.jobletrequestqueue.JobletRequestQueueKey) JobletRequest(io.datarouter.joblet.storage.jobletrequest.JobletRequest)

Example 3 with Config

use of io.datarouter.storage.config.Config in project datarouter by hotpads.

the class DatarouterJobletRequestDao method scanTypePriority.

public Scanner<JobletRequest> scanTypePriority(JobletType<?> type, JobletPriority priority, boolean anyDelay) {
    var prefix = JobletRequestKey.create(type, priority.getExecutionOrder(), null, null);
    var config = new Config().setAnyDelay(anyDelay);
    return node.scanWithPrefix(prefix, config);
}
Also used : Config(io.datarouter.storage.config.Config)

Example 4 with Config

use of io.datarouter.storage.config.Config in project datarouter by hotpads.

the class MapCachingMapStorageReaderNode method get.

@Override
public D get(PK key, Config config) {
    if (!useCache(config)) {
        return backingNode.get(key, config);
    }
    Config effectiveCachingNodeConfig = getEffectiveCachingNodeConfig(config);
    D cachedObject;
    try {
        updateLastAttemptedContact();
        cachedObject = cachingNode.get(key, effectiveCachingNodeConfig);
        updateLastContact();
    } catch (Exception e) {
        countExceptions();
        return backingNode.get(key, config);
    }
    if (cachedObject != null) {
        countHits();
        return cachedObject;
    }
    D realObject = backingNode.get(key, config);
    if (realObject != null) {
        countMisses();
        if (cacheReads) {
            try {
                updateLastAttemptedContact();
                cachingNode.put(realObject, effectiveCachingNodeConfig);
                updateLastContact();
            } catch (Exception e) {
                countExceptions();
            }
        }
    }
    return realObject;
}
Also used : Config(io.datarouter.storage.config.Config)

Example 5 with Config

use of io.datarouter.storage.config.Config in project datarouter by hotpads.

the class MapCachingMapStorageWriterMixin method putMulti.

@Override
public void putMulti(Collection<D> databeans, Config config) {
    if (databeans == null || databeans.isEmpty()) {
        return;
    }
    if (BaseMapCachingNode.useCache(config)) {
        target.updateLastAttemptedContact();
        Config effectiveCachingNodeConfig = MapCachingMapStorageReaderNode.getEffectiveCachingNodeConfig(config);
        if (cacheWrites) {
            target.getCachingNode().putMulti(databeans, effectiveCachingNodeConfig);
        } else {
            // TODO check config for ignoring caching
            Scanner.of(databeans).map(Databean::getKey).flush(keys -> target.getCachingNode().deleteMulti(keys, effectiveCachingNodeConfig));
        }
        target.updateLastContact();
    }
    try {
        target.getBackingNode().putMulti(databeans, config);
    } catch (Exception ex) {
        if (BaseMapCachingNode.useCache(config)) {
            target.updateLastAttemptedContact();
            Config effectiveCachingNodeConfig = MapCachingMapStorageReaderNode.getEffectiveCachingNodeConfig(config);
            Scanner.of(databeans).map(Databean::getKey).flush(keys -> target.getCachingNode().deleteMulti(keys, effectiveCachingNodeConfig));
            target.updateLastContact();
        }
        throw ex;
    }
}
Also used : Scanner(io.datarouter.scanner.Scanner) Databean(io.datarouter.model.databean.Databean) Collection(java.util.Collection) Config(io.datarouter.storage.config.Config) MapStorageWriterNode(io.datarouter.storage.node.op.raw.write.MapStorageWriter.MapStorageWriterNode) DatabeanFielder(io.datarouter.model.serialize.fielder.DatabeanFielder) MapStorageWriter(io.datarouter.storage.node.op.raw.write.MapStorageWriter) PrimaryKey(io.datarouter.model.key.primary.PrimaryKey) Config(io.datarouter.storage.config.Config) Databean(io.datarouter.model.databean.Databean)

Aggregations

Config (io.datarouter.storage.config.Config)35 Test (org.testng.annotations.Test)15 Range (io.datarouter.util.tuple.Range)9 Databean (io.datarouter.model.databean.Databean)6 PrimaryKey (io.datarouter.model.key.primary.PrimaryKey)5 Scanner (io.datarouter.scanner.Scanner)5 Objects (java.util.Objects)5 DatabeanFielder (io.datarouter.model.serialize.fielder.DatabeanFielder)4 Collection (java.util.Collection)4 NodeParams (io.datarouter.storage.node.NodeParams)3 SortedMapStorageNode (io.datarouter.storage.node.op.combo.SortedMapStorage.SortedMapStorageNode)3 List (java.util.List)3 Inject (javax.inject.Inject)3 Logger (org.slf4j.Logger)3 LoggerFactory (org.slf4j.LoggerFactory)3 DirectoryQueue (io.datarouter.filesystem.raw.queue.DirectoryQueue)2 Counters (io.datarouter.instrumentation.count.Counters)2 JobletRequestQueueKey (io.datarouter.joblet.storage.jobletrequestqueue.JobletRequestQueueKey)2 DataAccessException (io.datarouter.model.exception.DataAccessException)2 StringDatabeanCodec (io.datarouter.model.serialize.StringDatabeanCodec)2