Skip to content

Commit 768eacd

Browse files
fix(toplingdb): harden RocksDB provider fallback
1 parent 49637fc commit 768eacd

3 files changed

Lines changed: 28 additions & 32 deletions

File tree

hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/config/PDConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public class PDConfig {
5858
@Value("${grpc.host}")
5959
private String host;
6060

61-
@Value("${rocksdb.option-path: ''}")
61+
@Value("${rocksdb.option-path:}")
6262
private String optionPath;
6363
@Value("${rocksdb.open-http:false}")
6464
private Boolean openHttp;

hugegraph-rocksdb-provider/src/main/java/org/apache/hugegraph/rocksdb/provider/RocksDBProviderLoader.java

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public class RocksDBProviderLoader {
4141

4242
private final Map<String, RocksDBProvider> providerCache = new ConcurrentHashMap<>();
4343
private volatile boolean loaded = false;
44-
private volatile RocksDBProvider bestProvider = null;
4544

4645
private RocksDBProviderLoader() {
4746
// Private constructor for singleton
@@ -65,7 +64,7 @@ public synchronized void loadProviders() {
6564

6665
for (RocksDBProvider provider : serviceLoader) {
6766
try {
68-
if (provider.isAvailable()) {
67+
if (isProviderAvailable(provider)) {
6968
providerCache.put(provider.getProviderName(), provider);
7069
LOG.info("Loaded RocksDB provider: {} (priority: {})",
7170
provider.getProviderName(), provider.getPriority());
@@ -114,40 +113,28 @@ public RocksDBProvider getBestProvider() {
114113
loadProviders();
115114
}
116115

117-
RocksDBProvider cached = this.bestProvider;
118-
if (cached != null) {
119-
return cached;
120-
}
121-
122116
if (providerCache.isEmpty()) {
123117
throw new RuntimeException("No RocksDB providers available");
124118
}
125119

126-
synchronized (this) {
127-
if (this.bestProvider != null) {
128-
return this.bestProvider;
129-
}
130-
131-
// Find provider with highest priority
132-
RocksDBProvider selected = null;
133-
int highestPriority = Integer.MIN_VALUE;
134-
135-
for (RocksDBProvider provider : providerCache.values()) {
136-
if (provider.isAvailable() && provider.getPriority() > highestPriority) {
137-
selected = provider;
138-
highestPriority = provider.getPriority();
139-
}
140-
}
120+
// Find provider with highest priority
121+
RocksDBProvider bestProvider = null;
122+
int highestPriority = Integer.MIN_VALUE;
141123

142-
if (selected == null) {
143-
throw new RuntimeException("No available RocksDB providers found");
124+
for (RocksDBProvider provider : providerCache.values()) {
125+
if (isProviderAvailable(provider) && provider.getPriority() > highestPriority) {
126+
bestProvider = provider;
127+
highestPriority = provider.getPriority();
144128
}
129+
}
145130

146-
this.bestProvider = selected;
147-
LOG.info("Auto-selected RocksDB provider: {} (priority: {})",
148-
selected.getProviderName(), selected.getPriority());
149-
return selected;
131+
if (bestProvider == null) {
132+
throw new RuntimeException("No available RocksDB providers found");
150133
}
134+
135+
LOG.info("Auto-selected RocksDB provider: {} (priority: {})",
136+
bestProvider.getProviderName(), bestProvider.getPriority());
137+
return bestProvider;
151138
}
152139

153140
/**
@@ -188,7 +175,7 @@ public boolean isProviderAvailable(String providerName) {
188175
}
189176

190177
RocksDBProvider provider = providerCache.get(providerName);
191-
return provider != null && provider.isAvailable();
178+
return provider != null && isProviderAvailable(provider);
192179
}
193180

194181
/**
@@ -197,10 +184,19 @@ public boolean isProviderAvailable(String providerName) {
197184
public synchronized void reload() {
198185
loaded = false;
199186
providerCache.clear();
200-
bestProvider = null;
201187
loadProviders();
202188
}
203189

190+
private boolean isProviderAvailable(RocksDBProvider provider) {
191+
try {
192+
return provider.isAvailable();
193+
} catch (RuntimeException | LinkageError e) {
194+
LOG.warn("Failed to check RocksDB provider availability: {}",
195+
provider.getClass().getName(), e);
196+
return false;
197+
}
198+
}
199+
204200
// Static convenience methods
205201

206202
/**

hugegraph-rocksdb-provider/src/main/java/org/apache/hugegraph/rocksdb/provider/ToplingRocksDBProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ private RocksDB openWithToplingFeaturesAndCF(DBOptions dbOptions, String dataPat
207207
// Prepare column family names for JSON
208208
List<String> cfNames = new java.util.ArrayList<>();
209209
for (ColumnFamilyDescriptor cfDescriptor : cfDescriptors) {
210-
cfNames.add(new String(cfDescriptor.getName()));
210+
cfNames.add(new String(cfDescriptor.getName(), StandardCharsets.UTF_8));
211211
}
212212

213213
// Open database with column families

0 commit comments

Comments
 (0)