Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: create FULLTEXT INDEX on table(has many data) failed #19923

Closed
1 task done
tom-csf opened this issue Nov 11, 2024 · 9 comments
Closed
1 task done

[Bug]: create FULLTEXT INDEX on table(has many data) failed #19923

tom-csf opened this issue Nov 11, 2024 · 9 comments
Assignees
Labels
kind/bug Something isn't working phase/testing severity/s0 Extreme impact: Cause the application to break down and seriously affect the use
Milestone

Comments

@tom-csf
Copy link

tom-csf commented Nov 11, 2024

Is there an existing issue for the same bug?

  • I have checked the existing issues.

Branch Name

main

Commit ID

9a8c097

Other Environment Information

- Hardware parameters:
- OS type:
- Others:

Actual Behavior

image

Expected Behavior

No response

Steps to Reproduce

1、load tpch 10g data to mo
2、set experimental_fulltext_index=1;
CREATE FULLTEXT INDEX ftidx ON lineitem(l_comment);

Additional information

image
@tom-csf tom-csf added kind/bug Something isn't working needs-triage severity/s0 Extreme impact: Cause the application to break down and seriously affect the use labels Nov 11, 2024
@tom-csf tom-csf added this to the 2.0.1 milestone Nov 11, 2024
@ouyuanning
Copy link
Contributor

多CN报错的复现方式

select mo_ctl('cn', 'task', 'disable');
drop database if exists db1;
create database db1;
use db1;

set experimental_fulltext_index=1;
drop table if exists t1;
create table t1(a int primary key, b varchar(200));
insert into t1 select result, "test create big fulltext index" from generate_series(3000000) g;  //如果把这里的数据量变小,后面的就不会报错,比如300000
create fulltext index ftidx on t1 (b); //这里会报错,

报错是这个地方
image
直接原因是601行的判断,进不去。

@aptend
Copy link
Contributor

aptend commented Nov 14, 2024

报错的表 _mo_index_secondary* 没有被创建过,Relation 接口返回找不到表是预期行为。需要关注索引表的创建逻辑

@aptend aptend assigned qingxinhome and unassigned aptend Nov 14, 2024
@qingxinhome
Copy link
Contributor

定位分析中

@qingxinhome
Copy link
Contributor

qingxinhome commented Nov 14, 2024

执行创建索引语句时,会有一下步骤:

  1. 检查索引表名是否已经存在,如果存在就报错, 如果不存在就执行步骤2
  2. 调用txnDatabase.Create()接口方法,在当前事务中创建索引表对应的relation
  3. 如果索引表有自增列,自增列表中插入目标表的自增列信息
  4. 往索引表中填入数据, 构建insert into select * from语句,通过调用TxnExecutor内部执行器,执行该insert语句
    以上步骤全部成功后,索引即可创建成功

通过日志分析,发现步骤1,步骤2,步骤3均已执行成功,索引表创建成功后,也可以获取对应的relation,但是执行步骤4时失败报错,
也就是说,索引表的表结构创建成功了,但是往索引表中insert数据时报错,
通过日志看到,内部执行器TxnExecutor在运行insert into select的物理计划时, 执行到preinsert算子报错了,
原因是在生成自增列值的过程中无法找到对应的表id, 如下图所示
image

@ouyuanning @aptend

@aptend
Copy link
Contributor

aptend commented Nov 15, 2024

执行创建索引语句时,会有一下步骤:

  1. 检查索引表名是否已经存在,如果存在就报错, 如果不存在就执行步骤2
  2. 调用txnDatabase.Create()接口方法,在当前事务中创建索引表对应的relation
  3. 如果索引表有自增列,自增列表中插入目标表的自增列信息
  4. 往索引表中填入数据, 构建insert into select * from语句,通过调用TxnExecutor内部执行器,执行该insert语句
    以上步骤全部成功后,索引即可创建成功

通过日志分析,发现步骤1,步骤2,步骤3均已执行成功,索引表创建成功后,也可以获取对应的relation,但是执行步骤4时失败报错, 也就是说,索引表的表结构创建成功了,但是往索引表中insert数据时报错, 通过日志看到,内部执行器TxnExecutor在运行insert into select的物理计划时, 执行到preinsert算子报错了, 原因是在生成自增列值的过程中无法找到对应的表id, 如下图所示 image

第三步插入自增列信息的 txnid 和第四步读取的 txnid 不同,属于不同事务。所以查不到

@jensenojs
Copy link
Contributor

jensenojs commented Nov 19, 2024

执行创建索引语句时,会有一下步骤:

  1. 检查索引表名是否已经存在,如果存在就报错, 如果不存在就执行步骤2
  2. 调用txnDatabase.Create()接口方法,在当前事务中创建索引表对应的relation
  3. 如果索引表有自增列,自增列表中插入目标表的自增列信息
  4. 往索引表中填入数据, 构建insert into select * from语句,通过调用TxnExecutor内部执行器,执行该insert语句
    以上步骤全部成功后,索引即可创建成功

通过日志分析,发现步骤1,步骤2,步骤3均已执行成功,索引表创建成功后,也可以获取对应的relation,但是执行步骤4时失败报错, 也就是说,索引表的表结构创建成功了,但是往索引表中insert数据时报错, 通过日志看到,内部执行器TxnExecutor在运行insert into select的物理计划时, 执行到preinsert算子报错了, 原因是在生成自增列值的过程中无法找到对应的表id, 如下图所示 image

@ouyuanning @aptend

  • CN1上执行到第三步 : 自增列表中插入目标表的自增列信息的时候
    • incr-service将其对应的tableID存在内部的一个map
    • 由于本事务还没有提交, 因此这个tableID(暂名为xxx)通过SQL去查是查不到的, 👇就是喜亮哥日志中显示的, 和原来create fulltext index不一样的事务.
      select col_name, col_index, offset, step from mo_increment_columns where table_id = 272590 order by col_index
  • 这个SQL是在CN2上执行的, 现在看原因是insert into select的数据量规模达到一定程度, 所以将一部分的insert的工作分到了CN2上
    • 但由于CN2上的incr-service的map中没有xxx, 所以它只能通过后台SQL去查
    • 且由于CN1上的事务还没有提交, 所以查不到
image
  • mo启动方式
./mo-service -cfg etc/launch-with-proxy/log.toml > log.log & 
./mo-service -cfg etc/launch-with-proxy/tn.toml > tn.log & 
./mo-service -cfg etc/launch-with-proxy/cn1.toml > cn1.log & 
./mo-service -cfg etc/launch-with-proxy/cn2.toml > cn2.log & 
./mo-service -cfg etc/launch-with-proxy/proxy.toml > proxy.log &

@tom-csf
Copy link
Author

tom-csf commented Nov 20, 2024

多cn的事务的问题已经解决, 单个cn oom的问题另外在#20213 跟踪

@tom-csf tom-csf closed this as completed Nov 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug Something isn't working phase/testing severity/s0 Extreme impact: Cause the application to break down and seriously affect the use
Projects
None yet
Development

No branches or pull requests

7 participants