From 047df3a149898264b161ad7b9e7e6ca69b2bebaa Mon Sep 17 00:00:00 2001 From: Ben van Hartingsveldt Date: Sat, 21 Sep 2024 00:03:04 +0200 Subject: [PATCH] Fix database rows --- .../java/com/lbry/database/BasePrefixDB.java | 340 +++++++++++++++ src/main/java/com/lbry/database/PrefixDB.java | 404 ++---------------- .../database/rows/ActivatedPrefixRow.java | 7 +- .../database/rows/ActiveAmountPrefixRow.java | 7 +- .../lbry/database/rows/BidOrderPrefixRow.java | 7 +- .../database/rows/BlockHashPrefixRow.java | 7 +- .../database/rows/BlockHeaderPrefixRow.java | 7 +- .../lbry/database/rows/BlockTxsPrefixRow.java | 7 +- .../database/rows/ChannelCountPrefixRow.java | 7 +- .../rows/ChannelToClaimPrefixRow.java | 7 +- .../rows/ClaimExpirationPrefixRow.java | 7 +- .../database/rows/ClaimShortIDPrefixRow.java | 7 +- .../database/rows/ClaimTakeoverPrefixRow.java | 7 +- .../rows/ClaimToChannelPrefixRow.java | 7 +- .../rows/ClaimToSupportPrefixRow.java | 7 +- .../database/rows/ClaimToTXOPrefixRow.java | 7 +- .../lbry/database/rows/DBStatePrefixRow.java | 7 +- .../rows/EffectiveAmountPrefixRow.java | 7 +- .../rows/FutureEffectiveAmountPrefixRow.java | 7 +- .../rows/HashXHistoryHasherPrefixRow.java | 7 +- .../database/rows/HashXHistoryPrefixRow.java | 7 +- .../rows/HashXMempoolStatusPrefixRow.java | 7 +- .../database/rows/HashXStatusPrefixRow.java | 7 +- .../database/rows/HashXUTXOPrefixRow.java | 7 +- .../database/rows/MempoolTXPrefixRow.java | 7 +- .../rows/PendingActivationPrefixRow.java | 7 +- .../com/lbry/database/rows/PrefixRow.java | 141 +++--- .../lbry/database/rows/RepostPrefixRow.java | 7 +- .../database/rows/RepostedCountPrefixRow.java | 7 +- .../lbry/database/rows/RepostedPrefixRow.java | 7 +- .../database/rows/SupportAmountPrefixRow.java | 7 +- .../rows/SupportToClaimPrefixRow.java | 7 +- .../lbry/database/rows/TXHashPrefixRow.java | 7 +- .../lbry/database/rows/TXNumPrefixRow.java | 7 +- .../database/rows/TXOToClaimPrefixRow.java | 7 +- .../com/lbry/database/rows/TXPrefixRow.java | 7 +- .../database/rows/TouchedHashXPrefixRow.java | 7 +- .../rows/TouchedOrDeletedPrefixRow.java | 7 +- .../rows/TrendingNotificationPrefixRow.java | 7 +- .../lbry/database/rows/TxCountPrefixRow.java | 7 +- .../com/lbry/database/rows/UTXOPrefixRow.java | 7 +- .../com/lbry/database/rows/UndoPrefixRow.java | 7 +- .../tests/RevertablePrefixDBTest.java | 4 +- .../tests/RevertibleOperationStackTest.java | 10 +- 44 files changed, 675 insertions(+), 497 deletions(-) create mode 100644 src/main/java/com/lbry/database/BasePrefixDB.java diff --git a/src/main/java/com/lbry/database/BasePrefixDB.java b/src/main/java/com/lbry/database/BasePrefixDB.java new file mode 100644 index 0000000..19cded3 --- /dev/null +++ b/src/main/java/com/lbry/database/BasePrefixDB.java @@ -0,0 +1,340 @@ +package com.lbry.database; + +import com.lbry.database.keys.UndoKey; +import com.lbry.database.revert.RevertibleDelete; +import com.lbry.database.revert.RevertibleOperation; +import com.lbry.database.revert.RevertibleOperationStack; +import com.lbry.database.revert.RevertiblePut; + +import org.rocksdb.*; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.*; + +/** + * Base class for a revertible RocksDB database (a RocksDB database where each set of applied changes can be undone). + */ +public abstract class BasePrefixDB{ + + private final List columnFamilyHandles; + protected final RocksDB database; + protected final RevertibleOperationStack operationStack; + private final int maxUndoDepth; + + public BasePrefixDB(String path, int maxOpenFiles, String secondaryPath, int maxUndoDepth, Set unsafePrefixes, boolean enforceIntegrity) throws RocksDBException{ + List columnFamilyDescriptors = new ArrayList<>(); + columnFamilyDescriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY)); + for(Prefix prefix : Prefix.values()){ + byte[] name = new byte[]{prefix.getValue()}; + ColumnFamilyDescriptor descriptor = new ColumnFamilyDescriptor(name); + columnFamilyDescriptors.add(descriptor); + } + + this.columnFamilyHandles = new ArrayList<>(); + + Options options = new Options() + .setCreateIfMissing(true) + .setUseFsync(false) + .setTargetFileSizeBase(33554432) + .setMaxOpenFiles(secondaryPath==null?maxOpenFiles:-1) + .setCreateMissingColumnFamilies(true); + + this.database = RocksDB.open(new DBOptions(options),path,columnFamilyDescriptors,this.columnFamilyHandles); + + this.operationStack = new RevertibleOperationStack((byte[] key) -> { + try{ + return Optional.of(this.get(key)); + }catch(RocksDBException e){} + return Optional.empty(); + },(List keys) -> { + List> optionalKeys = new ArrayList<>(); + for(byte[] key : keys){ + optionalKeys.add(Optional.of(key)); + } + return optionalKeys; + },unsafePrefixes,enforceIntegrity); + + this.maxUndoDepth = maxUndoDepth; + } + + /** + * Write staged changes to the database without keeping undo information. Changes written cannot be undone. + */ + + + public void unsafeCommit() throws RocksDBException { + this.applyStash(); + WriteOptions writeOptions = new WriteOptions().setSync(true); + try{ + if(this.operationStack.length()!=0){ + return; + } + WriteBatch batch = new WriteBatch(); + for(RevertibleOperation stagedChange : this.operationStack.iterate()){ + ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); + if(!stagedChange.isDelete()){ + batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); + }else{ + batch.delete(columnFamily,stagedChange.getKey()); + } + this.database.write(writeOptions,batch); + } + }finally{ + writeOptions.close(); + this.operationStack.clear(); + } + } + + public void commit(int height,byte[] blockHash) throws RocksDBException{ + this.applyStash(); + byte[] undoOperations = this.operationStack.getUndoOperations(); + List deleteUndos = new ArrayList<>(); + if(height>this.maxUndoDepth){ + byte[] upperBound = ByteBuffer.allocate(1+8).order(ByteOrder.BIG_ENDIAN).put(Prefix.UNDO.getValue()).putLong(height-this.maxUndoDepth).array(); + RocksIterator iterator = this.database.newIterator(new ReadOptions().setIterateUpperBound(new Slice(upperBound))); + iterator.seek(ByteBuffer.allocate(1+8).order(ByteOrder.BIG_ENDIAN).put(Prefix.UNDO.getValue()).array()); + while(iterator.isValid()){ + deleteUndos.add(iterator.key()); + iterator.next(); + } + } + try{ + ColumnFamilyHandle undoColumnFamily = this.getColumnFamilyByPrefix(Prefix.UNDO); + WriteOptions writeOptions = new WriteOptions().setSync(true); + try{ + WriteBatch batch = new WriteBatch(); + for(RevertibleOperation stagedChange : this.operationStack.iterate()){ + ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); + if(!stagedChange.isDelete()){ + batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); + }else{ + batch.delete(columnFamily,stagedChange.getKey()); + } + + } + for(byte[] undoToDelete : deleteUndos){ + batch.delete(undoColumnFamily,undoToDelete); + } + UndoKey undoKey = new UndoKey(); + undoKey.height = height; + undoKey.block_hash = blockHash; + byte[] undoKeyBytes = ((PrefixDB)this).undo.packKey(undoKey); + batch.put(undoColumnFamily,undoKeyBytes,undoOperations); + this.database.write(writeOptions,batch); + }finally{ + writeOptions.close(); + this.operationStack.clear(); + } + }finally{ + this.operationStack.clear(); + } + } + + public void rollback(int height,byte[] blockHash) throws RocksDBException{ + UndoKey undoKey = new UndoKey(); + undoKey.height = height; + undoKey.block_hash = blockHash; + byte[] undoKeyBytes = ((PrefixDB)this).undo.packKey(undoKey); + ColumnFamilyHandle undoColumnFamily = this.getColumnFamilyByPrefix(Prefix.UNDO); + byte[] undoInfo = this.database.get(undoColumnFamily,undoKeyBytes); + this.operationStack.applyPackedUndoOperations(undoInfo); + this.operationStack.validateAndApplyStashedOperations(); + WriteOptions writeOptions = new WriteOptions().setSync(true); + try{ + WriteBatch batch = new WriteBatch(); + for(RevertibleOperation stagedChange : this.operationStack.iterate()){ + ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); + if(!stagedChange.isDelete()){ + batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); + }else{ + batch.delete(columnFamily,stagedChange.getKey()); + } + this.database.write(writeOptions,batch); + } + // batch.delete(undoKey) + }finally{ + writeOptions.close(); + this.operationStack.clear(); + } + } + + public void applyStash(){ + this.operationStack.validateAndApplyStashedOperations(); + } + + /** + * Get value by prefixed key. + * @param key The prefixed key. + * @return The value or null. + * @throws RocksDBException The exception. + */ + public byte[] get(byte[] key) throws RocksDBException{ + return this.get(key,true); + } + + /** + * Get value by prefixed key. + * @param key The prefixed key. + * @param fillCache Fill cache option. + * @return The value or null. + * @throws RocksDBException The exception. + */ + public byte[] get(byte[] key,boolean fillCache) throws RocksDBException{ + ColumnFamilyHandle columnFamily = null; + for(ColumnFamilyHandle handle : this.columnFamilyHandles){ + if(key.length>0 && Arrays.equals(handle.getName(),new byte[]{key[0]})){ + columnFamily = handle; + break; + } + } + ReadOptions options = new ReadOptions().setFillCache(fillCache); + byte[] value = this.database.get(columnFamily,options,key); + options.close(); + return value; + } + + /** + * Get multiple values by prefixed keys. + * @param keys The prefixed keys. + * @return The values. + * @throws RocksDBException The exception. + */ + public List multiGet(List keys) throws RocksDBException{ + return this.multiGet(keys,true); + } + + /** + * Get multiple values by prefixed keys. + * @param keys The prefixed keys. + * @param fillCache Fill cache option. + * @return The values. + * @throws RocksDBException The exception. + */ + public List multiGet(List keys,boolean fillCache) throws RocksDBException{ + List columnFamilies = new ArrayList<>(); + for(byte[] key : keys){ + for(ColumnFamilyHandle handle : this.columnFamilyHandles){ + if(Arrays.equals(handle.getName(),new byte[]{key[0]})){ + columnFamilies.add(handle); + break; + } + } + } + ReadOptions options = new ReadOptions().setFillCache(fillCache); + List values = this.database.multiGetAsList(options,columnFamilies,keys); + options.close(); + return values; + } + + /** + * Stash multiple items for deletion. + * @param items The items. + */ + public void multiDelete(Map items){ + this.operationStack.stashOperations(items.entrySet().stream().map((entry) -> new RevertibleDelete(entry.getKey(),entry.getValue())).toArray(RevertibleOperation[]::new)); + } + + /** + * Stash multiple items for putting. + * @param items The items. + */ + public void multiPut(Map items){ + this.operationStack.stashOperations(items.entrySet().stream().map((entry) -> new RevertiblePut(entry.getKey(),entry.getValue())).toArray(RevertibleOperation[]::new)); + } + + public RocksIterator iterator(){ + return this.iterator(null,null); + } + + public RocksIterator iterator(ReadOptions readOptions){ + return this.iterator(null,readOptions); + } + + public RocksIterator iterator(ColumnFamilyHandle columnFamily){ + return this.iterator(columnFamily,null); + } + + public RocksIterator iterator(ColumnFamilyHandle columnFamily,ReadOptions readOptions){ + if(columnFamily==null && readOptions==null){ + return this.database.newIterator(); + } + if(columnFamily==null){ + return this.database.newIterator(readOptions); + } + if(readOptions==null){ + return this.database.newIterator(columnFamily); + } + return this.database.newIterator(columnFamily,readOptions); + } + + /** + * Close database. + */ + public void close(){ + this.database.close(); + } + + public void tryCatchUpWithPrimary() throws RocksDBException{ + this.database.tryCatchUpWithPrimary(); + } + + /** + * Stash item for deletion. + * @param key The item prefixed key. + * @param value The value. + */ + public void stashRawDelete(byte[] key,byte[] value){ + this.operationStack.stashOperations(new RevertibleOperation[]{ + new RevertibleDelete(key,value), + }); + } + + /** + * Stash item for putting. + * @param key The item prefixed key. + * @param value The value. + */ + public void stashRawPut(byte[] key,byte[] value){ + this.operationStack.stashOperations(new RevertibleOperation[]{ + new RevertiblePut(key,value), + }); + } + + public int estimateNumKeys() throws RocksDBException{ + return this.estimateNumKeys(null); + } + + public int estimateNumKeys(ColumnFamilyHandle columnFamily) throws RocksDBException{ + return Integer.parseInt(this.database.getProperty(columnFamily,"rocksdb.estimate-num-keys")); + } + + + public boolean keyMayExist(byte[] key) throws RocksDBException{ + ColumnFamilyHandle columnFamily = null; + for(ColumnFamilyHandle handle : this.columnFamilyHandles){ + if(key.length>0 && Arrays.equals(handle.getName(),new byte[]{key[0]})){ + columnFamily = handle; + break; + } + } + return this.database.keyMayExist(columnFamily,ByteBuffer.wrap(key)); + } + + public List getColumnFamilyHandles(){ + return new ArrayList<>(this.columnFamilyHandles); + } + + public ColumnFamilyHandle getColumnFamilyByPrefix(Prefix prefix) throws RocksDBException{ + if(prefix==null){ + return this.database.getDefaultColumnFamily(); + } + for(ColumnFamilyHandle columnFamily : this.columnFamilyHandles){ + if(Arrays.equals(columnFamily.getName(),new byte[]{prefix.getValue()})){ + return columnFamily; + } + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/com/lbry/database/PrefixDB.java b/src/main/java/com/lbry/database/PrefixDB.java index 4fb0212..12615aa 100644 --- a/src/main/java/com/lbry/database/PrefixDB.java +++ b/src/main/java/com/lbry/database/PrefixDB.java @@ -1,27 +1,15 @@ package com.lbry.database; -import com.lbry.database.keys.UndoKey; -import com.lbry.database.revert.RevertibleDelete; -import com.lbry.database.revert.RevertibleOperation; -import com.lbry.database.revert.RevertibleOperationStack; -import com.lbry.database.revert.RevertiblePut; import com.lbry.database.rows.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.*; +import java.util.Set; -import org.rocksdb.*; +import org.rocksdb.RocksDBException; /** * Class for a revertible RocksDB database: A RocksDB database where each set of applied changes can be undone. */ -public class PrefixDB{ - - private final List columnFamilyHandles; - private final RocksDB database; - private final RevertibleOperationStack operationStack; - private final int maxUndoDepth; +public class PrefixDB extends BasePrefixDB{ public final ClaimToSupportPrefixRow claim_to_support; public final SupportToClaimPrefixRow support_to_claim; @@ -79,356 +67,52 @@ public class PrefixDB{ this(path,maxOpenFiles,secondaryPath,maxUndoDepth,null); } - public PrefixDB(String path,int maxOpenFiles,String secondaryPath,int maxUndoDepth,Set unsafePrefixes) throws RocksDBException{ + public PrefixDB(String path, int maxOpenFiles, String secondaryPath, int maxUndoDepth, Set unsafePrefixes) throws RocksDBException{ this(path,maxOpenFiles,secondaryPath,maxUndoDepth,unsafePrefixes,true); } public PrefixDB(String path,int maxOpenFiles,String secondaryPath,int maxUndoDepth,Set unsafePrefixes,boolean enforceIntegrity) throws RocksDBException{ - List columnFamilyDescriptors = new ArrayList<>(); - columnFamilyDescriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY)); - for(Prefix prefix : Prefix.values()){ - byte[] name = new byte[]{prefix.getValue()}; - ColumnFamilyDescriptor descriptor = new ColumnFamilyDescriptor(name); - columnFamilyDescriptors.add(descriptor); - } + super(path,maxOpenFiles,secondaryPath,maxUndoDepth,unsafePrefixes,enforceIntegrity); - this.columnFamilyHandles = new ArrayList<>(); - - Options options = new Options() - .setCreateIfMissing(true) - .setUseFsync(false) - .setTargetFileSizeBase(33554432) - .setMaxOpenFiles(secondaryPath==null?maxOpenFiles:-1) - .setCreateMissingColumnFamilies(true); - - this.database = RocksDB.open(new DBOptions(options),path,columnFamilyDescriptors,this.columnFamilyHandles); - - this.operationStack = new RevertibleOperationStack((byte[] key) -> { - try{ - return Optional.of(this.get(key)); - }catch(RocksDBException e){} - return Optional.empty(); - },(List keys) -> { - List> optionalKeys = new ArrayList<>(); - for(byte[] key : keys){ - optionalKeys.add(Optional.of(key)); - } - return optionalKeys; - },unsafePrefixes,enforceIntegrity); - - this.maxUndoDepth = maxUndoDepth; - - this.claim_to_support = new ClaimToSupportPrefixRow(this,this.operationStack); - this.support_to_claim = new SupportToClaimPrefixRow(this,this.operationStack); - this.claim_to_txo = new ClaimToTXOPrefixRow(this,this.operationStack); - this.txo_to_claim = new TXOToClaimPrefixRow(this,this.operationStack); - this.claim_to_channel = new ClaimToChannelPrefixRow(this,this.operationStack); - this.channel_to_claim = new ChannelToClaimPrefixRow(this,this.operationStack); - this.claim_short_id = new ClaimShortIDPrefixRow(this,this.operationStack); - this.claim_expiration = new ClaimExpirationPrefixRow(this,this.operationStack); - this.claim_takeover = new ClaimTakeoverPrefixRow(this,this.operationStack); - this.pending_activation = new PendingActivationPrefixRow(this,this.operationStack); - this.activated = new ActivatedPrefixRow(this,this.operationStack); - this.active_amount = new ActiveAmountPrefixRow(this,this.operationStack); - this.bid_order = new BidOrderPrefixRow(this,this.operationStack); - this.repost = new RepostPrefixRow(this,this.operationStack); - this.reposted_claim = new RepostedPrefixRow(this,this.operationStack); - this.reposted_count = new RepostedCountPrefixRow(this,this.operationStack); - this.undo = new UndoPrefixRow(this,this.operationStack); - this.utxo = new UTXOPrefixRow(this,this.operationStack); - this.hashX_utxo = new HashXUTXOPrefixRow(this,this.operationStack); - this.hashX_history = new HashXHistoryPrefixRow(this,this.operationStack); - this.block_hash = new BlockHashPrefixRow(this,this.operationStack); - this.tx_count = new TxCountPrefixRow(this,this.operationStack); - this.tx_hash = new TXHashPrefixRow(this,this.operationStack); - this.tx_num = new TXNumPrefixRow(this,this.operationStack); - this.tx = new TXPrefixRow(this,this.operationStack); - this.header = new BlockHeaderPrefixRow(this,this.operationStack); - this.touched_or_deleted = new TouchedOrDeletedPrefixRow(this,this.operationStack); - this.channel_count = new ChannelCountPrefixRow(this,this.operationStack); - this.db_state = new DBStatePrefixRow(this,this.operationStack); - this.support_amount = new SupportAmountPrefixRow(this,this.operationStack); - this.block_txs = new BlockTxsPrefixRow(this,this.operationStack); - this.mempool_tx = new MempoolTXPrefixRow(this,this.operationStack); - this.trending_notification = new TrendingNotificationPrefixRow(this,this.operationStack); - this.touched_hashX = new TouchedHashXPrefixRow(this,this.operationStack); - this.hashX_status = new HashXStatusPrefixRow(this,this.operationStack); - this.hashX_mempool_status = new HashXMempoolStatusPrefixRow(this,this.operationStack); - this.effective_amount = new EffectiveAmountPrefixRow(this,this.operationStack); - this.future_effective_amount = new FutureEffectiveAmountPrefixRow(this,this.operationStack); - this.hashX_history_hasher = new HashXHistoryHasherPrefixRow(this,this.operationStack); - } - - /** - * Write staged changes to the database without keeping undo information. Changes written cannot be undone. - */ - public void unsafeCommit() throws RocksDBException{ - this.applyStash(); - WriteOptions writeOptions = new WriteOptions().setSync(true); - try{ - if(this.operationStack.length()!=0){ - return; - } - WriteBatch batch = new WriteBatch(); - for(RevertibleOperation stagedChange : this.operationStack.iterate()){ - ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); - if(!stagedChange.isDelete()){ - batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); - }else{ - batch.delete(columnFamily,stagedChange.getKey()); - } - this.database.write(writeOptions,batch); - } - }finally{ - writeOptions.close(); - this.operationStack.clear(); - } - } - - public void commit(int height,byte[] blockHash) throws RocksDBException{ - this.applyStash(); - byte[] undoOperations = this.operationStack.getUndoOperations(); - List deleteUndos = new ArrayList<>(); - if(height>this.maxUndoDepth){ - byte[] upperBound = ByteBuffer.allocate(1+8).order(ByteOrder.BIG_ENDIAN).put(Prefix.UNDO.getValue()).putLong(height-this.maxUndoDepth).array(); - RocksIterator iterator = this.database.newIterator(new ReadOptions().setIterateUpperBound(new Slice(upperBound))); - iterator.seek(ByteBuffer.allocate(1+8).order(ByteOrder.BIG_ENDIAN).put(Prefix.UNDO.getValue()).array()); - while(iterator.isValid()){ - deleteUndos.add(iterator.key()); - iterator.next(); - } - } - try{ - ColumnFamilyHandle undoColumnFamily = this.getColumnFamilyByPrefix(Prefix.UNDO); - WriteOptions writeOptions = new WriteOptions().setSync(true); - try{ - WriteBatch batch = new WriteBatch(); - for(RevertibleOperation stagedChange : this.operationStack.iterate()){ - ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); - if(!stagedChange.isDelete()){ - batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); - }else{ - batch.delete(columnFamily,stagedChange.getKey()); - } - - } - for(byte[] undoToDelete : deleteUndos){ - batch.delete(undoColumnFamily,undoToDelete); - } - UndoKey undoKey = new UndoKey(); - undoKey.height = height; - undoKey.block_hash = blockHash; - byte[] undoKeyBytes = this.undo.packKey(undoKey); - batch.put(undoColumnFamily,undoKeyBytes,undoOperations); - this.database.write(writeOptions,batch); - }finally{ - writeOptions.close(); - this.operationStack.clear(); - } - }finally{ - this.operationStack.clear(); - } - } - - public void rollback(int height,byte[] blockHash) throws RocksDBException{ - UndoKey undoKey = new UndoKey(); - undoKey.height = height; - undoKey.block_hash = blockHash; - byte[] undoKeyBytes = this.undo.packKey(undoKey); - ColumnFamilyHandle undoColumnFamily = this.getColumnFamilyByPrefix(Prefix.UNDO); - byte[] undoInfo = this.database.get(undoColumnFamily,undoKeyBytes); - this.operationStack.applyPackedUndoOperations(undoInfo); - this.operationStack.validateAndApplyStashedOperations(); - WriteOptions writeOptions = new WriteOptions().setSync(true); - try{ - WriteBatch batch = new WriteBatch(); - for(RevertibleOperation stagedChange : this.operationStack.iterate()){ - ColumnFamilyHandle columnFamily = this.getColumnFamilyByPrefix(Prefix.getByValue(stagedChange.getKey()[0])); - if(!stagedChange.isDelete()){ - batch.put(columnFamily,stagedChange.getKey(),stagedChange.getValue()); - }else{ - batch.delete(columnFamily,stagedChange.getKey()); - } - this.database.write(writeOptions,batch); - } - // batch.delete(undoKey) - }finally{ - writeOptions.close(); - this.operationStack.clear(); - } - } - - public void applyStash(){ - this.operationStack.validateAndApplyStashedOperations(); - } - - /** - * Get value by prefixed key. - * @param key The prefixed key. - * @return The value or null. - * @throws RocksDBException The exception. - */ - public byte[] get(byte[] key) throws RocksDBException{ - return this.get(key,true); - } - - /** - * Get value by prefixed key. - * @param key The prefixed key. - * @param fillCache Fill cache option. - * @return The value or null. - * @throws RocksDBException The exception. - */ - public byte[] get(byte[] key,boolean fillCache) throws RocksDBException{ - ColumnFamilyHandle columnFamily = null; - for(ColumnFamilyHandle handle : this.columnFamilyHandles){ - if(key.length>0 && Arrays.equals(handle.getName(),new byte[]{key[0]})){ - columnFamily = handle; - break; - } - } - ReadOptions options = new ReadOptions().setFillCache(fillCache); - byte[] value = this.database.get(columnFamily,options,key); - options.close(); - return value; - } - - /** - * Get multiple values by prefixed keys. - * @param keys The prefixed keys. - * @return The values. - * @throws RocksDBException The exception. - */ - public List multiGet(List keys) throws RocksDBException{ - return this.multiGet(keys,true); - } - - /** - * Get multiple values by prefixed keys. - * @param keys The prefixed keys. - * @param fillCache Fill cache option. - * @return The values. - * @throws RocksDBException The exception. - */ - public List multiGet(List keys,boolean fillCache) throws RocksDBException{ - List columnFamilies = new ArrayList<>(); - for(byte[] key : keys){ - for(ColumnFamilyHandle handle : this.columnFamilyHandles){ - if(Arrays.equals(handle.getName(),new byte[]{key[0]})){ - columnFamilies.add(handle); - break; - } - } - } - ReadOptions options = new ReadOptions().setFillCache(fillCache); - List values = this.database.multiGetAsList(options,columnFamilies,keys); - options.close(); - return values; - } - - /** - * Stash multiple items for deletion. - * @param items The items. - */ - public void multiDelete(Map items){ - this.operationStack.stashOperations(items.entrySet().stream().map((entry) -> new RevertibleDelete(entry.getKey(),entry.getValue())).toArray(RevertibleOperation[]::new)); - } - - /** - * Stash multiple items for putting. - * @param items The items. - */ - public void multiPut(Map items){ - this.operationStack.stashOperations(items.entrySet().stream().map((entry) -> new RevertiblePut(entry.getKey(),entry.getValue())).toArray(RevertibleOperation[]::new)); - } - - public RocksIterator iterator(){ - return this.iterator(null,null); - } - - public RocksIterator iterator(ReadOptions readOptions){ - return this.iterator(null,readOptions); - } - - public RocksIterator iterator(ColumnFamilyHandle columnFamily){ - return this.iterator(columnFamily,null); - } - - public RocksIterator iterator(ColumnFamilyHandle columnFamily,ReadOptions readOptions){ - if(columnFamily==null && readOptions==null){ - return this.database.newIterator(); - } - if(columnFamily==null){ - return this.database.newIterator(readOptions); - } - if(readOptions==null){ - return this.database.newIterator(columnFamily); - } - return this.database.newIterator(columnFamily,readOptions); - } - - /** - * Close database. - */ - public void close(){ - this.database.close(); - } - - public void tryCatchUpWithPrimary() throws RocksDBException{ - this.database.tryCatchUpWithPrimary(); - } - - /** - * Stash item for deletion. - * @param key The item prefixed key. - * @param value The value. - */ - public void stashRawDelete(byte[] key,byte[] value){ - this.operationStack.stashOperations(new RevertibleOperation[]{ - new RevertibleDelete(key,value), - }); - } - - /** - * Stash item for putting. - * @param key The item prefixed key. - * @param value The value. - */ - public void stashRawPut(byte[] key,byte[] value){ - this.operationStack.stashOperations(new RevertibleOperation[]{ - new RevertiblePut(key,value), - }); - } - - public int estimateNumKeys() throws RocksDBException{ - return this.estimateNumKeys(null); - } - - public int estimateNumKeys(ColumnFamilyHandle columnFamily) throws RocksDBException{ - return Integer.parseInt(this.database.getProperty(columnFamily,"rocksdb.estimate-num-keys")); - } - - public boolean keyMayExist(byte[] key) throws RocksDBException{ - ColumnFamilyHandle columnFamily = null; - for(ColumnFamilyHandle handle : this.columnFamilyHandles){ - if(key.length>0 && Arrays.equals(handle.getName(),new byte[]{key[0]})){ - columnFamily = handle; - break; - } - } - return this.database.keyMayExist(columnFamily,ByteBuffer.wrap(key)); - } - - public ColumnFamilyHandle getColumnFamilyByPrefix(Prefix prefix) throws RocksDBException{ - if(prefix==null){ - return this.database.getDefaultColumnFamily(); - } - for(ColumnFamilyHandle columnFamily : this.columnFamilyHandles){ - if(Arrays.equals(columnFamily.getName(),new byte[]{prefix.getValue()})){ - return columnFamily; - } - } - return null; + this.claim_to_support = new ClaimToSupportPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.support_to_claim = new SupportToClaimPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.claim_to_txo = new ClaimToTXOPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.txo_to_claim = new TXOToClaimPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.claim_to_channel = new ClaimToChannelPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.channel_to_claim = new ChannelToClaimPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.claim_short_id = new ClaimShortIDPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.claim_expiration = new ClaimExpirationPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.claim_takeover = new ClaimTakeoverPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.pending_activation = new PendingActivationPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.activated = new ActivatedPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.active_amount = new ActiveAmountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.bid_order = new BidOrderPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.repost = new RepostPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.reposted_claim = new RepostedPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.reposted_count = new RepostedCountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.undo = new UndoPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.utxo = new UTXOPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.hashX_utxo = new HashXUTXOPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.hashX_history = new HashXHistoryPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.block_hash = new BlockHashPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.tx_count = new TxCountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.tx_hash = new TXHashPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.tx_num = new TXNumPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.tx = new TXPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.header = new BlockHeaderPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.touched_or_deleted = new TouchedOrDeletedPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.channel_count = new ChannelCountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.db_state = new DBStatePrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.support_amount = new SupportAmountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.block_txs = new BlockTxsPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.mempool_tx = new MempoolTXPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.trending_notification = new TrendingNotificationPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.touched_hashX = new TouchedHashXPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.hashX_status = new HashXStatusPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.hashX_mempool_status = new HashXMempoolStatusPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.effective_amount = new EffectiveAmountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.future_effective_amount = new FutureEffectiveAmountPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); + this.hashX_history_hasher = new HashXHistoryHasherPrefixRow(this.database,this.operationStack,this.getColumnFamilyHandles()); } } \ No newline at end of file diff --git a/src/main/java/com/lbry/database/rows/ActivatedPrefixRow.java b/src/main/java/com/lbry/database/rows/ActivatedPrefixRow.java index 268b0a0..3c17c10 100644 --- a/src/main/java/com/lbry/database/rows/ActivatedPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ActivatedPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ActivationKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ActivationValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ActivatedPrefixRow extends PrefixRow{ - public ActivatedPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ActivatedPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ActiveAmountPrefixRow.java b/src/main/java/com/lbry/database/rows/ActiveAmountPrefixRow.java index a385e1d..9ea4aed 100644 --- a/src/main/java/com/lbry/database/rows/ActiveAmountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ActiveAmountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ActiveAmountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ActiveAmountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ActiveAmountPrefixRow extends PrefixRow{ - public ActiveAmountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ActiveAmountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/BidOrderPrefixRow.java b/src/main/java/com/lbry/database/rows/BidOrderPrefixRow.java index fb229ed..9a98119 100644 --- a/src/main/java/com/lbry/database/rows/BidOrderPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/BidOrderPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.BidOrderKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.BidOrderValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class BidOrderPrefixRow extends PrefixRow{ - public BidOrderPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public BidOrderPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/BlockHashPrefixRow.java b/src/main/java/com/lbry/database/rows/BlockHashPrefixRow.java index cc4060a..2a2519f 100644 --- a/src/main/java/com/lbry/database/rows/BlockHashPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/BlockHashPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.BlockHashKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.BlockHashValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class BlockHashPrefixRow extends PrefixRow{ - public BlockHashPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public BlockHashPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/BlockHeaderPrefixRow.java b/src/main/java/com/lbry/database/rows/BlockHeaderPrefixRow.java index 2e3bd87..9a8dcd6 100644 --- a/src/main/java/com/lbry/database/rows/BlockHeaderPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/BlockHeaderPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.BlockHeaderKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.BlockHeaderValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class BlockHeaderPrefixRow extends PrefixRow{ - public BlockHeaderPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public BlockHeaderPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/BlockTxsPrefixRow.java b/src/main/java/com/lbry/database/rows/BlockTxsPrefixRow.java index a0eb5f2..4c25c03 100644 --- a/src/main/java/com/lbry/database/rows/BlockTxsPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/BlockTxsPrefixRow.java @@ -5,15 +5,18 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.BlockTxsKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.BlockTxsValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; +import java.util.List; public class BlockTxsPrefixRow extends PrefixRow{ - public BlockTxsPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public BlockTxsPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ChannelCountPrefixRow.java b/src/main/java/com/lbry/database/rows/ChannelCountPrefixRow.java index 4809d14..d7a9014 100644 --- a/src/main/java/com/lbry/database/rows/ChannelCountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ChannelCountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ChannelCountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ChannelCountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ChannelCountPrefixRow extends PrefixRow{ - public ChannelCountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ChannelCountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ChannelToClaimPrefixRow.java b/src/main/java/com/lbry/database/rows/ChannelToClaimPrefixRow.java index d76222d..ff8b77e 100644 --- a/src/main/java/com/lbry/database/rows/ChannelToClaimPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ChannelToClaimPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ChannelToClaimKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ChannelToClaimValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ChannelToClaimPrefixRow extends PrefixRow{ - public ChannelToClaimPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ChannelToClaimPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimExpirationPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimExpirationPrefixRow.java index db37319..d5dd750 100644 --- a/src/main/java/com/lbry/database/rows/ClaimExpirationPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimExpirationPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimExpirationKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimExpirationValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimExpirationPrefixRow extends PrefixRow{ - public ClaimExpirationPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimExpirationPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimShortIDPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimShortIDPrefixRow.java index 8e9e39a..f8ec900 100644 --- a/src/main/java/com/lbry/database/rows/ClaimShortIDPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimShortIDPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimShortIDKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimShortIDValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimShortIDPrefixRow extends PrefixRow{ - public ClaimShortIDPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimShortIDPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimTakeoverPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimTakeoverPrefixRow.java index 9ad0da5..04375b6 100644 --- a/src/main/java/com/lbry/database/rows/ClaimTakeoverPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimTakeoverPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimTakeoverKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimTakeoverValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimTakeoverPrefixRow extends PrefixRow{ - public ClaimTakeoverPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimTakeoverPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimToChannelPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimToChannelPrefixRow.java index 9e3dc77..cdca96e 100644 --- a/src/main/java/com/lbry/database/rows/ClaimToChannelPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimToChannelPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimToChannelKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimToChannelValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimToChannelPrefixRow extends PrefixRow{ - public ClaimToChannelPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimToChannelPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimToSupportPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimToSupportPrefixRow.java index bf266aa..db076b5 100644 --- a/src/main/java/com/lbry/database/rows/ClaimToSupportPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimToSupportPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimToSupportKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimToSupportValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimToSupportPrefixRow extends PrefixRow{ - public ClaimToSupportPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimToSupportPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/ClaimToTXOPrefixRow.java b/src/main/java/com/lbry/database/rows/ClaimToTXOPrefixRow.java index 7c398ec..e64b4dc 100644 --- a/src/main/java/com/lbry/database/rows/ClaimToTXOPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/ClaimToTXOPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.ClaimToTXOKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.ClaimToTXOValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class ClaimToTXOPrefixRow extends PrefixRow{ - public ClaimToTXOPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public ClaimToTXOPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/DBStatePrefixRow.java b/src/main/java/com/lbry/database/rows/DBStatePrefixRow.java index 9d6cf34..809ace2 100644 --- a/src/main/java/com/lbry/database/rows/DBStatePrefixRow.java +++ b/src/main/java/com/lbry/database/rows/DBStatePrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.KeyInterface; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.DBState; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class DBStatePrefixRow extends PrefixRow{ - public DBStatePrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public DBStatePrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/EffectiveAmountPrefixRow.java b/src/main/java/com/lbry/database/rows/EffectiveAmountPrefixRow.java index 162de66..da379c3 100644 --- a/src/main/java/com/lbry/database/rows/EffectiveAmountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/EffectiveAmountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.EffectiveAmountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.EffectiveAmountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class EffectiveAmountPrefixRow extends PrefixRow{ - public EffectiveAmountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public EffectiveAmountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/FutureEffectiveAmountPrefixRow.java b/src/main/java/com/lbry/database/rows/FutureEffectiveAmountPrefixRow.java index c91ac15..17694ca 100644 --- a/src/main/java/com/lbry/database/rows/FutureEffectiveAmountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/FutureEffectiveAmountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.FutureEffectiveAmountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.FutureEffectiveAmountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class FutureEffectiveAmountPrefixRow extends PrefixRow{ - public FutureEffectiveAmountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public FutureEffectiveAmountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/HashXHistoryHasherPrefixRow.java b/src/main/java/com/lbry/database/rows/HashXHistoryHasherPrefixRow.java index 1f97f4c..d06b5df 100644 --- a/src/main/java/com/lbry/database/rows/HashXHistoryHasherPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/HashXHistoryHasherPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.HashXHistoryHasherKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.HashXHistoryHasherValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class HashXHistoryHasherPrefixRow extends PrefixRow{ - public HashXHistoryHasherPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public HashXHistoryHasherPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/HashXHistoryPrefixRow.java b/src/main/java/com/lbry/database/rows/HashXHistoryPrefixRow.java index 4984048..62529ad 100644 --- a/src/main/java/com/lbry/database/rows/HashXHistoryPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/HashXHistoryPrefixRow.java @@ -5,15 +5,18 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.HashXHistoryKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.HashXHistoryValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; +import java.util.List; public class HashXHistoryPrefixRow extends PrefixRow{ - public HashXHistoryPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public HashXHistoryPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/HashXMempoolStatusPrefixRow.java b/src/main/java/com/lbry/database/rows/HashXMempoolStatusPrefixRow.java index 339f98f..014e795 100644 --- a/src/main/java/com/lbry/database/rows/HashXMempoolStatusPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/HashXMempoolStatusPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.HashXStatusKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.HashXStatusValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class HashXMempoolStatusPrefixRow extends PrefixRow{ - public HashXMempoolStatusPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public HashXMempoolStatusPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/HashXStatusPrefixRow.java b/src/main/java/com/lbry/database/rows/HashXStatusPrefixRow.java index 8445680..2caa3b8 100644 --- a/src/main/java/com/lbry/database/rows/HashXStatusPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/HashXStatusPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.HashXStatusKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.HashXStatusValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class HashXStatusPrefixRow extends PrefixRow{ - public HashXStatusPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public HashXStatusPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/HashXUTXOPrefixRow.java b/src/main/java/com/lbry/database/rows/HashXUTXOPrefixRow.java index 3bd57fb..4b30ca6 100644 --- a/src/main/java/com/lbry/database/rows/HashXUTXOPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/HashXUTXOPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.HashXUTXOKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.HashXUTXOValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class HashXUTXOPrefixRow extends PrefixRow{ - public HashXUTXOPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public HashXUTXOPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/MempoolTXPrefixRow.java b/src/main/java/com/lbry/database/rows/MempoolTXPrefixRow.java index d126af2..7ab3947 100644 --- a/src/main/java/com/lbry/database/rows/MempoolTXPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/MempoolTXPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.MempoolTxKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.MempoolTxValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class MempoolTXPrefixRow extends PrefixRow{ - public MempoolTXPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public MempoolTXPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/PendingActivationPrefixRow.java b/src/main/java/com/lbry/database/rows/PendingActivationPrefixRow.java index 6f941bf..5158655 100644 --- a/src/main/java/com/lbry/database/rows/PendingActivationPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/PendingActivationPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.PendingActivationKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.PendingActivationValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class PendingActivationPrefixRow extends PrefixRow{ - public PendingActivationPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public PendingActivationPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/PrefixRow.java b/src/main/java/com/lbry/database/rows/PrefixRow.java index f6b394f..c16eadc 100644 --- a/src/main/java/com/lbry/database/rows/PrefixRow.java +++ b/src/main/java/com/lbry/database/rows/PrefixRow.java @@ -3,15 +3,20 @@ package com.lbry.database.rows; import com.lbry.database.Prefix; import com.lbry.database.PrefixDB; import com.lbry.database.keys.KeyInterface; +import com.lbry.database.revert.RevertibleDelete; import com.lbry.database.revert.RevertibleOperation; import com.lbry.database.revert.RevertibleOperationStack; +import com.lbry.database.revert.RevertiblePut; +import com.lbry.database.util.Tuple2; import com.lbry.database.values.ValueInterface; +import java.nio.ByteBuffer; import java.util.*; import java.util.stream.Collectors; import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.ReadOptions; +import org.rocksdb.RocksDB; import org.rocksdb.RocksDBException; import org.rocksdb.RocksIterator; @@ -19,21 +24,34 @@ public abstract class PrefixRow public static final Map> TYPES = new HashMap<>(); - private final PrefixDB database; + private final RocksDB database; private final RevertibleOperationStack operationStack; + private final ColumnFamilyHandle columnFamily; - public PrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ + public PrefixRow(RocksDB database, RevertibleOperationStack operationStack,List columnFamilyHandles){ this.database = database; this.operationStack = operationStack; + this.columnFamily = columnFamilyHandles==null?null:columnFamilyHandles.stream().filter(x -> { + try { + return Arrays.equals(x.getName(),new byte[]{this.prefix().getValue()}); + } catch (RocksDBException e) { + return false; + } + + }).findFirst().orElse(null); + PrefixRow.TYPES.put(this.prefix(),this); } + public abstract Prefix prefix(); + public RocksIterator iterate() throws RocksDBException{ return this.iterate(null); } + //TODO public RocksIterator iterate(ReadOptions readOptions) throws RocksDBException{ - return this.database.iterator(this.getColumnFamily(),readOptions); + return this.database.newIterator(this.columnFamily,readOptions); } public Object get(K key) throws RocksDBException{ @@ -45,95 +63,106 @@ public abstract class PrefixRow } public Object get(K key,boolean fillCache,boolean deserializeValue) throws RocksDBException { - byte[] v = this.database.get(this.packKey(key),fillCache); + ReadOptions readOptions = new ReadOptions().setFillCache(fillCache); + byte[] v = this.database.get(this.columnFamily,readOptions,this.packKey(key)); + readOptions.close(); if(v!=null){ - if(deserializeValue){ - return this.unpackValue(v); - } - return v; + return !deserializeValue?v:this.unpackValue(v); } return null; } public boolean keyExists(K key) throws RocksDBException{ - boolean keyMayExist = this.database.keyMayExist(this.packKey(key)); + boolean keyMayExist = this.database.keyMayExist(this.columnFamily,this.packKey(key),null); if(!keyMayExist){ return false; } - return this.database.get(this.packKey(key),true)!=null; + ReadOptions readOptions = new ReadOptions().setFillCache(true); + boolean ret = this.database.get(readOptions,this.packKey(key))!=null; + readOptions.close(); + return ret; } - public List multiGet(List keys,boolean fillCache,boolean deserializeValue) throws RocksDBException{ - List result = this.database.multiGet(keys.stream().map(this::packKey).collect(Collectors.toList()),fillCache); - return result.stream().map(v -> { - if(v!=null){ - if(deserializeValue){ - return this.unpackValue(v); - } - return v; - } - return null; - }).collect(Collectors.toList()); + public List multiGet(List keys, boolean fillCache, boolean deserializeValue) throws RocksDBException{ + List packedKeys = new ArrayList<>(); + for(K key : keys){ + packedKeys.add(this.packKey(key)); + } + ReadOptions readOptions = new ReadOptions().setFillCache(fillCache); + List result = this.database.multiGetAsList(readOptions,Collections.singletonList(this.columnFamily),packedKeys); + readOptions.close(); + + List ret = new ArrayList<>(); + for(int i=0;i items){ - Map map = new LinkedHashMap<>(); + RevertibleOperation[] revertibleOperationArray = new RevertibleOperation[items.size()]; + int i = 0; for(Map.Entry entry : items.entrySet()){ - map.put(this.packKey(entry.getKey()),this.packValue(entry.getValue())); + revertibleOperationArray[i] = new RevertiblePut(this.packKey(entry.getKey()),this.packValue(entry.getValue())); + i++; } - this.database.multiPut(map); + this.operationStack.stashOperations(revertibleOperationArray); } public void stashMultiDelete(Map items){ - Map map = new LinkedHashMap<>(); + RevertibleOperation[] revertibleOperationArray = new RevertibleOperation[items.size()]; + int i = 0; for(Map.Entry entry : items.entrySet()){ - map.put(this.packKey(entry.getKey()),this.packValue(entry.getValue())); + revertibleOperationArray[i] = new RevertibleDelete(this.packKey(entry.getKey()),this.packValue(entry.getValue())); + i++; } - this.database.multiDelete(map); + this.operationStack.stashOperations(revertibleOperationArray); } - public V getPending(K key){ + public Object getPending(K key) throws RocksDBException { return this.getPending(key,true); } - public V getPending(K key,boolean fillCache){ - return this.getPending(key,fillCache,true); + public Object getPending(K key,boolean fillCache) throws RocksDBException { + return this.getPending(key,true,true); } - public V getPending(K key,boolean fillCache,boolean deserializeValue){ -// byte[] packedKey = this.packKey(key); -// Optional pendingOperation = this.operationStack.getPendingOperation(packedKey); -// if(pendingOperation.isPresent() && pendingOperation.get().isDelete()){ -// return null; -// } -// byte[] v; -// if(pendingOperation.isPresent()){ -// v = pendingOperation.get().getValue(); -// }else{ -// v = this.database.get(this.getColumnFamily(),fillCache); -// } - return null; + public Object getPending(K key,boolean fillCache,boolean deserializeValue) throws RocksDBException{ + byte[] packedKey = this.packKey(key); + Optional pendingOperation = this.operationStack.getPendingOperation(packedKey); + if(pendingOperation.isPresent() && pendingOperation.get().isDelete()){ + return null; + } + byte[] v; + if(pendingOperation.isPresent()){ + v = pendingOperation.get().getValue(); + }else{ + ReadOptions readOptions = new ReadOptions().setFillCache(fillCache); + v = this.database.get(this.columnFamily,readOptions,packedKey); + readOptions.close(); + } + return v==null?null:(!deserializeValue?v:this.unpackValue(v)); } - //TODO getPending - public void stashPut(K key,V value){ - this.database.stashRawPut(this.packKey(key),this.packValue(value)); + this.operationStack.stashOperations(new RevertibleOperation[]{ + new RevertiblePut(this.packKey(key),this.packValue(value)), + }); } - public void stashDelete(K key,V value){ - this.database.stashRawDelete(this.packKey(key),this.packValue(value)); + this.operationStack.stashOperations(new RevertibleOperation[]{ + new RevertibleDelete(this.packKey(key),this.packValue(value)), + }); } - public ColumnFamilyHandle getColumnFamily() throws RocksDBException{ - return this.database.getColumnFamilyByPrefix(this.prefix()); + public byte[] packPartialKey(){ + return ByteBuffer.allocate(1).put(this.prefix().getValue())/*TODO More key parts.*/.array(); } - public abstract Prefix prefix(); - public abstract byte[] packKey(K key); public abstract byte[] packValue(V value); @@ -142,4 +171,12 @@ public abstract class PrefixRow public abstract V unpackValue(byte[] value); + public Tuple2 unpackItem(byte[] key,byte[] value){ + return new Tuple2<>(this.unpackKey(key),this.unpackValue(value)); + } + + public int estimateNumKeys() throws RocksDBException{ + return Integer.parseInt(this.database.getProperty(this.columnFamily,"rocksdb.estimate-num-keys")); + } + } diff --git a/src/main/java/com/lbry/database/rows/RepostPrefixRow.java b/src/main/java/com/lbry/database/rows/RepostPrefixRow.java index ee4ce25..b8ef223 100644 --- a/src/main/java/com/lbry/database/rows/RepostPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/RepostPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.RepostKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.RepostValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class RepostPrefixRow extends PrefixRow{ - public RepostPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public RepostPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/RepostedCountPrefixRow.java b/src/main/java/com/lbry/database/rows/RepostedCountPrefixRow.java index 9c13775..165f64f 100644 --- a/src/main/java/com/lbry/database/rows/RepostedCountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/RepostedCountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.RepostedCountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.RepostedCountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class RepostedCountPrefixRow extends PrefixRow{ - public RepostedCountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public RepostedCountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/RepostedPrefixRow.java b/src/main/java/com/lbry/database/rows/RepostedPrefixRow.java index 780c046..330ffea 100644 --- a/src/main/java/com/lbry/database/rows/RepostedPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/RepostedPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.RepostedKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.RepostedValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class RepostedPrefixRow extends PrefixRow{ - public RepostedPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public RepostedPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/SupportAmountPrefixRow.java b/src/main/java/com/lbry/database/rows/SupportAmountPrefixRow.java index b74539b..08b4d0c 100644 --- a/src/main/java/com/lbry/database/rows/SupportAmountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/SupportAmountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.SupportAmountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.SupportAmountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class SupportAmountPrefixRow extends PrefixRow{ - public SupportAmountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public SupportAmountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/SupportToClaimPrefixRow.java b/src/main/java/com/lbry/database/rows/SupportToClaimPrefixRow.java index 1fc9f81..0b225c1 100644 --- a/src/main/java/com/lbry/database/rows/SupportToClaimPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/SupportToClaimPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.SupportToClaimKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.SupportToClaimValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class SupportToClaimPrefixRow extends PrefixRow{ - public SupportToClaimPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public SupportToClaimPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TXHashPrefixRow.java b/src/main/java/com/lbry/database/rows/TXHashPrefixRow.java index bfea80e..e504a8c 100644 --- a/src/main/java/com/lbry/database/rows/TXHashPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TXHashPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TxHashKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TxHashValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TXHashPrefixRow extends PrefixRow{ - public TXHashPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TXHashPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TXNumPrefixRow.java b/src/main/java/com/lbry/database/rows/TXNumPrefixRow.java index b9ff926..12ba092 100644 --- a/src/main/java/com/lbry/database/rows/TXNumPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TXNumPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TxNumKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TxNumValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TXNumPrefixRow extends PrefixRow{ - public TXNumPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TXNumPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TXOToClaimPrefixRow.java b/src/main/java/com/lbry/database/rows/TXOToClaimPrefixRow.java index 63ca7a5..ce601ca 100644 --- a/src/main/java/com/lbry/database/rows/TXOToClaimPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TXOToClaimPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TXOToClaimKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TXOToClaimValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TXOToClaimPrefixRow extends PrefixRow{ - public TXOToClaimPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TXOToClaimPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TXPrefixRow.java b/src/main/java/com/lbry/database/rows/TXPrefixRow.java index 3cfc0bc..55f4e1c 100644 --- a/src/main/java/com/lbry/database/rows/TXPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TXPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TxKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TxValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TXPrefixRow extends PrefixRow{ - public TXPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TXPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TouchedHashXPrefixRow.java b/src/main/java/com/lbry/database/rows/TouchedHashXPrefixRow.java index 8ee9466..0b1e434 100644 --- a/src/main/java/com/lbry/database/rows/TouchedHashXPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TouchedHashXPrefixRow.java @@ -5,15 +5,18 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TouchedHashXKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TouchedHashXValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; +import java.util.List; public class TouchedHashXPrefixRow extends PrefixRow{ - public TouchedHashXPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TouchedHashXPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TouchedOrDeletedPrefixRow.java b/src/main/java/com/lbry/database/rows/TouchedOrDeletedPrefixRow.java index a572cb9..3d06a81 100644 --- a/src/main/java/com/lbry/database/rows/TouchedOrDeletedPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TouchedOrDeletedPrefixRow.java @@ -5,15 +5,18 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TouchedOrDeletedClaimKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TouchedOrDeletedClaimValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.LinkedHashSet; +import java.util.List; public class TouchedOrDeletedPrefixRow extends PrefixRow{ - public TouchedOrDeletedPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TouchedOrDeletedPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TrendingNotificationPrefixRow.java b/src/main/java/com/lbry/database/rows/TrendingNotificationPrefixRow.java index 4a94745..e962b00 100644 --- a/src/main/java/com/lbry/database/rows/TrendingNotificationPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TrendingNotificationPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TrendingNotificationKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TrendingNotificationValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TrendingNotificationPrefixRow extends PrefixRow{ - public TrendingNotificationPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TrendingNotificationPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/TxCountPrefixRow.java b/src/main/java/com/lbry/database/rows/TxCountPrefixRow.java index d8ad7c8..fcbbe55 100644 --- a/src/main/java/com/lbry/database/rows/TxCountPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/TxCountPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.TxCountKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.TxCountValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class TxCountPrefixRow extends PrefixRow{ - public TxCountPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public TxCountPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/UTXOPrefixRow.java b/src/main/java/com/lbry/database/rows/UTXOPrefixRow.java index e8af9c5..8b7a60b 100644 --- a/src/main/java/com/lbry/database/rows/UTXOPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/UTXOPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.UTXOKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.UTXOValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class UTXOPrefixRow extends PrefixRow{ - public UTXOPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public UTXOPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/main/java/com/lbry/database/rows/UndoPrefixRow.java b/src/main/java/com/lbry/database/rows/UndoPrefixRow.java index 8bba311..c236edd 100644 --- a/src/main/java/com/lbry/database/rows/UndoPrefixRow.java +++ b/src/main/java/com/lbry/database/rows/UndoPrefixRow.java @@ -5,14 +5,17 @@ import com.lbry.database.PrefixDB; import com.lbry.database.keys.UndoKey; import com.lbry.database.revert.RevertibleOperationStack; import com.lbry.database.values.UndoValue; +import org.rocksdb.ColumnFamilyHandle; +import org.rocksdb.RocksDB; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.List; public class UndoPrefixRow extends PrefixRow{ - public UndoPrefixRow(PrefixDB database,RevertibleOperationStack operationStack){ - super(database,operationStack); + public UndoPrefixRow(RocksDB database, RevertibleOperationStack operationStack, List columnFamilyHandleList){ + super(database,operationStack,columnFamilyHandleList); } @Override diff --git a/src/test/java/com/lbry/database/tests/RevertablePrefixDBTest.java b/src/test/java/com/lbry/database/tests/RevertablePrefixDBTest.java index d482b3e..cc5e728 100644 --- a/src/test/java/com/lbry/database/tests/RevertablePrefixDBTest.java +++ b/src/test/java/com/lbry/database/tests/RevertablePrefixDBTest.java @@ -59,9 +59,9 @@ public class RevertablePrefixDBTest{ assertNull(this.database.claim_takeover.get(new ClaimTakeoverKey(){{ this.normalized_name = name; }})); - assertEquals(10000000,this.database.claim_takeover.getPending(new ClaimTakeoverKey(){{ + assertEquals(10000000,((ClaimTakeoverValue)this.database.claim_takeover.getPending(new ClaimTakeoverKey(){{ this.normalized_name = name; - }}).height); + }})).height); ///////////////////// diff --git a/src/test/java/com/lbry/database/tests/RevertibleOperationStackTest.java b/src/test/java/com/lbry/database/tests/RevertibleOperationStackTest.java index 2b628c9..cd8f395 100644 --- a/src/test/java/com/lbry/database/tests/RevertibleOperationStackTest.java +++ b/src/test/java/com/lbry/database/tests/RevertibleOperationStackTest.java @@ -78,11 +78,11 @@ public class RevertibleOperationStackTest { ClaimToTXOKey k1 = new ClaimToTXOKey(); k1.claim_hash = new byte[20]; Arrays.fill(k1.claim_hash,(byte) 0x01); - byte[] key1 = new ClaimToTXOPrefixRow(null,null).packKey(k1); + byte[] key1 = new ClaimToTXOPrefixRow(null,null,null).packKey(k1); ClaimToTXOKey k2 = new ClaimToTXOKey(); k2.claim_hash = new byte[20]; Arrays.fill(k2.claim_hash,(byte) 0x02); - byte[] key2 = new ClaimToTXOPrefixRow(null,null).packKey(k2); + byte[] key2 = new ClaimToTXOPrefixRow(null,null,null).packKey(k2); // ClaimToTXOKey k3 = new ClaimToTXOKey(); // k3.claim_hash = new byte[20]; // Arrays.fill(k3.claim_hash,(byte) 0x03); @@ -100,7 +100,7 @@ public class RevertibleOperationStackTest { v1.amount = 1; v1.channel_signature_is_valid = false; v1.name = "derp"; - byte[] val1 = new ClaimToTXOPrefixRow(null,null).packValue(v1); + byte[] val1 = new ClaimToTXOPrefixRow(null,null,null).packValue(v1); ClaimToTXOValue v2 = new ClaimToTXOValue(); v2.tx_num = 1; v2.position = 0; @@ -109,7 +109,7 @@ public class RevertibleOperationStackTest { v2.amount = 1; v2.channel_signature_is_valid = false; v2.name = "oops"; - byte[] val2 = new ClaimToTXOPrefixRow(null,null).packValue(v2); + byte[] val2 = new ClaimToTXOPrefixRow(null,null,null).packValue(v2); ClaimToTXOValue v3 = new ClaimToTXOValue(); v3.tx_num = 1; v3.position = 0; @@ -118,7 +118,7 @@ public class RevertibleOperationStackTest { v3.amount = 1; v3.channel_signature_is_valid = false; v3.name = "other"; - byte[] val3 = new ClaimToTXOPrefixRow(null,null).packValue(v3); + byte[] val3 = new ClaimToTXOPrefixRow(null,null,null).packValue(v3); // Check that we can't delete a non-existent value. assertThrows(OperationStackIntegrityException.class,() -> this.stack.appendOperation(new RevertibleDelete(key1,val1)));