I just noticed this thread. Does this mean that (assuming the same setup of an 
empty keyspace and CFs added later) if I have a CF that I write to for some 
time, but not enough to hit the flush limits, it will never get flushed until 
the server is restarted? I believe this is causing commit logs to not be 
deleted, which is taking up a ton of disk space (in addition to a bunch of 
small memtables being stuck in memory).

-Jeffrey

From: Ching-Cheng Chen [mailto:cc...@evidentsoftware.com]
Sent: Thursday, February 17, 2011 8:52 AM
To: user@cassandra.apache.org
Cc: Jonathan Ellis
Subject: Re: memtable_flush_after_mins setting not working

https://issues.apache.org/jira/browse/CASSANDRA-2183

Regards,

Chen

www.evidentsoftware.com<http://www.evidentsoftware.com>
On Thu, Feb 17, 2011 at 11:47 AM, Ching-Cheng Chen 
<cc...@evidentsoftware.com<mailto:cc...@evidentsoftware.com>> wrote:
Certainly, I'll open a ticket to track this issue.

Regards,

Chen

www.evidentsoftware.com<http://www.evidentsoftware.com>

On Thu, Feb 17, 2011 at 11:42 AM, Jonathan Ellis 
<jbel...@gmail.com<mailto:jbel...@gmail.com>> wrote:
Your analysis sounds correct to me.  Can you open a ticket on
https://issues.apache.org/jira/browse/CASSANDRA ?

On Thu, Feb 17, 2011 at 10:17 AM, Ching-Cheng Chen
<cc...@evidentsoftware.com<mailto:cc...@evidentsoftware.com>> wrote:
> We have observed the behavior that memtable_flush_after_mins setting not
> working occasionally.   After some testing and code digging, we finally
> figured out what going on.
> The memtable_flush_after_mins won't work on certain condition with current
> implementation in Cassandra.
>
> In org.apache.cassandra.db.Table,  the scheduled flush task is setup by the
> following code during construction.
>
> int minCheckMs = Integer.MAX_VALUE;
>
> for (ColumnFamilyStore cfs : columnFamilyStores.values())
> {
>     minCheckMs = Math.min(minCheckMs, cfs.getMemtableFlushAfterMins() * 60 *
> 1000);
> }
> Runnable runnable = new Runnable()
> {
>    public void run()
>    {
>        for (ColumnFamilyStore cfs : columnFamilyStores.values())
>        {
>            cfs.forceFlushIfExpired();
>        }
>    }
> };
> flushTask = StorageService.scheduledTasks.scheduleWithFixedDelay(runnable,
> minCheckMs, minCheckMs, TimeUnit.MILLISECONDS);
>
> Now for our application, we will create a keyspacewithout any columnfamily
> first.  And only add needed columnfamily later depends on request.
> However, when keyspacegot created (without any columnfamily ), the above
> code will actually schedule a fixed delay flush check task with
> Integer.MAX_VALUE ms
> since there is no columnfamily yet.
> Later when you add columnfamily to this empty keyspace, the initCf() method
> in Table.java doesn't check whether the scheduled flush check task interval
> need
> to be updated or not.   To fix this, we'd need to restart the Cassandra
> after columnfamily added into the keyspace.
> I would suggest that add additional logic in initCf() method to recreate a
> scheduled flush check task if needed.
> Regards,
> Chen
> www.evidentsoftware.com<http://www.evidentsoftware.com>


--
Jonathan Ellis
Project Chair, Apache Cassandra
co-founder of Riptano, the source for professional Cassandra support
http://riptano.com


--
www.evidentsoftware.com<http://www.evidentsoftware.com>

Reply via email to