【标题】3.0.5[fixbug]修复truncate句柄残留时,空间不释放给OS的问题

【实现内容】:mdunlink时先做truncate,后释放

【根因分析】:

  1. 在多session并发执行时,其中一个session执行truncate,在commit阶段会构造invalid message给其他session消费
  2. 其他session会在下一个事务开始时消费这个invalid message,结合vfd机制,在下一个事务开始前这个session会一直持有relationsmgr的句柄
  3. 在执行truncate的session上对于main fork的数据文件是先做了truncate,再通过checkpoint去延迟删除(unlink)文件,但是对于其他段文件,是直接unlink的,如果句柄一直被持有,这个空间是不会还回给OS的
  4. 这种场景下如果有session是长事务或者长期悬挂,存储空间会捉襟见肘
    【实现方案】:
  5. 与PG看齐,除了MAIN_FORK之外的文件也先做truncate归还存储空间,再进行unlink
  6. !5035:[fixbug]修复truncate句柄残留时,空间不释放给OS的问题
    【关联需求或issue】:
    #I9BZF7:数据库truncate表后存储空间不释放问题
    【开发自验报告】:
  7. 请附上自验结果(内容或者截图)
    输入图片说明
  8. 是否可以添加fastcheck测试用例,如是,请补充fastcheck用例
  9. 是否涉及资料修改,如是,在docs仓库补充资料
  10. 是否考虑升级场景(系统表修改、日志持久化以及修改执行态数据格式)
  11. 是否考虑在线扩容等扩展场景
  12. 是否考虑异常场景/并发场景/前向兼容/性能场景
  13. 是否对其他模块产生影响

【其他说明】: