rpuch commented on code in PR #939: URL: https://github.com/apache/ignite-3/pull/939#discussion_r947083961
########## modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java: ########## @@ -34,7 +83,21 @@ public void start() { /** {@inheritDoc} */ @Override public LogStorage createLogStorage(String uri, RaftOptions raftOptions) { - return new LocalLogStorage(raftOptions); + return new VolatileLogStorage(createLogStorageBudget()); + } + + private LogStorageBudget createLogStorageBudget() { + return newBudget(logStorageBudgetConfig); + } + + private LogStorageBudget newBudget(LogStorageBudgetView logStorageBudgetConfig) { + LogStorageBudgetFactory factory = budgetFactories.get(logStorageBudgetConfig.name()); + + if (factory == null) { + throw new IgniteInternalException("Cannot find a log storage budget by name '" + logStorageBudgetConfig.name() + "'"); Review Comment: Added a TODO to address this later ########## modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java: ########## @@ -17,15 +17,64 @@ package org.apache.ignite.internal.raft.storage.impl; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; +import org.apache.ignite.configuration.schemas.table.LogStorageBudgetView; import org.apache.ignite.internal.raft.storage.LogStorageFactory; +import org.apache.ignite.lang.IgniteInternalException; +import org.apache.ignite.raft.jraft.core.LogStorageBudgetFactory; +import org.apache.ignite.raft.jraft.core.LogStorageBudgetsModule; import org.apache.ignite.raft.jraft.option.RaftOptions; import org.apache.ignite.raft.jraft.storage.LogStorage; import org.apache.ignite.raft.jraft.storage.impl.LocalLogStorage; +import org.apache.ignite.raft.jraft.storage.impl.LogStorageBudget; +import org.apache.ignite.raft.jraft.storage.impl.VolatileLogStorage; /** * Log storage factory based on {@link LocalLogStorage}. */ public class VolatileLogStorageFactory implements LogStorageFactory { + private final LogStorageBudgetView logStorageBudgetConfig; + + private final Map<String, LogStorageBudgetFactory> budgetFactories; + + /** + * Creates a new instance. + * + * @param logStorageBudgetConfig Budget config. + */ + public VolatileLogStorageFactory(LogStorageBudgetView logStorageBudgetConfig) { + this.logStorageBudgetConfig = logStorageBudgetConfig; + + Map<String, LogStorageBudgetFactory> factories = new HashMap<>(); + + ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader(); + + for (LogStorageBudgetsModule module : ServiceLoader.load(LogStorageBudgetsModule.class, serviceClassLoader)) { + Map<String, LogStorageBudgetFactory> factoriesFromModule = module.budgetFactories(); + + checkForBudgetNameClashes(factories.keySet(), factoriesFromModule.keySet()); + + factories.putAll(factoriesFromModule); + } + + budgetFactories = Map.copyOf(factories); + } + + private void checkForBudgetNameClashes(Set<String> names1, Set<String> names2) { + Set<String> intersection = new HashSet<>(names1); + intersection.retainAll(names2); + + if (!intersection.isEmpty()) { + throw new IgniteInternalException( Review Comment: Added a TODO to address this later -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org