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 >> >>