Author: jbellis Date: Wed Apr 28 16:30:20 2010 New Revision: 939004 URL: http://svn.apache.org/viewvc?rev=939004&view=rev Log: split CommitLogExecutorService into BatchCommitLogExecutorService and PeriodicCommitLogExecutorService. Since Periodic mode doesn't need to block for each mutation, the executor can avoid generating extra garbage from unnecessary FutureTask wrappers. patch by jbellis; reviewed by gdusbabek for CASSANDRA-1014
Added: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogExecutorService.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java (contents, props changed) - copied, changed from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java (contents, props changed) - copied, changed from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorServiceMBean.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/ICommitLogExecutorService.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorService.java - copied, changed from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorServiceMBean.java Removed: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorServiceMBean.java Modified: cassandra/branches/cassandra-0.6/CHANGES.txt cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/Table.java cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java Modified: cassandra/branches/cassandra-0.6/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=939004&r1=939003&r2=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/CHANGES.txt (original) +++ cassandra/branches/cassandra-0.6/CHANGES.txt Wed Apr 28 16:30:20 2010 @@ -1,5 +1,7 @@ 0.6.2 * fix contrib/word_count build. (CASSANDRA-992) + * split CommitLogExecutorService into BatchCommitLogExecutorService and + PeriodicCommitLogExecutorService (CASSANDRA-1014) 0.6.1 Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/Table.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/Table.java?rev=939004&r1=939003&r2=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/Table.java (original) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/Table.java Wed Apr 28 16:30:20 2010 @@ -397,18 +397,7 @@ public class Table { if (writeCommitLog) { - Future<CommitLogSegment.CommitLogContext> future = CommitLog.instance().add(mutation, serializedMutation); - if (waitForCommitLog) - { - try - { - future.get(); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } + CommitLog.instance().add(mutation, serializedMutation); } for (ColumnFamily columnFamily : mutation.getColumnFamilies()) Added: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogExecutorService.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogExecutorService.java?rev=939004&view=auto ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogExecutorService.java (added) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogExecutorService.java Wed Apr 28 16:30:20 2010 @@ -0,0 +1,69 @@ +package org.apache.cassandra.db.commitlog; + +import java.lang.management.ManagementFactory; +import java.util.List; +import java.util.concurrent.AbstractExecutorService; +import java.util.concurrent.TimeUnit; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +public abstract class AbstractCommitLogExecutorService extends AbstractExecutorService implements ICommitLogExecutorService +{ + protected volatile long completedTaskCount = 0; + + protected static void registerMBean(Object o) + { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + try + { + mbs.registerMBean(o, new ObjectName("org.apache.cassandra.db:type=Commitlog")); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * Get the current number of running tasks + */ + public int getActiveCount() + { + return 1; + } + + /** + * Get the number of completed tasks + */ + public long getCompletedTasks() + { + return completedTaskCount; + } + + // cassandra is crash-only so there's no need to implement the shutdown methods + + public boolean isShutdown() + { + return false; + } + + public boolean isTerminated() + { + return false; + } + + public void shutdown() + { + throw new UnsupportedOperationException(); + } + + public List<Runnable> shutdownNow() + { + throw new UnsupportedOperationException(); + } + + public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException + { + throw new UnsupportedOperationException(); + } +} Copied: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java (from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java) URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java?p2=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java&p1=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java&r1=933475&r2=939004&rev=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java (original) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java Wed Apr 28 16:30:20 2010 @@ -22,97 +22,45 @@ package org.apache.cassandra.db.commitlo import java.io.IOException; -import java.lang.management.ManagementFactory; import java.util.ArrayList; -import java.util.List; import java.util.concurrent.*; -import javax.management.MBeanServer; -import javax.management.ObjectName; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.utils.WrappedRunnable; -class CommitLogExecutorService extends AbstractExecutorService implements CommitLogExecutorServiceMBean +class BatchCommitLogExecutorService extends AbstractCommitLogExecutorService implements ICommitLogExecutorService, BatchCommitLogExecutorServiceMBean { private final BlockingQueue<CheaterFutureTask> queue; - private volatile long completedTaskCount = 0; - - public CommitLogExecutorService() + public BatchCommitLogExecutorService() { - this(DatabaseDescriptor.getCommitLogSync() == DatabaseDescriptor.CommitLogSync.batch - ? DatabaseDescriptor.getConcurrentWriters() - : 1024 * Runtime.getRuntime().availableProcessors()); + this(DatabaseDescriptor.getConcurrentWriters()); } - public CommitLogExecutorService(int queueSize) + public BatchCommitLogExecutorService(int queueSize) { queue = new LinkedBlockingQueue<CheaterFutureTask>(queueSize); Runnable runnable = new WrappedRunnable() { public void runMayThrow() throws Exception { - if (DatabaseDescriptor.getCommitLogSync() == DatabaseDescriptor.CommitLogSync.batch) - { - while (true) - { - processWithSyncBatch(); - completedTaskCount++; - } - } - else + while (true) { - while (true) - { - process(); - completedTaskCount++; - } + processWithSyncBatch(); + completedTaskCount++; } } }; new Thread(runnable, "COMMIT-LOG-WRITER").start(); - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try - { - mbs.registerMBean(this, new ObjectName("org.apache.cassandra.db:type=Commitlog")); - } - catch (Exception e) - { - throw new RuntimeException(e); - } + registerMBean(this); } - - /** - * Get the current number of running tasks - */ - public int getActiveCount() - { - return 1; - } - - /** - * Get the number of completed tasks - */ - public long getCompletedTasks() - { - return completedTaskCount; - } - - /** - * Get the number of tasks waiting to be executed - */ public long getPendingTasks() { return queue.size(); } - private void process() throws InterruptedException - { - queue.take().run(); - } - private final ArrayList<CheaterFutureTask> incompleteTasks = new ArrayList<CheaterFutureTask>(); private final ArrayList taskValues = new ArrayList(); // TODO not sure how to generify this private void processWithSyncBatch() throws Exception @@ -184,30 +132,20 @@ class CommitLogExecutorService extends A } } - public boolean isShutdown() + public void add(CommitLog.LogRecordAdder adder) { - return false; - } - - public boolean isTerminated() - { - return false; - } - - // cassandra is crash-only so there's no need to implement the shutdown methods - public void shutdown() - { - throw new UnsupportedOperationException(); - } - - public List<Runnable> shutdownNow() - { - throw new UnsupportedOperationException(); - } - - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException - { - throw new UnsupportedOperationException(); + try + { + submit((Callable)adder).get(); + } + catch (InterruptedException e) + { + throw new RuntimeException(e); + } + catch (ExecutionException e) + { + throw new RuntimeException(e); + } } private static class CheaterFutureTask<V> extends FutureTask<V> Propchange: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorService.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java (from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorServiceMBean.java) URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java?p2=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java&p1=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorServiceMBean.java&r1=933475&r2=939004&rev=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorServiceMBean.java (original) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java Wed Apr 28 16:30:20 2010 @@ -20,6 +20,6 @@ package org.apache.cassandra.db.commitlo import org.apache.cassandra.concurrent.IExecutorMBean; -public interface CommitLogExecutorServiceMBean extends IExecutorMBean +public interface BatchCommitLogExecutorServiceMBean extends IExecutorMBean { } \ No newline at end of file Propchange: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogExecutorServiceMBean.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java?rev=939004&r1=939003&r2=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java (original) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java Wed Apr 28 16:30:20 2010 @@ -97,7 +97,7 @@ public class CommitLog return segments.size(); } - private final ExecutorService executor = new CommitLogExecutorService(); + private final ICommitLogExecutorService executor; /** * param @ table - name of table for which we are maintaining @@ -114,11 +114,13 @@ public class CommitLog if (DatabaseDescriptor.getCommitLogSync() == DatabaseDescriptor.CommitLogSync.periodic) { - final Runnable syncer = new WrappedRunnable() + executor = new PeriodicCommitLogExecutorService(); + final Callable syncer = new Callable() { - public void runMayThrow() throws IOException + public Object call() throws Exception { sync(); + return null; } }; @@ -145,6 +147,10 @@ public class CommitLog } }, "PERIODIC-COMMIT-LOG-SYNCER").start(); } + else + { + executor = new BatchCommitLogExecutorService(); + } } public static void recover() throws IOException @@ -322,10 +328,9 @@ public class CommitLog * of any problems. This way we can assume that the subsequent commit log * entry will override the garbage left over by the previous write. */ - public Future<CommitLogSegment.CommitLogContext> add(RowMutation rowMutation, Object serializedRow) throws IOException + public void add(RowMutation rowMutation, Object serializedRow) throws IOException { - Callable<CommitLogSegment.CommitLogContext> task = new LogRecordAdder(rowMutation, serializedRow); - return executor.submit(task); + executor.add(new LogRecordAdder(rowMutation, serializedRow)); } /* @@ -450,7 +455,9 @@ public class CommitLog } } - class LogRecordAdder implements Callable<CommitLogSegment.CommitLogContext> + // TODO this should be a Runnable since it doesn't actually return anything, but it's difficult to do that + // without breaking the fragile CheaterFutureTask in BatchCLES. + class LogRecordAdder implements Callable, Runnable { final RowMutation rowMutation; final Object serializedRow; @@ -461,18 +468,28 @@ public class CommitLog this.serializedRow = serializedRow; } - public CommitLogSegment.CommitLogContext call() throws Exception + public void run() { - CommitLogSegment.CommitLogContext context = currentSegment().write(rowMutation, serializedRow); - - // roll log if necessary - if (currentSegment().length() >= SEGMENT_SIZE) + try { - sync(); - segments.add(new CommitLogSegment(currentSegment().getHeader().getColumnFamilyCount())); + currentSegment().write(rowMutation, serializedRow); + // roll log if necessary + if (currentSegment().length() >= SEGMENT_SIZE) + { + sync(); + segments.add(new CommitLogSegment(currentSegment().getHeader().getColumnFamilyCount())); + } + } + catch (IOException e) + { + throw new IOError(e); } + } - return context; + public Object call() throws Exception + { + run(); + return null; } } } Added: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/ICommitLogExecutorService.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/ICommitLogExecutorService.java?rev=939004&view=auto ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/ICommitLogExecutorService.java (added) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/ICommitLogExecutorService.java Wed Apr 28 16:30:20 2010 @@ -0,0 +1,20 @@ +package org.apache.cassandra.db.commitlog; + +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +import org.apache.cassandra.concurrent.IExecutorMBean; + +/** + * Like ExecutorService, but customized for batch and periodic commitlog execution. + */ +public interface ICommitLogExecutorService extends IExecutorMBean +{ + public <T> Future<T> submit(Callable<T> task); + + /** + * submits the adder for execution and blocks for it to be synced, if necessary + */ + public void add(CommitLog.LogRecordAdder adder); + +} Copied: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorService.java (from r933475, cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java) URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorService.java?p2=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorService.java&p1=cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java&r1=933475&r2=939004&rev=939004&view=diff ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLogExecutorService.java (original) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorService.java Wed Apr 28 16:30:20 2010 @@ -22,213 +22,81 @@ package org.apache.cassandra.db.commitlo import java.io.IOException; -import java.lang.management.ManagementFactory; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.concurrent.*; -import javax.management.MBeanServer; -import javax.management.ObjectName; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.utils.WrappedRunnable; -class CommitLogExecutorService extends AbstractExecutorService implements CommitLogExecutorServiceMBean +class PeriodicCommitLogExecutorService implements ICommitLogExecutorService, PeriodicCommitLogExecutorServiceMBean { - private final BlockingQueue<CheaterFutureTask> queue; + private final BlockingQueue<Runnable> queue; + protected volatile long completedTaskCount = 0; - private volatile long completedTaskCount = 0; - - public CommitLogExecutorService() + public PeriodicCommitLogExecutorService() { - this(DatabaseDescriptor.getCommitLogSync() == DatabaseDescriptor.CommitLogSync.batch - ? DatabaseDescriptor.getConcurrentWriters() - : 1024 * Runtime.getRuntime().availableProcessors()); + this(1024 * Runtime.getRuntime().availableProcessors()); } - public CommitLogExecutorService(int queueSize) + public PeriodicCommitLogExecutorService(int queueSize) { - queue = new LinkedBlockingQueue<CheaterFutureTask>(queueSize); + queue = new LinkedBlockingQueue<Runnable>(queueSize); Runnable runnable = new WrappedRunnable() { public void runMayThrow() throws Exception { - if (DatabaseDescriptor.getCommitLogSync() == DatabaseDescriptor.CommitLogSync.batch) - { - while (true) - { - processWithSyncBatch(); - completedTaskCount++; - } - } - else + while (true) { - while (true) - { - process(); - completedTaskCount++; - } + queue.take().run(); + completedTaskCount++; } } }; new Thread(runnable, "COMMIT-LOG-WRITER").start(); - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try - { - mbs.registerMBean(this, new ObjectName("org.apache.cassandra.db:type=Commitlog")); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - - /** - * Get the current number of running tasks - */ - public int getActiveCount() - { - return 1; - } - - /** - * Get the number of completed tasks - */ - public long getCompletedTasks() - { - return completedTaskCount; + AbstractCommitLogExecutorService.registerMBean(this); } - /** - * Get the number of tasks waiting to be executed - */ - public long getPendingTasks() + public void add(CommitLog.LogRecordAdder adder) { - return queue.size(); - } - - private void process() throws InterruptedException - { - queue.take().run(); - } - - private final ArrayList<CheaterFutureTask> incompleteTasks = new ArrayList<CheaterFutureTask>(); - private final ArrayList taskValues = new ArrayList(); // TODO not sure how to generify this - private void processWithSyncBatch() throws Exception - { - CheaterFutureTask firstTask = queue.take(); - if (!(firstTask.getRawCallable() instanceof CommitLog.LogRecordAdder)) - { - firstTask.run(); - return; - } - - // attempt to do a bunch of LogRecordAdder ops before syncing - // (this is a little clunky since there is no blocking peek method, - // so we have to break it into firstTask / extra tasks) - incompleteTasks.clear(); - taskValues.clear(); - long end = System.nanoTime() + (long)(1000000 * DatabaseDescriptor.getCommitLogSyncBatchWindow()); - - // it doesn't seem worth bothering future-izing the exception - // since if a commitlog op throws, we're probably screwed anyway - incompleteTasks.add(firstTask); - taskValues.add(firstTask.getRawCallable().call()); - while (!queue.isEmpty() - && queue.peek().getRawCallable() instanceof CommitLog.LogRecordAdder - && System.nanoTime() < end) - { - CheaterFutureTask task = queue.remove(); - incompleteTasks.add(task); - taskValues.add(task.getRawCallable().call()); - } - - // now sync and set the tasks' values (which allows thread calling get() to proceed) try { - CommitLog.instance().sync(); + queue.put(adder); } - catch (IOException e) + catch (InterruptedException e) { throw new RuntimeException(e); } - for (int i = 0; i < incompleteTasks.size(); i++) - { - incompleteTasks.get(i).set(taskValues.get(i)); - } } - - @Override - protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) - { - return newTaskFor(Executors.callable(runnable, value)); - } - - @Override - protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) - { - return new CheaterFutureTask(callable); - } - - public void execute(Runnable command) + public <T> Future<T> submit(Callable<T> task) { + FutureTask<T> ft = new FutureTask<T>(task); try { - queue.put((CheaterFutureTask)command); + queue.put(ft); } catch (InterruptedException e) { throw new RuntimeException(e); } + return ft; } - public boolean isShutdown() - { - return false; - } - - public boolean isTerminated() - { - return false; - } - - // cassandra is crash-only so there's no need to implement the shutdown methods - public void shutdown() - { - throw new UnsupportedOperationException(); - } - - public List<Runnable> shutdownNow() + public long getPendingTasks() { - throw new UnsupportedOperationException(); + return queue.size(); } - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException + public int getActiveCount() { - throw new UnsupportedOperationException(); + return 1; } - private static class CheaterFutureTask<V> extends FutureTask<V> + public long getCompletedTasks() { - private final Callable rawCallable; - - public CheaterFutureTask(Callable<V> callable) - { - super(callable); - rawCallable = callable; - } - - public Callable getRawCallable() - { - return rawCallable; - } - - @Override - public void set(V v) - { - super.set(v); - } + return completedTaskCount; } -} +} \ No newline at end of file Added: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorServiceMBean.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorServiceMBean.java?rev=939004&view=auto ============================================================================== --- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorServiceMBean.java (added) +++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogExecutorServiceMBean.java Wed Apr 28 16:30:20 2010 @@ -0,0 +1,25 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +package org.apache.cassandra.db.commitlog; + +import org.apache.cassandra.concurrent.IExecutorMBean; + +public interface PeriodicCommitLogExecutorServiceMBean extends IExecutorMBean +{ +} \ No newline at end of file