I suspect this will work, yes (Sorry I can't make a proper upgrade path, sorta out of my hands)
On Fri, Sep 27, 2019 at 11:19 AM Carl Mueller <carl.muel...@smartthings.com.invalid> wrote: > Oops, I think the getName() is an important thing: > > package com.jeffjirsa.cassandra.db.compaction; > > import org.apache.cassandra.db.ColumnFamilyStore; > > import java.util.Map; > > public class TimeWindowCompactionStrategy extends > org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy { > public TimeWindowCompactionStrategy(ColumnFamilyStore cfs, Map<String, > String> options) { > super(cfs,options); > } > > public String getName() > { > return getClass().getSimpleName(); > } > } > > > On Fri, Sep 27, 2019 at 1:05 PM Carl Mueller <carl.muel...@smartthings.com> > wrote: > >> Or can we just do this safely in a side jar? >> >> package com.jeffjirsa.cassandra.db.compaction; >> >> import org.apache.cassandra.db.ColumnFamilyStore; >> import org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy; >> >> import java.util.Map; >> >> public class TimeWindowCompactionStrategy extends >> TimeWindowCompactionStrategy { >> public TimeWindowCompactionStrategy(ColumnFamilyStore cfs, Map<String, >> String> options) { >> super(cfs,options); >> } >> } >> >> >> On Fri, Sep 27, 2019 at 12:29 PM Carl Mueller < >> carl.muel...@smartthings.com> wrote: >> >>> So IF that delegate class would work: >>> >>> 1) create jar with the delegate class >>> 2) deploy jar along with upgrade on node >>> 3) once all nodes are upgraded, issue ALTER to change to the >>> org.apache.cassandra TWCS class. >>> >>> will that trigger full recompaction? >>> >>> On Fri, Sep 27, 2019 at 12:25 PM Carl Mueller < >>> carl.muel...@smartthings.com> wrote: >>> >>>> For example (delegating all public methods from >>>> AbstractCompactionStrategy and some from TimeWindowCompactionStrategy >>>> EXCEPT getName() ):::: >>>> >>>> package com.jeffjirsa.cassandra.db.compaction; >>>> >>>> public class TimeWindowCompactionStrategy extends >>>> AbstractCompactionStrategy >>>> { >>>> org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy >>>> delegate; >>>> >>>> public TimeWindowCompactionStrategy(ColumnFamilyStore cfs, >>>> Map<String,String> options) { >>>> delegate = new >>>> org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy(cfs,options); >>>> } >>>> >>>> >>>> public Directories getDirectories() { return >>>> delegate.getDirectories(); } >>>> public synchronized void pause() { delegate.pause(); } >>>> public synchronized void resume() { delegate.resume(); } >>>> public synchronized void startup() { delegate.startup(); } >>>> public synchronized void shutdown() { delegate.shutdown(); } >>>> >>>> >>>> >>>> public AbstractCompactionTask getNextBackgroundTask(int gcBefore) { >>>> return delegate.getNextBackgroundTask(gcBefore); } >>>> public synchronized Collection<AbstractCompactionTask> >>>> getMaximalTask(int gcBefore, boolean splitOutput) { return >>>> delegate.getMaximalTask(gcBefore, splitOutput); } >>>> public synchronized AbstractCompactionTask >>>> getUserDefinedTask(Collection<SSTableReader> sstables, int gcBefore) { >>>> return getUserDefinedTask(sstables,gcBefore); } >>>> public int getEstimatedRemainingTasks() { return >>>> delegate.getEstimatedRemainingTasks(); } >>>> public long getMaxSSTableBytes() { return >>>> delegate.getMaxSSTableBytes(); } >>>> public ScannerList getScanners(Collection<SSTableReader> sstables, >>>> Range<Token> range) { return delegate.getScanners(sstables,range); } >>>> public ScannerList getScanners(Collection<SSTableReader> sstables, >>>> Collection<Range<Token>> ranges) { return delegate.getScanners(sstables, >>>> ranges);} >>>> public ScannerList getScanners(Collection<SSTableReader> toCompact) >>>> { return delegate.getScanners(toCompact); } >>>> protected boolean worthDroppingTombstones(SSTableReader sstable, >>>> int gcBefore) { return delegate.worthDroppingTombstones(sstable,gcBefore); >>>> } >>>> >>>> public boolean shouldDefragment() { return >>>> delegate.shouldDefragment(); } >>>> public synchronized void replaceSSTables(Collection<SSTableReader> >>>> removed, Collection<SSTableReader> added) { >>>> delegate.replaceSSTables(removed,added); } >>>> public Collection<Collection<SSTableReader>> >>>> groupSSTablesForAntiCompaction(Collection<SSTableReader> sstablesToGroup) { >>>> delegate.groupSSTablesForAntiCOmpaction(sstablesToGroup); } >>>> public CompactionLogger.Strategy strategyLogger() { return >>>> delegate.strategyLogger(); } >>>> public SSTableMultiWriter createSSTableMultiWriter(Descriptor >>>> descriptor, >>>> long keyCount, >>>> long repairedAt, >>>> UUID >>>> pendingRepair, >>>> boolean >>>> isTransient, >>>> >>>> MetadataCollector meta, >>>> >>>> SerializationHeader header, >>>> >>>> Collection<Index> indexes, >>>> >>>> LifecycleNewTracker lifecycleNewTracker) { >>>> return delefate.createSSTableMultiWriter(descriptor, keyCount, >>>> repairedAt, pendingRepair, isTransient, meta, header, indexes, >>>> lifecycleNewTracker); >>>> } >>>> >>>> public boolean supportsEarlyOpen() { return >>>> delegate.supportsEarlyOpen(); } >>>> >>>> >>>> >>>> >>>> public String getName() { return getClass().getSimpleName(); } // >>>> don't delegate because this is probably the name used in the column family >>>> definition. >>>> >>>> >>>> >>>> >>>> public synchronized void addSSTable(SSTableReader sstable) { >>>> delegate.addSSTable(sstable); } >>>> public synchronized void addSSTables(Iterable<SSTableReader> added) >>>> { delegate.addSSTables(added); } >>>> >>>> public synchronized void removeSSTable(SSTableReader sstable) { >>>> delegate.removeSSTable(sstable); } >>>> public void removeSSTables(Iterable<SSTableReader> removed) { >>>> delegate.removeSSTables(removed); } >>>> >>>> public void metadataChanged(StatsMetadata oldMetadata, >>>> SSTableReader sstable) { delegate.metadataChanges(oldMetadata,sstable); } >>>> >>>> >>>> protected Set<SSTableReader> getSSTables() { return >>>> delegate.getSSTables(); } >>>> public String toString() {return delegate.toString(); } >>>> >>>> >>>> public static Map<String, String> validateOptions(Map<String, >>>> String> options) throws ConfigurationException { return >>>> delegate.validateOptions(options); } >>>> >>>> } >>>> >>>> On Fri, Sep 27, 2019 at 11:58 AM Carl Mueller < >>>> carl.muel...@smartthings.com> wrote: >>>> >>>>> Is this still the official answer on TWCS 2.X --> 3.X upgrades? Pull >>>>> the code and recompile as a different package? >>>>> >>>>> Can I just declare the necessary class and package namespace and >>>>> delegate to the actual main-codebase class? >>>>> >>>>> >>>>> On Mon, Nov 5, 2018 at 1:41 AM Oleksandr Shulgin < >>>>> oleksandr.shul...@zalando.de> wrote: >>>>> >>>>>> On Sat, Nov 3, 2018 at 1:13 AM Brian Spindler < >>>>>> brian.spind...@gmail.com> wrote: >>>>>> >>>>>>> That wasn't horrible at all. After testing, provided all goes well >>>>>>> I can submit this back to the main TWCS repo if you think it's worth it. >>>>>>> >>>>>>> Either way do you mind just reviewing briefly for obvious mistakes? >>>>>>> >>>>>>> >>>>>>> https://github.com/bspindler/twcs/commit/7ba388dbf41b1c9dc1b70661ad69273b258139da >>>>>>> >>>>>> >>>>>> About almost a year ago we were migrating from 2.1 to 3.0 and we >>>>>> figured out that Jeff's master branch didn't compile with 3.0, but the >>>>>> change to get it running was really minimal: >>>>>> >>>>>> https://github.com/a1exsh/twcs/commit/10ee91c6f409aa249c8d439f7670d8b997ab0869 >>>>>> >>>>>> So we built that jar, added it to the packaged 3.0 and we were good >>>>>> to go. Maybe you might want to consider migrating in two steps: 2.1 -> >>>>>> 3.0, ALTER TABLE, upgradesstables, 3.0 -> 3.1. >>>>>> >>>>>> And huge thanks to Jeff for coming up with TWCS in the first place! >>>>>> :-) >>>>>> >>>>>> Cheers, >>>>>> -- >>>>>> Alex >>>>>> >>>>>>