/** * Determines whether metadata requires refresh and if so clears the flag. * * @return true in case refresh should be performed */ private boolean isRefreshNowAndClear() { try { // Prevent anyone from changing the refresh status during reload to avoid missed calls refreshLock.writeLock().lock(); // Make sure refresh is really necessary if (!isRefreshRequired()) { log.debug("Refresh is not required, isRefreshRequired flag isn't set"); return false; } // Clear the refresh flag setRefreshRequired(false); } finally { refreshLock.writeLock().unlock(); } return true; }
@Override public void run() { try { log.trace("Executing metadata refresh task"); // Invoking getMetadata performs a refresh in case it's needed // Potentially expensive operation, but other threads can still load existing cached data for (MetadataProvider provider : getProviders()) { provider.getMetadata(); } // Refresh the metadataManager if needed if (isRefreshRequired()) { if (isRefreshNowAndClear()) { refreshMetadata(); } } } catch (Throwable e) { log.warn("Metadata refreshing has failed", e); } }