trino-435:dynamic catalog数据库存储代码实现

一、dynamic catalog数据库存储源码分析

dynamic catalog的实现主要涉及到两个类:CoordinatorDynamicCatalogManager、WorkerDynamicCatalogManager,这两个类的详细信息如下:
在这里插入图片描述

在这里插入图片描述
这两个类主要提供了对catalog的增删改查的方法。trino-435源码中WorkerDynamicCatalogManager类并没有实现CatalogManager接口,需要对该类进行修改实现CatalogManager接口并实现接口中的方法,完成worker节点对catalog增删改查功能

二、JdbcStroeCatalog类的具体实现

该类的详细信息如下:
在这里插入图片描述
在代码试下中在构造方法中完成从数据库中加载catalog,并通过内部类中的loadProperties方法完成catalog属性加载,代码具体实现如下:

public final class JdbcCatalogStoreimplements CatalogStore
{private static final Logger log = Logger.get(JdbcCatalogStore.class);private final boolean readOnly;private final Jdbi catalogsJdbi;private final Boolean isCoordinator;private final ConcurrentMap<String, StoredCatalog> catalogs = new ConcurrentHashMap<>();@Injectpublic JdbcCatalogStore(JdbcCatalogStoreConfig config, ServerConfig serverConfig){requireNonNull(config, "config is null");readOnly = config.isReadOnly();isCoordinator = serverConfig.isCoordinator();String catalogsUrl = config.getCatalogConfigDbUrl();String catalogsUser = config.getCatalogConfigDbUser();String catalogsPassword = config.getCatalogConfigDbPassword();loaderJdbcDriver(this.getClass().getClassLoader(), "com.mysql.cj.jdbc.Driver", catalogsUrl);catalogsJdbi = Jdbi.create(catalogsUrl, catalogsUser, catalogsPassword);List<String> disabledCatalogs = firstNonNull(config.getDisabledCatalogs(), ImmutableList.of());List<JdbcStoredCatalog> dbCatalogs = catalogsJdbi.withHandle(handle -> {handle.execute("CREATE TABLE IF NOT EXISTS `catalogs`( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL COMMENT 'catalog名称', `properties` text, `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY index_name (`name`))");return handle.createQuery("SELECT name, properties FROM catalogs").mapToBean(JdbcStoredCatalog.class).list();});for (JdbcStoredCatalog catalog : dbCatalogs) {String catalogName = catalog.getName();checkArgument(!catalogName.equals(GlobalSystemConnector.NAME), "Catalog name SYSTEM is reserved for internal usage");if (disabledCatalogs.contains(catalogName)) {log.info("Skipping disabled catalog %s", catalogName);continue;}catalogs.put(catalog.getName(), catalog);}}@Overridepublic Collection<StoredCatalog> getCatalogs(){return ImmutableList.copyOf(catalogs.values());}@Overridepublic CatalogProperties createCatalogProperties(String catalogName, ConnectorName connectorName, Map<String, String> properties){checkModifiable();return new CatalogProperties(createRootCatalogHandle(catalogName, computeCatalogVersion(catalogName, connectorName, properties)),connectorName,ImmutableMap.copyOf(properties));}@Overridepublic void addOrReplaceCatalog(CatalogProperties catalogProperties){checkModifiable();String catalogName = catalogProperties.getCatalogHandle().getCatalogName();Properties properties = new Properties();properties.setProperty("connector.name", catalogProperties.getConnectorName().toString());properties.putAll(catalogProperties.getProperties());String stringProperties = JSONObject.toJSONString(properties);log.info("add catalog %s with properties %s", catalogName, stringProperties);JdbcStoredCatalog jdbcCatalog = new JdbcStoredCatalog(catalogName, stringProperties);if (isCoordinator) {log.info("The coordinator node catalog needs to be persisted to the database");catalogsJdbi.withHandle(handle -> {handle.createUpdate("INSERT INTO catalogs (name,properties) VALUES (:name, :properties)").bind("name", catalogName).bind("properties", stringProperties).execute();return null;});}catalogs.put(catalogName, jdbcCatalog);}@Overridepublic void removeCatalog(String catalogName){checkModifiable();if (isCoordinator) {log.info("The coordinator node catalog must support persistent deletion");catalogsJdbi.withHandle(handle -> {handle.createUpdate("DELETE FROM catalogs WHERE name = :name").bind("name", catalogName).execute();return null;});}catalogs.remove(catalogName);}private void checkModifiable(){if (readOnly) {throw new TrinoException(NOT_SUPPORTED, "Catalog store is read only");}}/*** This is not a generic, universal, or stable version computation, and can and will change from version to version without warning.* For places that need a long term stable version, do not use this code.*/static CatalogVersion computeCatalogVersion(String catalogName, ConnectorName connectorName, Map<String, String> properties){Hasher hasher = Hashing.sha256().newHasher();hasher.putUnencodedChars("catalog-hash");hashLengthPrefixedString(hasher, catalogName);hashLengthPrefixedString(hasher, connectorName.toString());hasher.putInt(properties.size());ImmutableSortedMap.copyOf(properties).forEach((key, value) -> {hashLengthPrefixedString(hasher, key);hashLengthPrefixedString(hasher, value);});return new CatalogVersion(hasher.hash().toString());}private static void hashLengthPrefixedString(Hasher hasher, String value){hasher.putInt(value.length());hasher.putUnencodedChars(value);}public static class JdbcStoredCatalogimplements StoredCatalog{private String name;private String properties;public JdbcStoredCatalog() {}public JdbcStoredCatalog(String name, String properties){this.name = name;this.properties = properties;}@ColumnName("properties")public String getProperties(){return properties;}public void setProperties(String properties){this.properties = properties;}@ColumnName("name")@Overridepublic String getName(){return name;}public void setName(String name){this.name = name;}@Overridepublic CatalogProperties loadProperties(){final Properties properties = convertStringToProperties(this.properties);Map<String, String> props = new HashMap<>(fromProperties(properties).entrySet().stream().collect(toImmutableMap(Entry::getKey, entry -> entry.getValue().trim())));String connectorNameValue = props.remove("connector.name");checkState(connectorNameValue != null, "Catalog configuration %s does not contain 'connector.name'", this.name);if (connectorNameValue.indexOf('-') >= 0) {String deprecatedConnectorName = connectorNameValue;connectorNameValue = connectorNameValue.replace('-', '_');log.warn("Catalog '%s' is using the deprecated connector name '%s'. The correct connector name is '%s'", name, deprecatedConnectorName, connectorNameValue);}ConnectorName connectorName = new ConnectorName(connectorNameValue);CatalogHandle catalogHandle = createRootCatalogHandle(name, computeCatalogVersion(name, connectorName, props));return new CatalogProperties(catalogHandle, connectorName, ImmutableMap.copyOf(props));}}public static Properties convertStringToProperties(String json) {ObjectMapper objectMapper = new ObjectMapper();Properties properties = new Properties();try {Object jsonObject = objectMapper.readValue(json, Object.class);if (jsonObject instanceof Map) {Map<String, String> map = (Map<String, String>) jsonObject;for (Map.Entry<String, String> entry : map.entrySet()) {properties.setProperty(entry.getKey(), entry.getValue());}} else {throw new IllegalArgumentException("The JSON string should contain a Map object");}} catch (Exception e) {throw new RuntimeException(e.getMessage(), e);}return properties;}private static void loaderJdbcDriver(ClassLoader classLoader, String driverClassName, String catalogUrl) {try {final Class<?> clazz = Class.forName(driverClassName, true, classLoader);final Driver driver = (Driver) clazz.newInstance();if (!driver.acceptsURL(catalogUrl)) {log.error("Jdbc driver loading error. Driver {} cannot accept url.", driverClassName);throw new RuntimeException("Jdbc driver loading error.");}} catch (final Exception e) {throw new RuntimeException("Jdbc driver loading error.", e);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

推荐一款Apache开源的文档内容解析工具

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 hello&#xff0c;伙伴们&#xff0c;在闲暇的时候逛了一下掘金&#xff0c;发现了这样的一篇文章&#xf…

机器人相关知识

机器人学&#xff08;Robotics) 一些基础概念 位姿 位姿位置姿态 位姿的表示 刚体 刚性物体是一组粒子的集合&#xff0c;其中任意两个粒子之间的距离保持固定&#xff0c;不受物体运动或施加在物体上的力的影响。 “完全不可变形”的物体就是刚体。 刚体位置 刚性连杆 …

【网络技术】【Kali Linux】Wireshark嗅探(八)动态主机配置协议(DHCP)

一、实验目的 本次实验使用 Wireshark &#xff08;“网鲨”&#xff09;流量分析工具进行网络流量嗅探&#xff0c;旨在初步了解动态主机配置协议&#xff08;DHCP协议&#xff09;的工作原理。 二、DHCP协议概述 动态主机配置协议&#xff08; D ynamic H ost C onfigurat…

工智能基础知识总结--导出SVM要优化的问题

导出SVM要优化的问题 对于上图中这样一个二分类线性可分问题,期望找到一个分类超平面将正负类分开,SVM就是一个用来寻找这样的分类超平面的算法。 定义正负类的标签分别为1、-1,分类超平面的表达式为 f ( x ) = w T x + b f(x)=w^Tx+b

使用代理IP保护爬虫访问隐私数据的方法探讨

目录 前言 1. 获取代理IP列表 2. 随机选择代理IP 3. 使用代理IP发送请求 4. 处理代理IP异常 总结 前言 保护爬虫访问隐私数据是一个重要的安全问题。为了保障用户的隐私&#xff0c;很多网站会采取限制措施&#xff0c;如封禁IP或限制访问频率。为了绕过这些限制&#x…

宏电股份5G RedCap终端产品助力深圳极速先锋城市建设

12月26日&#xff0c;“全城全网&#xff0c;先锋物联”深圳移动5G-A RedCap助力深圳极速先锋城市创新发布会举行&#xff0c;宏电股份携一系列5G RedCap终端产品应邀参与创新发布会&#xff0c;来自全国5G生态圈的各界嘉宾、专家学者济济一堂&#xff0c;共探信息化数字化创新…

L1-078:吉老师的回归

题目描述 曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦&#xff01; 为了简化题目&#xff0c;我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来&#xff0c;如&#xff1a;Problem A: Print "Hello world!"。 众所周知…

实验笔记之——服务器链接

最近需要做NeRF相关的开发,需要用到GPU,本博文记录本人配置服务器远程链接的过程,本博文仅供本人学习记录用~ 连上服务器 首先先确保环境是HKU的网络环境(HKU AnyConnect也可)。伙伴已经帮忙创建好用户(第一次登录会提示重新设置密码)。用cmd ssh链接ssh -p 60001 <u…

计算机毕业设计 SpringBoot的中小型制造企业质量管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Linux基础——进程地址空间

1. 地址空间的验证 之前我们在学习语言时&#xff0c;曾知道有下面这张图 对于这个图我们可以用下面的代码验证 运行后我们可以发现 其对应关系如下 我们使用fork函数&#xff0c;来分别对父子进程中的g_val进行修改&#xff0c;即 运行后我们可以发现 在子进程修改了g_val后…

矩阵的乘法

首先矩阵的乘法定义如下&#xff1a; #include <stdio.h> int main() { int i 0; int j 0; int arr[20][20] { 0 }; int str[20][20] { 0 }; int s[20][20] { 0 }; int n1 0; int n2 0; int m2 0; int z 0; int m1 0;…

LeetCode 每日一题 Day 3334(hard)35 ||二进制枚举/单调栈/链表遍历

2397. 被列覆盖的最多行数 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式…

认识jmeter接口测试工具!

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;​​​​​​Apache JMeter - Download Apache JMeter 安装 由于Jmeter…

学会视频剪辑方法:从视频中提取封面,增加视频观看量

在数字媒体时代&#xff0c;视频已经成为信息传递的主要方式之一。那如何让视频在众多内容中脱颖而出&#xff0c;吸引更多的观众呢&#xff1f;除了内容本身的质量外&#xff0c;视频的封面也是吸引的关键因素之一。下面一起看云炫AI智剪如何通过视频剪辑方法从视频中提取封面…

Docker的一个简单例子(二)

文章目录 环境示例持久化数据bind mount多容器应用Docker Compose 参考 环境 RHEL 9.3Docker Community 24.0.7 示例 持久化数据 默认情况下&#xff0c;各个容器之间的文件系统是相互独立的。即使两个容器来自同一个image&#xff0c;对其中一个容器的修改&#xff0c;对另…

leetcode算法题之递归--综合练习(二)

本章目录 1.N皇后2.有效的数独3.解数独4.单词搜索5.黄金矿工6.不同路径III 1.N皇后 N皇后 class Solution {vector<vector<string>> ret;vector<string> path;int n;bool checkCol[10],checkDig1[20],checkDig2[20]; public:vector<vector<string&g…

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…

conda安装transformers、wordcloud库

conda安装transformers库 使用 conda 自 Transformers 4.0.0 版始&#xff0c;我们有了一个 conda 频道&#xff1a; huggingface。 &#x1f917; Transformers 可以通过 conda 依此安装&#xff1a; conda install -c huggingface transformers安装起来就很通畅 conda查看…

NGINX 配置本地HTTPS(免费证书)

生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 2048 会有两次要求输入密码,输入同一个即可。输入密码然后你就获得了一个server.key文件。 以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令: $ op…