tronprotocol / tronprotocol/java-tron

[Bug] RocksDB table option setters are ineffective in 4.8.2.1

Open
#6,939 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

type:bug
Dominant language
Java
Stars
4.2k
Forks
1.7k
Avg merge
6d 20h
Merged PRs (30d)
14

Description

Bug Description

In GreatVoyage-v4.8.2.1, RocksDbSettings.getOptionsByDbName() passes a newly created BlockBasedTableConfig to Options.setTableFormatConfig() before applying the table-level setters.

setTableFormatConfig() creates and attaches the native RocksDB table factory immediately. The subsequent setters only modify the Java BlockBasedTableConfig object and do not update the native table factory that was already created.

Affected code:

https://github.com/tronprotocol/java-tron/blob/f8b05d40abc949fa588ab64d8fd8fd82845ebeed/common/src/main/java/org/tron/common/setting/RocksDbSettings.java#L214-L220

As a result, the configured block size, shared block cache, index/filter caching, L0 index/filter pinning, and Bloom filter are not reflected in native RocksDB. The Java configuration and startup logging therefore suggest behavior that the native database does not use.

Environment

Network

Mainnet

Software Versions

OS: Amazon Linux on AWS c6g.4xlarge (ARM64)
JVM: OpenJDK 17
Git Commit: f8b05d40abc949fa588ab64d8fd8fd82845ebeed
Version: 4.8.2.1
Code: 18825

Configuration

The replay used:

  • A snapshot at block height 83,835,006
  • A 500-block input
  • A gp3 volume limited to 7,500 IOPS
  • The shipped storage.dbSettings.blocksize = 64

The affected release uses RocksDB 9.7.4 on ARM64 and RocksDB 5.15.10 on x86_64.

Expected Behavior

RocksDB table settings exposed through java-tron configuration and applied by RocksDbSettings should be reflected in the native table factory and persisted OPTIONS-* configuration.

Alternatively, settings intentionally retained only for compatibility should be clearly documented as inactive and should not be applied through ineffective setters.

Actual Behavior

The table setters execute after native table-factory creation and do not affect the native OPTIONS-* configuration.

For the tested ARM64 build, the effective native table settings remain:

Native option Effective value
block_size 4 KiB
Block cache RocksDB 9.7.4 internal default, 32 MiB
cache_index_and_filter_blocks false
pin_l0_filter_and_index_blocks_in_cache false
filter_policy nullptr
whole_key_filtering true
block_restart_interval 16

The x86_64 build uses RocksDB 5.15.10, whose internal default block cache is 8 MiB.

In particular:

  • The shipped 64 KiB blocksize does not change the native 4 KiB block_size.
  • The shared 1 GiB cache is not attached.
  • Index/filter caching and L0 pinning remain disabled.
  • The configured 10-bit Bloom filter is not installed.

Changing only the call order is not a safe compatibility fix because it activates several previously inactive settings simultaneously.

In the fixed 500-block replay, the following multi-variable results were observed:

Configuration under test Throughput Change
Pre-change effective native settings 2.421 blocks/s Baseline
Previously inactive settings activated, first run 1.969 blocks/s -18.67%
Previously inactive settings activated, repeat run 1.680 blocks/s -30.61%
Compatibility path restoring effective native settings 2.418 blocks/s -0.12%

The direct-activation runs reached approximately 7,500 IOPS. Average DB Get latency increased from approximately 0.205 ms to 0.325 ms and 0.420 ms.

These are multi-variable results and must not be attributed to any single RocksDB option.

Frequency

  • Always (100%)
  • Frequently (>50%)
  • Sometimes (10-50%)
  • Rarely (<10%)

Steps to Reproduce

  1. Use the RocksDbSettings.getOptionsByDbName() implementation from GreatVoyage-v4.8.2.1.
  2. Open a fresh RocksDB database with the returned Options.
  3. Inspect the generated OPTIONS-* file.
  4. Compare the native table settings with the setters invoked after setTableFormatConfig().

The native configuration contains values such as:

block_size=4096
cache_index_and_filter_blocks=false
pin_l0_filter_and_index_blocks_in_cache=false
filter_policy=nullptr
whole_key_filtering=true
block_restart_interval=16

These values do not reflect the later Java table setters.

Logs and Error Messages

No exception is thrown. The failure is the mismatch between the Java configuration and the native RocksDB OPTIONS-* output.

Additional Context (Optional)

Possible Solution

Preserve the effective behavior used by existing nodes rather than moving setTableFormatConfig() after the setters:

  • Retain blocksize in the configuration and Java API for compatibility, but document that it is not currently applied to native table options.
  • Remove the ineffective table setter sequence without activating those settings.
  • Retain existing effective Options-level settings.
  • Verify the behavior using a fresh temporary database and its native OPTIONS-* file.
  • Evaluate block size, Bloom filters, shared-cache capacity, index/filter caching, and L0 pinning independently before enabling a new table profile.

Acceptance criteria:

  • blocksize and its existing API remain compatible and are documented as inactive.
  • Ineffective table setters are removed without activating them through reordering.
  • A fresh database retains the intended compatibility behavior: 4 KiB blocks, no Bloom filter, and no L0 index/filter pinning.
  • Configuration tests, native Options tests, and Checkstyle pass.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in common/src/main/java/org/tron/common/setting/RocksDbSettings.java at getOptionsByDbName(), focusing on the ordering around setTableFormatConfig() and the table-level setters. Open a fresh temporary RocksDB database and inspect its native OPTIONS-* file against the configured values and compatibility criteria. Verify the relevant configuration tests, native Options tests, and Checkstyle pass.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.