Skip to content

4.8.0 单表列表 性能优化前后对比 #315

Open

Description

@TommyLemon

经过 ed036ef 这次优化,
4.8.0 对比 4.7.2 在 Log.DEBUG = true(开启日志)的情况下:

TestRecord[] 耗时降低至原来 73%,性能提升 27% 至原来 1.3 倍;
Moment[] 耗时降低至原来 80%,性能提升 20% 至原来 1.2 倍;
朋友圈列表耗时降低至原来 81%,性能提升 19% 至原来 1.2 倍。

其中每个数组都按 100 条来测试,如果每页数量更大或每项数据量更大,则提升会更加明显。

Activity

  1. TommyLemon commented on Sep 27, 2021

    @TommyLemon
    MemberAuthor

    主要因为省掉了 AbstractObjectParser.onSQLExecute 878 行 for 循环 put 100 条数据(有日志) 3ms-8ms (MacBook Pro(13 英寸,2015 年初期)2.9 GHz Intel Core i5 16 GB 1867 MHz DDR3 MacOS 10.11.6 )
    https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java

    以及 AbstractParser.onArrayParse 中用 1 次 addAll 替代 100 次 add 减少不必要的 ArrayList 频繁校验和扩容
    https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java

  2. TommyLemon commented on Nov 22, 2021

    @TommyLemon
    MemberAuthor

    腾讯 CSIG 某项目性能测试结果

    1. 测试环境

    1.1 机器配置

    腾讯云tke docker pod, 4 核 / 16G。

    1.2 db机器配置

    腾讯云8核32000MB内存,805GB存储空间

    1.3 测试表建表DML、数据量(mysql 5.7)

    CREATE TABLE `t_xxxx_xxxx` (
        `x_id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xID',
        `x_xid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_xx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xID',
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxxID',
        `x_xxxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_uin` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'xxuin',
        `x_send_time` datetime DEFAULT NULL COMMENT '推送消息时间',
        `x_xxxx_result` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xx结果',
        `x_xxx_xxxx_result` varchar(255) DEFAULT '' COMMENT 'xx结果',
        `x_result` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0错误 1正确 2未设置',
        `x_create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间, 落地时间',
        `x_credit` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xx数量',
        `x_xxxxxx_xxx_id` varchar(32) NOT NULL COMMENT '公共参数, 上报应用',
        `x_xxxxxx_source` varchar(32) NOT NULL COMMENT '公共参数, 上报服务名',
        `x_xxxxxx_server` varchar(32) NOT NULL COMMENT '公共参数, 上报服务端ip',
        `x_xxxxxx_event_time` datetime NOT NULL COMMENT '公共参数, 上报时间',
        `x_xxxxxx_client` varchar(32) NOT NULL COMMENT '公共参数, 客户端ip',
        `x_xxxxxx_trace_id` varchar(64) NOT NULL COMMENT '公共参数',
        `x_xxxxxx_sdk` varchar(16) NOT NULL COMMENT '公共参数, sdk版本',
        PRIMARY KEY (`x_id`, `x_uin`),
        UNIQUE KEY `udx_uid_xxxxid` (`x_uin`, `x_xxxx_id`),
        KEY `idx_xid` (`x_xid`)
      ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  COMMENT = 'xx事件表'; 
    • 数据量:18558903

    • mysql版本:5.7

    • 数据分布:使用group by 统计,基于其中x_xid来group by,得到以下表格:

    select x_xid, count(x_id) counter from t_xxxx_xxxx group by x_xid order by counter desc limit 10;

    x_xid counter
    xxxx36 696376
    xxxx38 418576
    xxxx63 384503
    xxxx40 372080
    xxxx41 301364
    xxxx08 248243
    xxxx46 223820
    xxxx07 220234
    xxxx44 207721
    xxxx02 152795

    1.4 日志打印设置

    Log.DEBUG = false;
    
    AbstractParser.IS_PRINT_REQUEST_STRING_LOG = false;
    AbstractParser.IS_PRINT_REQUEST_ENDTIME_LOG = false;
    AbstractParser.IS_PRINT_BIG_LOG = false;

    2. 测试脚本 (使用Table[]: {Table: {}}格式)

    脚本统计方式:

    • 基于linux time命令输出的realtime来统计。

    • 分2个场景测试:一个不带where条件、一个带x_xid in (xxxx36,xxxx38)的条件,该条件能匹配出100W+数据,方便覆盖10W-100W之间的任何数据量场景,这里事先用select x_xid, count(x_id) c from t_xxxx_xxxx group by x_xid order by c desc;这样的语句对表做了统计,x_xid=xxxx36有696376条记录,x_xid=xxxx38有418576条记录。

    脚本:apitest.sh

    #!/bin/bash
    printf -- '--------------------------\n开始不带where条件的情况测试\n'
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":100000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 10w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":200000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 20w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":500000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 50w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":800000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 80w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":1000000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 100w_no_where.log
    
    
    
    printf -- '--------------------------\n开始带where条件的情况测试\n'
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":100000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 10w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":200000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 20w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":500000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 50w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":800000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 80w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":1000000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 100w_with_where.log

    也就是 MySQL 5.7 共 1.9KW 记录的大表,统计 CRUL 10-20M/s 网速从发起请求到接收完回包的总时长

    数量级 4.7.0(5次取平均值) 4.8.0(5次取平均值) 是否正常回包 where条件 性能提升
    10W 1.739s 1.159s 是 无 50%。即((1/1.159-1/1.739)/(1/1.739))*100%
    20W 3.518s 2.676s 是 无 31.5%
    50W 9.257s 6.952s 是 无 33.2%
    80W 16.236s 10.697s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok。 无 51.8%
    100W 19.748s 14.466s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok 无 36.5%
    10W 1.928s 1.392s 是 "x_xid{}":[xxxx36,xxxx38],覆盖数据超过100W数据。 38.5%
    20W 4.149s 2.852s 是 "x_xid{}":[xxxx36,xxxx38] 45.5%
    50W 10.652s 7.231s 是 "x_xid{}":[xxxx36,xxxx38] 47.3%
    80W 16.975s 12.465s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 36.2%
    100W 20.632s 16.481s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 25.2%
  3. TommyLemon commented on Nov 22, 2021

    @TommyLemon
    MemberAuthor

    腾讯 CSIG 某项目性能测试结果

    1. 测试环境

    1.1 机器配置

    腾讯云tke docker pod, 4 核 / 16G。

    1.2 db机器配置

    腾讯云8核32000MB内存,805GB存储空间

    1.3 测试表建表DML、数据量(mysql 5.7)

    CREATE TABLE `t_xxxx_xxxx` (
        `x_id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xID',
        `x_xid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_xx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xID',
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxxID',
        `x_xxxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_xxxx_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xxID',
        `x_uin` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'xxuin',
        `x_send_time` datetime DEFAULT NULL COMMENT '推送消息时间',
        `x_xxxx_result` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xx结果',
        `x_xxx_xxxx_result` varchar(255) DEFAULT '' COMMENT 'xx结果',
        `x_result` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0错误 1正确 2未设置',
        `x_create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间, 落地时间',
        `x_credit` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'xx数量',
        `x_xxxxxx_xxx_id` varchar(32) NOT NULL COMMENT '公共参数, 上报应用',
        `x_xxxxxx_source` varchar(32) NOT NULL COMMENT '公共参数, 上报服务名',
        `x_xxxxxx_server` varchar(32) NOT NULL COMMENT '公共参数, 上报服务端ip',
        `x_xxxxxx_event_time` datetime NOT NULL COMMENT '公共参数, 上报时间',
        `x_xxxxxx_client` varchar(32) NOT NULL COMMENT '公共参数, 客户端ip',
        `x_xxxxxx_trace_id` varchar(64) NOT NULL COMMENT '公共参数',
        `x_xxxxxx_sdk` varchar(16) NOT NULL COMMENT '公共参数, sdk版本',
        PRIMARY KEY (`x_id`, `x_uin`),
        UNIQUE KEY `udx_uid_xxxxid` (`x_uin`, `x_xxxx_id`),
        KEY `idx_xid` (`x_xid`)
      ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  COMMENT = 'xx事件表'; 
    • 数据量:18558903
    • mysql版本:5.7
    • 数据分布:使用group by 统计,基于其中x_xid来group by,得到以下表格:

    select x_xid, count(x_id) counter from t_xxxx_xxxx group by x_xid order by counter desc limit 10;

    x_xid counter
    xxxx36 696376
    xxxx38 418576
    xxxx63 384503
    xxxx40 372080
    xxxx41 301364
    xxxx08 248243
    xxxx46 223820
    xxxx07 220234
    xxxx44 207721
    xxxx02 152795

    1.4 日志打印设置

    Log.DEBUG = false;
    
    AbstractParser.IS_PRINT_REQUEST_STRING_LOG = false;
    AbstractParser.IS_PRINT_REQUEST_ENDTIME_LOG = false;
    AbstractParser.IS_PRINT_BIG_LOG = false;

    2. 测试脚本 (使用Table[]: {Table: {}}格式)

    脚本统计方式:

    • 基于linux time命令输出的realtime来统计。
    • 分2个场景测试:一个不带where条件、一个带x_xid in (xxxx36,xxxx38)的条件,该条件能匹配出100W+数据,方便覆盖10W-100W之间的任何数据量场景,这里事先用select x_xid, count(x_id) c from t_xxxx_xxxx group by x_xid order by c desc;这样的语句对表做了统计,x_xid=xxxx36有696376条记录,x_xid=xxxx38有418576条记录。

    脚本:apitest.sh

    #!/bin/bash
    printf -- '--------------------------\n开始不带where条件的情况测试\n'
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":100000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 10w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":200000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 20w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":500000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 50w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":800000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 80w_no_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":1000000, "T_xxxx_xxxx":{"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 100w_no_where.log
    
    
    
    printf -- '--------------------------\n开始带where条件的情况测试\n'
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":100000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 10w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":200000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 20w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":500000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 50w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":800000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 80w_with_where.log
    
    time curl  -X POST -H 'Content-Type:application/json' 'http://x.xxx.xx.xxx:xxxx/get' -d '{"T_xxxx_xxxx[]":{"count":1000000, "T_xxxx_xxxx":{"x_xid{}":[xxxx36,xxxx38],"@column":"x_uin,x_send_time,x_xxxx_id,x_xid,x_xx_id,x_xxxxx_id,x_xxxx_result,x_result,x_credit"}}}' > 100w_with_where.log

    也就是 MySQL 5.7 共 1.9KW 记录的大表,统计 CRUL 10-20M/s 网速从发起请求到接收完回包的总时长

    数量级 4.7.0(5次取平均值) 4.8.0(5次取平均值) 是否正常回包 where条件 性能提升
    10W 1.739s 1.159s 是 无 50%。即((1/1.159-1/1.739)/(1/1.739))*100%
    20W 3.518s 2.676s 是 无 31.5%
    50W 9.257s 6.952s 是 无 33.2%
    80W 16.236s 10.697s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok。 无 51.8%
    100W 19.748s 14.466s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok 无 36.5%
    10W 1.928s 1.392s 是 "x_xid{}":[xxxx36,xxxx38],覆盖数据超过100W数据。 38.5%
    20W 4.149s 2.852s 是 "x_xid{}":[xxxx36,xxxx38] 45.5%
    50W 10.652s 7.231s 是 "x_xid{}":[xxxx36,xxxx38] 47.3%
    80W 16.975s 12.465s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 36.2%
    100W 20.632s 16.481s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 25.2%

    以之前的 APIJSON 4.6.0 连接 2.3KW 大表带条件查出 12W+ 数据来估计:
    https://github.com/Tencent/APIJSON/releases/tag/4.6.0

    ---------- | ---------- | ---------- | ---------- | -------------
    Total | Received | Time Total | Time Spent | Current Speed
    72.5M | 72.5M | 0:00:05 | 0:00:05 | 20.0M

    /get >> http请求结束:5624

    4.6.0-4.7.2 都没有明显的性能优化,所以 4.7.0 只花了约 2s 应该是因为换了张表,平均每行数据量减少了约 65% 为原来的 35%。
    APIJSON 4.6.0 查原来 2.3KW 大表中 100W 数据按新旧表数据量比例估计耗时 = 20.632s / 65% = 31.7s;
    APIJSON 4.6.0 查原来 2.3KW 大表中 100W 数据按同表查出数据量比例估计耗时 = 100W*72.5M/(12-13W)/(20M/s) = 27.9s-30.2s。

    两种方式估算结果基本一致,也可以按这个 35% 新旧表平均每行数据量比例估算排除网络耗时后的整个服务耗时:

    APIJSON 4.6.0 查原来 2.3KW 大表中 12W+ 数据量服务耗时 = 总耗时 5.624s - 数据 72.5M/下载速度 20.0Mbps = 2.00s;
    APIJSON 4.7.0 查现在 1.9KW 大表中 10W 数据量服务耗时 = 总耗时 1.928s - 数据 72.5M*35%(10/12)/(下载速度 10-20.0Mbps) = 0.00-0.87s;
    APIJSON 4.8.0 查现在 1.9KW 大表中 10W 数据量服务耗时 = 总耗时 1.392s - 数据 72.5M*35%
    (10/12)/(下载速度 10-20.0Mbps) = 0.00-0.33s,降低 62%;
    APIJSON 4.7.0 查现在 1.9KW 大表中 100W 数据量服务耗时 = 总耗时 20.632s - 数据 725M*35%(10/12)/(下载速度 10-20.0Mbps) = 0.00-10.06s;
    APIJSON 4.8.0 查现在 1.9KW 大表中 100W 数据量服务耗时 = 总耗时 16.481s - 数据 725M*35%
    (10/12)/(下载速度 10-20.0Mbps) = 0.00-5.91s,降低 41%。

  4. TommyLemon commented on Jan 9, 2022

    @TommyLemon
    MemberAuthor

    腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事
    https://my.oschina.net/tommylemon/blog/5375645
    image

  5. changed the title [-]单表列表 性能优化前后对比[/-] [+]4.8.0 单表列表 性能优化前后对比[/+] on Jan 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions