Do not create ignorable segments on `revert storage-variables` (#5830)

* fix the bug that creates the ignorable chain pruner segment, add rocks exception parsing to RocksDBColumnarKeyValueStorage subclasses
* parse rocksdb error for unprintable column family id's

Signed-off-by: garyschulte <garyschulte@gmail.com>
pull/5843/head
garyschulte 1 year ago committed by GitHub
parent e3b01122f3
commit 8269b57ee3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      CHANGELOG.md
  2. 3
      besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java
  3. 2
      besu/src/main/java/org/hyperledger/besu/cli/subcommands/storage/StorageSubCommand.java
  4. 2
      plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/segmented/OptimisticRocksDBColumnarKeyValueStorage.java
  5. 56
      plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/segmented/RocksDBColumnarKeyValueStorage.java
  6. 2
      plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/segmented/TransactionDBRocksDBColumnarKeyValueStorage.java
  7. 4
      plugins/rocksdb/src/test/java/org/hyperledger/besu/plugin/services/storage/rocksdb/segmented/RocksDBColumnarKeyValueStorageTest.java

@ -1,5 +1,19 @@
# Changelog
## 23.7.3
### Additions and Improvements
### Breaking Changes
- Removed support for Kotti network (ETC) [#5816](https://github.com/hyperledger/besu/pull/5816)
### Additions and Improvements
### Bug Fixes
- do not create ignorable storage on revert storage-variables subcommand [#5830](https://github.com/hyperledger/besu/pull/5830)
### Download Links
## 23.7.2
### Additions and Improvements
@ -30,7 +44,6 @@
### Breaking Changes
- Removed deprecated GoQuorum permissioning interop [#5607](https://github.com/hyperledger/besu/pull/5607)
- Removed support for version 0 of the database as it is no longer used by any active node. [#5698](https://github.com/hyperledger/besu/pull/5698)
- Removed support for Kotti network (ETC) [#5816](https://github.com/hyperledger/besu/pull/5816)
### Additions and Improvements
- `evmtool` launcher binaries now ship as part of the standard distribution. [#5701](https://github.com/hyperledger/besu/pull/5701)

@ -3489,7 +3489,8 @@ public class BesuCommand implements DefaultCommandValues, Runnable {
getActualGenesisConfigOptions().getTerminalTotalDifficulty().isPresent());
}
private void setIgnorableStorageSegments() {
/** Set ignorable segments in RocksDB Storage Provider plugin. */
public void setIgnorableStorageSegments() {
if (!unstableChainPruningOptions.getChainDataPruningEnabled()) {
rocksDBPlugin.addIgnorableSegmentIdentifier(KeyValueSegmentIdentifier.CHAIN_PRUNER_STATE);
}

@ -99,6 +99,8 @@ public class StorageSubCommand implements Runnable {
}
private StorageProvider getStorageProvider() {
// init collection of ignorable segments
parentCommand.parentCommand.setIgnorableStorageSegments();
return parentCommand.parentCommand.getStorageProvider();
}

@ -63,7 +63,7 @@ public class OptimisticRocksDBColumnarKeyValueStorage extends RocksDBColumnarKey
initColumnHandles();
} catch (final RocksDBException e) {
throw new StorageException(e);
throw parseRocksDBException(e, segments, ignorableSegments);
}
}

@ -40,7 +40,10 @@ import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.base.Splitter;
import com.google.common.collect.Streams;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.tuweni.bytes.Bytes;
import org.rocksdb.BlockBasedTableConfig;
import org.rocksdb.BloomFilter;
import org.rocksdb.ColumnFamilyDescriptor;
@ -161,7 +164,52 @@ public abstract class RocksDBColumnarKeyValueStorage implements SegmentedKeyValu
txOptions = new TransactionDBOptions();
columnHandles = new ArrayList<>(columnDescriptors.size());
} catch (RocksDBException e) {
throw new StorageException(e);
throw parseRocksDBException(e, defaultSegments, ignorableSegments);
}
}
/**
* Parse RocksDBException and wrap in StorageException
*
* @param ex RocksDBException
* @param defaultSegments segments requested to open
* @param ignorableSegments segments which are ignorable if not present
* @return StorageException wrapping the RocksDB Exception
*/
protected static StorageException parseRocksDBException(
final RocksDBException ex,
final List<SegmentIdentifier> defaultSegments,
final List<SegmentIdentifier> ignorableSegments) {
String message = ex.getMessage();
List<SegmentIdentifier> knownSegments =
Streams.concat(defaultSegments.stream(), ignorableSegments.stream()).distinct().toList();
// parse out unprintable segment names for a more useful exception:
String columnExceptionMessagePrefix = "Column families not opened: ";
if (message.contains(columnExceptionMessagePrefix)) {
String substring = message.substring(message.indexOf(": ") + 2);
List<String> unHandledSegments = new ArrayList<>();
Splitter.on(", ")
.splitToStream(substring)
.forEach(
part -> {
byte[] bytes = part.getBytes(StandardCharsets.UTF_8);
unHandledSegments.add(
knownSegments.stream()
.filter(seg -> Arrays.equals(seg.getId(), bytes))
.findFirst()
.map(seg -> new SegmentRecord(seg.getName(), seg.getId()))
.orElse(new SegmentRecord(part, bytes))
.forDisplay());
});
return new StorageException(
"RocksDBException: Unhandled column families: ["
+ unHandledSegments.stream().collect(Collectors.joining(", "))
+ "]");
} else {
return new StorageException(ex);
}
}
@ -356,4 +404,10 @@ public abstract class RocksDBColumnarKeyValueStorage implements SegmentedKeyValu
}
abstract RocksDB getDB();
record SegmentRecord(String name, byte[] id) {
public String forDisplay() {
return String.format("'%s'(%s)", name, Bytes.of(id).toHexString());
}
}
}

@ -66,7 +66,7 @@ public class TransactionDBRocksDBColumnarKeyValueStorage extends RocksDBColumnar
initColumnHandles();
} catch (final RocksDBException e) {
throw new StorageException(e);
throw parseRocksDBException(e, segments, ignorableSegments);
}
}

@ -222,7 +222,7 @@ public abstract class RocksDBColumnarKeyValueStorageTest extends AbstractKeyValu
createSegmentedStore(testPath, Arrays.asList(TestSegment.FOO, TestSegment.BAR), List.of());
fail("DB without knowledge of experimental column family should fail");
} catch (StorageException e) {
assertThat(e.getMessage()).contains("Column families not opened");
assertThat(e.getMessage()).contains("Unhandled column families");
}
// Even if the column family is marked as ignored, as long as it exists, it will not be ignored
@ -265,7 +265,7 @@ public abstract class RocksDBColumnarKeyValueStorageTest extends AbstractKeyValu
createSegmentedStore(testPath, Arrays.asList(TestSegment.FOO, TestSegment.BAR), List.of());
fail("DB without knowledge of experimental column family should fail");
} catch (StorageException e) {
assertThat(e.getMessage()).contains("Column families not opened");
assertThat(e.getMessage()).contains("Unhandled column families");
}
}

Loading…
Cancel
Save