presto加载catalog的逻辑
presto启动入口
模块:presto-server-main
类及方法:io.prestosql.server.PrestoServer.main(String[] args)
代码片段:
public final class PrestoServer
{
private PrestoServer() {}
public static void main(String[] args)
{
String javaVersion = nullToEmpty(StandardSystemProperty.JAVA_VERSION.value());
String majorVersion = Splitter.on('.').split(javaVersion).iterator().next();
Integer major = Ints.tryParse(majorVersion);
if (major == null || major < 11) {
System.err.println(format("ERROR: Presto requires Java 11+ (found %s)", javaVersion));
System.exit(100);
}
String version = PrestoServer.class.getPackage().getImplementationVersion();
// 启动presto服务
new Server().start(firstNonNull(version, "unknown"));
}
}
初始化catalog加载器的bean和配置类
模块:presto-main
类及方法:io.prestosql.server.ServerMainModule.setup(Binder binder)
代码片段:
// 初始化catalog加载器的bean
binder.bind(StaticCatalogStore.class).in(Scopes.SINGLETON);
// 加载配置
configBinder(binder).bindConfig(StaticCatalogStoreConfig.class);
初始化加载catalog信息入口
模块:presto-main
类及方法:io.prestosql.server.Server.doStart(String prestoVersion)
代码片段:
try {
Injector injector = app.strictConfig().initialize();
logLocation(log, "Working directory", Paths.get("."));
logLocation(log, "Etc directory", Paths.get("etc"));
injector.getInstance(PluginManager.class).loadPlugins();
// 初始化加载catalog信息
injector.getInstance(StaticCatalogStore.class).loadCatalogs();
// TODO: remove this huge hack
updateConnectorIds(injector.getInstance(Announcer.class), injector.getInstance(CatalogManager.class));
injector.getInstance(SessionPropertyDefaults.class).loadConfigurationManager();
injector.getInstance(ResourceGroupManager.class).loadConfigurationManager();
injector.getInstance(AccessControlManager.class).loadSystemAccessControl();
injector.getInstance(PasswordAuthenticatorManager.class).loadPasswordAuthenticator();
injector.getInstance(EventListenerManager.class).loadEventListeners();
injector.getInstance(GroupProviderManager.class).loadConfiguredGroupProvider();
injector.getInstance(CertificateAuthenticatorManager.class).loadCertificateAuthenticator();
injector.getInstance(Announcer.class).start();
injector.getInstance(ServerInfoResource.class).startupComplete();
log.info("======== SERVER STARTED ========");
}
catch (Throwable e) {
log.error(e);
System.exit(1);
}
catalog connector管理
创建catalog connector
模块:presto-main
类及方法:io.prestosql.connector.ConnectorManager.createCatalog(String catalogName, String connectorName, Map<String, String> properties)
代码片段:
public synchronized CatalogName createCatalog(String catalogName, String connectorName, Map<String, String> properties)
{
requireNonNull(connectorName, "connectorName is null");
InternalConnectorFactory connectorFactory = connectorFactories.get(connectorName);
checkArgument(connectorFactory != null, "No factory for connector '%s'. Available factories: %s", connectorName, connectorFactories.keySet());
return createCatalog(catalogName, connectorFactory, properties);
}
删除catalog connector
模块:presto-main
类及方法:io.prestosql.connector.ConnectorManager.dropConnection(String catalogName)
代码片段:
public synchronized void dropConnection(String catalogName)
{
requireNonNull(catalogName, "catalogName is null");
catalogManager.removeCatalog(catalogName).ifPresent(catalog -> {
// todo wait for all running transactions using the connector to complete before removing the services
removeConnectorInternal(catalog);
removeConnectorInternal(createInformationSchemaCatalogName(catalog));
removeConnectorInternal(createSystemTablesCatalogName(catalog));
handleResolver.removeCatalogHandleResolver(catalogName);
});
}