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

Reply via email to