/** * Copyright 2016 LinkedIn Corp. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ package com.github.ambry.store; import com.github.ambry.utils.Throttler; import java.io.Closeable; import java.util.HashMap; import java.util.Map; /** * Helps schedule I/O operations. * This is meant to be used by * 1. Application reads/writes from/to the log. * 2. Hard delete * 3. Compaction * The initial implementation simply returns MAX_VALUE for the application and uses the throttler for the other 2. * In the future this will have functions to submit feedback so that more intelligent decisions can be made. */ class DiskIOScheduler implements Closeable { private final Map<String, Throttler> throttlers; /** * Create a {@link DiskIOScheduler}. * @param throttlers the {@link Throttler}s to use for each job type. */ DiskIOScheduler(Map<String, Throttler> throttlers) { this.throttlers = throttlers != null ? throttlers : new HashMap<String, Throttler>(); } /** * Return the size of I/O permissible based on the parameters provided. * @param jobType the type of the job requesting an I/O slice. * @param jobId the ID of the job requesting an I/O slice. * @param usedSinceLastCall the amount of capacity used since the last call to this function. * @return the I/O slice available for use. */ long getSlice(String jobType, String jobId, long usedSinceLastCall) { Throttler throttler = throttlers.get(jobType); if (throttler != null) { try { throttler.maybeThrottle(usedSinceLastCall); } catch (InterruptedException e) { throw new IllegalStateException("Throttler call interrupted", e); } } return Long.MAX_VALUE; } /** * Release resources and close throttlers */ @Override public void close() { for (Throttler throttler : throttlers.values()) { throttler.close(); } } }