arina-ielchiieva commented on a change in pull request #1345: DRILL-6494: Drill Plugins Handler URL: https://github.com/apache/drill/pull/1345#discussion_r198860410
########## File path: exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistryImpl.java ########## @@ -121,71 +117,96 @@ public StoragePlugin load(StoragePluginConfig config) throws Exception { } @Override - public void init() throws DrillbitStartupException { + public void init() { availablePlugins = findAvailablePlugins(classpathScan); - // create registered plugins defined in "storage-plugins.json" - plugins.putAll(createPlugins()); - } - - @SuppressWarnings("resource") - private Map<String, StoragePlugin> createPlugins() throws DrillbitStartupException { try { - /* - * Check if the storage plugins system table has any entries. If not, load the boostrap-storage-plugin file into - * the system table. - */ + StoragePlugins pluginsToBeWrittenToPersistenceStore = null; + final boolean isPluginsUpdaterEnabled = context.getConfig().getBoolean(ExecConstants.STORAGE_PLUGINS_UPDATE); if (!pluginSystemTable.getAll().hasNext()) { - // bootstrap load the config since no plugins are stored. - logger.info("No storage plugin instances configured in persistent store, loading bootstrap configuration."); - Collection<URL> urls = ClassPathScanner.forResource(ExecConstants.BOOTSTRAP_STORAGE_PLUGINS_FILE, false); - if (urls != null && !urls.isEmpty()) { - logger.info("Loading the storage plugin configs from URLs {}.", urls); - Map<String, URL> pluginURLMap = Maps.newHashMap(); - for (URL url : urls) { - String pluginsData = Resources.toString(url, Charsets.UTF_8); - StoragePlugins plugins = lpPersistence.getMapper().readValue(pluginsData, StoragePlugins.class); - for (Map.Entry<String, StoragePluginConfig> config : plugins) { - if (!definePluginConfig(config.getKey(), config.getValue())) { - logger.warn("Duplicate plugin instance '{}' defined in [{}, {}], ignoring the later one.", - config.getKey(), pluginURLMap.get(config.getKey()), url); - continue; - } - pluginURLMap.put(config.getKey(), url); - } - } - } else { - throw new IOException("Failure finding " + ExecConstants.BOOTSTRAP_STORAGE_PLUGINS_FILE); + // create registered plugins defined in "storage-plugins.json" + StoragePlugins bootstrapPlugins = readBootstrapStoragePlugins(); + if (isPluginsUpdaterEnabled) { + StoragePluginsHandler storagePluginsUpdaterService = new StoragePluginsUpdater(context); + pluginsToBeWrittenToPersistenceStore = storagePluginsUpdaterService.updatePlugins(bootstrapPlugins, null); + } + if (pluginsToBeWrittenToPersistenceStore == null) { + pluginsToBeWrittenToPersistenceStore = bootstrapPlugins; + } + } else { + if (isPluginsUpdaterEnabled) { + StoragePluginsHandler storagePluginsUpdaterService = new StoragePluginsUpdater(context); + pluginsToBeWrittenToPersistenceStore = storagePluginsUpdaterService.updatePlugins(null, pluginSystemTable); } } - Map<String, StoragePlugin> activePlugins = new HashMap<String, StoragePlugin>(); - for (Map.Entry<String, StoragePluginConfig> entry : Lists.newArrayList(pluginSystemTable.getAll())) { - String name = entry.getKey(); - StoragePluginConfig config = entry.getValue(); - if (config.isEnabled()) { - try { - StoragePlugin plugin = create(name, config); - activePlugins.put(name, plugin); - } catch (ExecutionSetupException e) { - logger.error("Failure while setting up StoragePlugin with name: '{}', disabling.", name, e); - config.setEnabled(false); - pluginSystemTable.put(name, config); - } + // load plugins to persistence store + if (pluginsToBeWrittenToPersistenceStore != null) { + for (Entry<String, StoragePluginConfig> plugin : pluginsToBeWrittenToPersistenceStore) { + pluginSystemTable.put(plugin.getKey(), plugin.getValue()); } } - activePlugins.put(INFORMATION_SCHEMA_PLUGIN, new InfoSchemaStoragePlugin(new InfoSchemaConfig(), context, - INFORMATION_SCHEMA_PLUGIN)); - activePlugins.put(SYS_PLUGIN, new SystemTablePlugin(SystemTablePluginConfig.INSTANCE, context, SYS_PLUGIN)); - - return activePlugins; + defineEnabledPlugins(); } catch (IOException e) { - logger.error("Failure setting up storage plugins. Drillbit exiting.", e); + logger.error("Failure setting up storage enabledPlugins. Drillbit exiting.", e); throw new IllegalStateException(e); } } + /** + * Read bootstrap storage plugins {@link ExecConstants#BOOTSTRAP_STORAGE_PLUGINS_FILE} files for the first fresh + * instantiating of Drill + * + * @return bootstrap storage plugins + * @throws IOException if a read error occurs + */ + private StoragePlugins readBootstrapStoragePlugins() throws IOException { Review comment: `loadBootstrapPlugins` ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services