@@ -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 /**
0 commit comments