package cz.cuni.mff.d3s.been.objectrepository; import cz.cuni.mff.d3s.been.cluster.ClusterPersistenceConfiguration; import cz.cuni.mff.d3s.been.cluster.Names; import cz.cuni.mff.d3s.been.cluster.context.ClusterContext; import cz.cuni.mff.d3s.been.util.PropertyReader; import cz.cuni.mff.d3s.been.persistence.Query; import cz.cuni.mff.d3s.been.persistence.SuccessAction; import cz.cuni.mff.d3s.been.storage.Storage; import java.util.concurrent.TimeUnit; import static cz.cuni.mff.d3s.been.cluster.ClusterPersistenceConfiguration.*; import static cz.cuni.mff.d3s.been.objectrepository.ObjectRepositoryConfiguration.*; /** * Queue drain for the querying queue. Drains queries and initiates query processing. */ public class QueryQueueDrain extends QueueDrain<Query> { private QueryQueueDrain(ClusterContext ctx, SuccessAction<Query> successAction, Float failRateThreshold, Long suspendTimeOnHighFailRate) { super(ctx, Names.PERSISTENCE_QUERY_QUEUE_NAME, successAction, failRateThreshold, suspendTimeOnHighFailRate); } /** * Create a drain for the queue of queries * * @param ctx Context to work with (where do the queries come from) * @param storage Storage to use for finding answers * * @return A queue drain that drains queries and responds with answers */ public static final QueryQueueDrain create(ClusterContext ctx, Storage storage) { final PropertyReader propertyReader = PropertyReader.on(ctx.getProperties()); final Float failRateThreshold = propertyReader.getFloat(FAIL_RATE_BEFORE_SUSPEND, DEFAULT_FAIL_RATE_BEFORE_SUSPEND); final Long suspendTimeOnHighFailRate = TimeUnit.SECONDS.toMillis(propertyReader.getLong(SUSPENSION_TIME, DEFAULT_SUSPENSION_TIME)); final Long queryTimeout = TimeUnit.SECONDS.toMillis(propertyReader.getLong(QUERY_TIMEOUT, DEFAULT_QUERY_TIMEOUT)); final Long queryProcTimeout = TimeUnit.SECONDS.toMillis(propertyReader.getLong(QUERY_PROCESSING_TIMEOUT, DEFAULT_QUERY_PROCESSING_TIMEOUT)); final Long maxTotalQueryTimeout = queryTimeout + queryProcTimeout; final SuccessAction<Query> action = new AnswerQueryAction(storage, ctx.getMap(Names.PERSISTENCE_QUERY_ANSWERS_MAP_NAME), maxTotalQueryTimeout); return new QueryQueueDrain(ctx, action, failRateThreshold, suspendTimeOnHighFailRate); } }