/// <inheritdoc/> public override bool DeleteBlock(HashDigest <SHA256> blockHash) { byte[] key = BlockKey(blockHash); if (!(_blockIndexDb.Get(key) is byte[] blockDbNameByte)) { return(false); } _rwBlockLock.EnterWriteLock(); try { string blockDbName = RocksDBStoreBitConverter.GetString(blockDbNameByte); if (!_blockDbCache.TryGetValue(blockDbName, out RocksDb blockDb)) { blockDb = RocksDBUtils.OpenRocksDb(_options, BlockDbPath(blockDbName)); _blockDbCache.AddOrUpdate(blockDbName, blockDb); } _blockCache.Remove(blockHash); _blockIndexDb.Remove(key); blockDb.Remove(key); return(true); } finally { _rwBlockLock.ExitWriteLock(); } }
/// <inheritdoc/> public override BlockDigest?GetBlockDigest(HashDigest <SHA256> blockHash) { if (_blockCache.TryGetValue(blockHash, out BlockDigest cachedDigest)) { return(cachedDigest); } byte[] key = BlockKey(blockHash); if (!(_blockIndexDb.Get(key) is byte[] blockDbNameBytes)) { return(null); } _rwBlockLock.EnterReadLock(); try { string blockDbName = RocksDBStoreBitConverter.GetString(blockDbNameBytes); if (!_blockDbCache.TryGetValue(blockDbName, out RocksDb blockDb)) { blockDb = RocksDBUtils.OpenRocksDb(_options, BlockDbPath(blockDbName)); _blockDbCache.AddOrUpdate(blockDbName, blockDb); } byte[] blockBytes = blockDb.Get(key); BlockDigest blockDigest = BlockDigest.Deserialize(blockBytes); _blockCache.AddOrUpdate(blockHash, blockDigest); return(blockDigest); } finally { _rwBlockLock.ExitReadLock(); } }
/// <inheritdoc/> public override bool DeleteTransaction(TxId txid) { byte[] key = TxKey(txid); if (!(_txIndexDb.Get(key) is byte[] txDbNameBytes)) { return(false); } _rwTxLock.EnterWriteLock(); try { string txDbName = RocksDBStoreBitConverter.GetString(txDbNameBytes); if (!_txDbCache.TryGetValue(txDbName, out RocksDb txDb)) { txDb = RocksDBUtils.OpenRocksDb(_options, TxDbPath(txDbName)); _txDbCache.AddOrUpdate(txDbName, txDb); } _txCache.Remove(txid); _txIndexDb.Remove(key); txDb.Remove(key); return(true); } finally { _rwTxLock.ExitWriteLock(); } }
/// <inheritdoc/> public override Transaction <T> GetTransaction <T>(TxId txid) { if (_txCache.TryGetValue(txid, out object cachedTx)) { return((Transaction <T>)cachedTx); } byte[] key = TxKey(txid); if (!(_txIndexDb.Get(key) is byte[] txDbNameBytes)) { return(null); } string txDbName = RocksDBStoreBitConverter.GetString(txDbNameBytes); _rwTxLock.EnterReadLock(); try { RocksDb txDb; lock (_txDbCache) { if (!_txDbCache.TryGetValue(txDbName, out txDb)) { txDb = RocksDBUtils.OpenRocksDb(_options, TxDbPath(txDbName)); _txDbCache.AddOrUpdate(txDbName, txDb); } } byte[] txBytes = txDb.Get(key); Transaction <T> tx = Transaction <T> .Deserialize(txBytes, false); _txCache.AddOrUpdate(txid, tx); return(tx); } catch (Exception e) { LogUnexpectedException(nameof(GetTransaction), e); return(null); } finally { _rwTxLock.ExitReadLock(); } }
ListAllStateReferences( Guid chainId, long lowestIndex = 0, long highestIndex = long.MaxValue) { byte[] prefix = StateRefKeyPrefix; var stateRefs = new List <StateRef>(); foreach (Iterator it in IterateDb(_stateRefDb, prefix, chainId)) { byte[] key = it.Key(); int stateKeyLength = key.Length - sizeof(long) - prefix.Length; byte[] stateKeyBytes = key.Skip(prefix.Length).Take(stateKeyLength).ToArray(); string stateKey = RocksDBStoreBitConverter.GetString(stateKeyBytes); byte[] indexBytes = key.Skip(prefix.Length + stateKeyLength).ToArray(); long index = RocksDBStoreBitConverter.ToInt64(indexBytes); if (index < lowestIndex || index > highestIndex) { continue; } var hash = new HashDigest <SHA256>(it.Value()); var stateRef = new StateRef { StateKey = stateKey, BlockHash = hash, BlockIndex = index, }; stateRefs.Add(stateRef); } return(stateRefs .GroupBy(stateRef => stateRef.StateKey) .ToImmutableDictionary( g => g.Key, g => (IImmutableList <HashDigest <SHA256> >)g .Select(r => r.BlockHash).ToImmutableList() )); }
/// <inheritdoc/> public override IEnumerable <string> ListStateKeys(Guid chainId) { byte[] prefix = StateRefKeyPrefix; var prevStateKey = string.Empty; foreach (Iterator it in IterateDb(_stateRefDb, prefix, chainId)) { byte[] key = it.Key(); int stateKeyLength = key.Length - sizeof(long) - prefix.Length; byte[] stateKeyBytes = key.Skip(prefix.Length).Take(stateKeyLength).ToArray(); string stateKey = RocksDBStoreBitConverter.GetString(stateKeyBytes); if (stateKey != prevStateKey) { yield return(stateKey); prevStateKey = stateKey; } } }
/// <inheritdoc cref="BaseStore.DeleteBlock(BlockHash)"/> public override bool DeleteBlock(BlockHash blockHash) { byte[] key = BlockKey(blockHash); if (!(_blockIndexDb.Get(key) is byte[] blockDbNameByte)) { return(false); } _rwBlockLock.EnterWriteLock(); try { string blockDbName = RocksDBStoreBitConverter.GetString(blockDbNameByte); RocksDb blockDb; lock (_blockDbCache) { if (!_blockDbCache.TryGetValue(blockDbName, out blockDb)) { blockDb = RocksDBUtils.OpenRocksDb(_options, BlockDbPath(blockDbName)); _blockDbCache.AddOrUpdate(blockDbName, blockDb); } } _blockCache.Remove(blockHash); _blockIndexDb.Remove(key); blockDb.Remove(key); return(true); } catch (Exception e) { LogUnexpectedException(nameof(DeleteBlock), e); } finally { _rwBlockLock.ExitWriteLock(); } return(false); }