You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by "mymeiyi (via GitHub)" <gi...@apache.org> on 2026/03/09 03:14:56 UTC

[PR] [fix](wal) rename wal_reader and move to wal directory [doris]

mymeiyi opened a new pull request, #61135:
URL: https://github.com/apache/doris/pull/61135

   ### What problem does this PR solve?
   
   Issue Number: close #xxx
   
   Related PR: #xxx
   
   Problem Summary:
   
   ### Release note
   
   None
   
   ### Check List (For Author)
   
   - Test <!-- At least one of them must be included. -->
       - [ ] Regression test
       - [ ] Unit Test
       - [ ] Manual test (add detailed scripts or steps below)
       - [ ] No need to test or manual test. Explain why:
           - [ ] This is a refactor/code format and no logic has been changed.
           - [ ] Previous test can cover this change.
           - [ ] No code files have been changed.
           - [ ] Other reason <!-- Add your reason?  -->
   
   - Behavior changed:
       - [ ] No.
       - [ ] Yes. <!-- Explain the behavior change -->
   
   - Does this need documentation?
       - [ ] No.
       - [ ] Yes. <!-- Add document PR link here. eg: https://github.com/apache/doris-website/pull/1214 -->
   
   ### Check List (For Reviewer who merge this PR)
   
   - [ ] Confirm the release note
   - [ ] Confirm test cases
   - [ ] Confirm document
   - [ ] Add branch pick label <!-- Add branch pick label that this PR should merge into -->
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "doris-robot (via GitHub)" <gi...@apache.org>.
doris-robot commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020937443

   
   <details>
   <summary>TPC-H: <b>Total hot run time: 27741 ms</b></summary>
   
   ```
   machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
   scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
   Tpch sf100 test result on commit b611fd3548e53e46723e1f3fa3757877333f4e10, data reload: false
   
   ------ Round 1 ----------------------------------
   ============================================
   q1	17663	4541	4317	4317
   q2	q3	10647	770	517	517
   q4	4672	361	256	256
   q5	7558	1208	1027	1027
   q6	171	174	144	144
   q7	769	834	677	677
   q8	9298	1484	1343	1343
   q9	4871	4772	4723	4723
   q10	6263	1929	1674	1674
   q11	478	260	261	260
   q12	690	570	486	486
   q13	18027	3012	2199	2199
   q14	242	237	226	226
   q15	903	810	806	806
   q16	739	716	686	686
   q17	740	855	415	415
   q18	6014	5451	5182	5182
   q19	1232	996	619	619
   q20	501	501	408	408
   q21	4724	2133	1491	1491
   q22	396	366	285	285
   Total cold run time: 96598 ms
   Total hot run time: 27741 ms
   
   ----- Round 2, with runtime_filter_mode=off -----
   ============================================
   q1	4715	4540	4545	4540
   q2	q3	3878	4345	3850	3850
   q4	893	1198	837	837
   q5	4095	4387	4321	4321
   q6	176	184	150	150
   q7	1814	1626	1516	1516
   q8	2525	2673	2748	2673
   q9	7560	7634	7323	7323
   q10	3773	3984	3598	3598
   q11	516	431	418	418
   q12	482	590	478	478
   q13	2660	3105	2302	2302
   q14	278	315	298	298
   q15	900	808	814	808
   q16	758	759	716	716
   q17	1185	1473	1378	1378
   q18	7139	6842	6695	6695
   q19	867	937	903	903
   q20	2100	2200	2022	2022
   q21	3984	3605	3284	3284
   q22	455	438	403	403
   Total cold run time: 50753 ms
   Total hot run time: 48513 ms
   ```
   </details>
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "doris-robot (via GitHub)" <gi...@apache.org>.
doris-robot commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020968251

   
   <details>
   <summary>TPC-DS: <b>Total hot run time: 153268 ms</b></summary>
   
   ```
   machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
   scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
   TPC-DS sf100 test result on commit b611fd3548e53e46723e1f3fa3757877333f4e10, data reload: false
   
   query5	4323	648	527	527
   query6	333	221	213	213
   query7	4229	467	264	264
   query8	371	242	234	234
   query9	8758	2730	2757	2730
   query10	493	390	360	360
   query11	7314	5874	5615	5615
   query12	187	127	119	119
   query13	1257	427	344	344
   query14	5649	3847	3584	3584
   query14_1	2819	2795	2823	2795
   query15	212	196	177	177
   query16	986	477	484	477
   query17	885	718	631	631
   query18	2447	467	361	361
   query19	221	213	186	186
   query20	134	134	137	134
   query21	222	143	126	126
   query22	4889	5051	4934	4934
   query23	16639	16095	15708	15708
   query23_1	15954	16074	15785	15785
   query24	7495	1727	1326	1326
   query24_1	1282	1258	1252	1252
   query25	566	492	433	433
   query26	1246	262	156	156
   query27	2781	482	285	285
   query28	4554	1864	1855	1855
   query29	839	584	502	502
   query30	314	250	215	215
   query31	1357	1283	1240	1240
   query32	82	75	81	75
   query33	523	341	294	294
   query34	937	922	553	553
   query35	665	704	612	612
   query36	1104	1122	949	949
   query37	141	98	81	81
   query38	2948	2938	2849	2849
   query39	894	885	865	865
   query39_1	832	820	827	820
   query40	273	154	138	138
   query41	64	58	56	56
   query42	294	296	296	296
   query43	237	251	237	237
   query44	
   query45	192	195	182	182
   query46	891	991	605	605
   query47	2119	2130	2031	2031
   query48	310	311	227	227
   query49	629	459	374	374
   query50	685	270	209	209
   query51	4102	4097	4063	4063
   query52	285	291	281	281
   query53	286	331	275	275
   query54	311	262	272	262
   query55	93	89	89	89
   query56	334	341	312	312
   query57	1350	1342	1270	1270
   query58	283	284	270	270
   query59	1376	1463	1315	1315
   query60	336	337	311	311
   query61	149	143	141	141
   query62	626	608	528	528
   query63	307	276	278	276
   query64	5047	1285	1014	1014
   query65	
   query66	1463	459	348	348
   query67	16369	16394	16307	16307
   query68	
   query69	392	320	292	292
   query70	1019	940	955	940
   query71	347	310	296	296
   query72	2797	2707	2466	2466
   query73	550	587	328	328
   query74	10015	9930	9839	9839
   query75	2880	2773	2471	2471
   query76	2272	1032	687	687
   query77	363	379	309	309
   query78	11231	11351	10650	10650
   query79	1242	808	584	584
   query80	1367	609	549	549
   query81	584	288	251	251
   query82	1006	153	115	115
   query83	337	262	239	239
   query84	303	124	95	95
   query85	915	497	447	447
   query86	430	329	299	299
   query87	3171	3070	3001	3001
   query88	3539	2666	2657	2657
   query89	422	373	348	348
   query90	2047	175	174	174
   query91	169	158	139	139
   query92	77	76	66	66
   query93	1004	832	505	505
   query94	629	327	293	293
   query95	600	348	323	323
   query96	641	521	229	229
   query97	2448	2521	2408	2408
   query98	229	220	219	219
   query99	1012	1014	920	920
   Total cold run time: 234229 ms
   Total hot run time: 153268 ms
   ```
   </details>
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020852534

   PR approved by anyone and no changes requested.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "Copilot (via GitHub)" <gi...@apache.org>.
Copilot commented on code in PR #61135:
URL: https://github.com/apache/doris/pull/61135#discussion_r2902992207


##########
be/src/load/group_commit/wal/wal_reader.cpp:
##########
@@ -15,144 +15,110 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "load/group_commit/wal/wal_reader.h"
+#include "wal_reader.h"
 
-#include <crc32c/crc32c.h>
+#include <absl/strings/str_split.h>
 
-#include <string_view>
-#include <utility>
+#include "agent/be_exec_version_manager.h"
+#include "common/logging.h"
+#include "core/block/block.h"
+#include "cpp/sync_point.h"
+#include "load/group_commit/wal/wal_manager.h"
+#include "runtime/runtime_state.h"
 
-#include "common/status.h"
-#include "io/fs/file_reader.h"
-#include "io/fs/file_system.h"
-#include "io/fs/path.h"
-#include "load/group_commit/wal/wal_writer.h"
-#include "util/coding.h"
-#include "util/string_util.h"
-
-namespace doris {
-
-WalReader::WalReader(const std::string& file_name) : _file_name(file_name), _offset(0) {}
-
-WalReader::~WalReader() = default;
-Status WalReader::_deserialize(PBlock& block, const std::string& buf, size_t block_len,
-                               size_t bytes_read) {
-    if (UNLIKELY(!block.ParseFromString(buf))) {
-        return Status::InternalError(
-                "failed to deserialize row, file_size=" + std::to_string(file_reader->size()) +
-                ", read_offset=" + std::to_string(_offset) + +", block_bytes=" +
-                std::to_string(block_len) + ", read_block_bytes=" + std::to_string(bytes_read));
-    }
-    return Status::OK();
+namespace doris::vectorized {
+#include "common/compile_check_begin.h"
+WalReader::WalReader(RuntimeState* state) : _state(state) {
+    _wal_id = state->wal_id();
 }
 
-std::pair<int64_t, int64_t> parse_db_tb_from_wal_path(const std::string& wal_path) {
-    auto ret = split(wal_path, "/");
-    DCHECK_GT(ret.size(), 3);
-    auto db_id_pos = ret.size() - 1 - 2;
-    auto tb_id_pos = ret.size() - 1 - 1;
-    auto db_id = std::stoll(ret[db_id_pos]);
-    auto tb_id = std::stoll(ret[tb_id_pos]);
-
-    return {db_id, tb_id};
-}
-
-Status WalReader::init() {
-    auto [db_id, tb_id] = parse_db_tb_from_wal_path(_file_name);
-    io::FileSystemSPtr fs;
-    RETURN_IF_ERROR(determine_wal_fs(db_id, tb_id, fs));
-    bool exists = false;
-    RETURN_IF_ERROR(fs->exists(_file_name, &exists));
-    if (!exists) {
-        LOG(WARNING) << "not exist wal= " << _file_name;
-        return Status::NotFound("wal {} doesn't exist", _file_name);
-    }
-    RETURN_IF_ERROR(fs->open_file(_file_name, &file_reader));
-
+Status WalReader::init_reader(const TupleDescriptor* tuple_descriptor) {
+    _tuple_descriptor = tuple_descriptor;
+    RETURN_IF_ERROR(_state->exec_env()->wal_mgr()->get_wal_path(_wal_id, _wal_path));
+    _wal_reader = std::make_shared<doris::WalFileReader>(_wal_path);
+    RETURN_IF_ERROR(_wal_reader->init());
     return Status::OK();
 }
 
-Status WalReader::finalize() {
-    if (file_reader) {
-        return file_reader->close();
-    }
-    return Status::OK();
-}
-
-Status WalReader::read_block(PBlock& block) {
-    if (_offset >= file_reader->size()) {
-        return Status::EndOfFile("end of wal file");
+Status WalReader::get_next_block(Block* block, size_t* read_rows, bool* eof) {
+    //read src block
+    PBlock pblock;
+    auto st = _wal_reader->read_block(pblock);
+    if (st.is<ErrorCode::END_OF_FILE>()) {
+        LOG(INFO) << "read eof on wal:" << _wal_path;
+        *read_rows = 0;
+        *eof = true;
+        return Status::OK();
     }
-    size_t bytes_read = 0;
-    uint8_t row_len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {row_len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t block_len = decode_fixed64_le(row_len_buf);
-    if (block_len == 0) {
-        return Status::DataQualityError("fail to read wal {} ,block is empty", _file_name);
+    if (!st.ok()) {
+        LOG(WARNING) << "Failed to read wal on path = " << _wal_path;
+        return st;
     }
-    if (_offset == file_reader->size()) {
-        LOG(WARNING) << "need read block with length=" << block_len << ", but offset=" << _offset
-                     << " reached end of WAL (path=" << _file_name
-                     << ", size=" << file_reader->size() << ")";
-        return Status::EndOfFile("end of wal file");
+    int be_exec_version = pblock.has_be_exec_version() ? pblock.be_exec_version() : 0;
+    if (!BeExecVersionManager::check_be_exec_version(be_exec_version)) {
+        return Status::DataQualityError("check be exec version fail when reading wal file {}",
+                                        _wal_path);
     }
-    // read block
-    std::string block_buf;
-    block_buf.resize(block_len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {block_buf.c_str(), block_len}, &bytes_read));
-    RETURN_IF_ERROR(_deserialize(block, block_buf, block_len, bytes_read));
-    _offset += block_len;
-    // checksum
-    uint8_t checksum_len_buf[WalWriter::CHECKSUM_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {checksum_len_buf, WalWriter::CHECKSUM_SIZE},
-                                         &bytes_read));
-    _offset += WalWriter::CHECKSUM_SIZE;
-    uint32_t checksum = decode_fixed32_le(checksum_len_buf);
-    RETURN_IF_ERROR(_check_checksum(block_buf.data(), block_len, checksum));
-    return Status::OK();
-}
-
-Status WalReader::read_header(uint32_t& version, std::string& col_ids) {
-    if (file_reader->size() == 0) {
-        return Status::DataQualityError("empty file");
-    }
-    size_t bytes_read = 0;
-    std::string magic_str;
-    magic_str.resize(k_wal_magic_length);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, magic_str, &bytes_read));
-    if (strcmp(magic_str.c_str(), k_wal_magic) != 0) {
-        return Status::Corruption("Bad wal file {}: magic number not match", _file_name);
+    Block src_block;
+    size_t uncompressed_size = 0;
+    int64_t uncompressed_time = 0;
+    RETURN_IF_ERROR(src_block.deserialize(pblock, &uncompressed_size, &uncompressed_time));
+    //convert to dst block
+    Block dst_block;
+    int index = 0;
+    auto output_block_columns = block->get_columns_with_type_and_name();
+    size_t output_block_column_size = output_block_columns.size();
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_column_id_count", &_column_id_count);
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_out_block_column_size", &output_block_column_size);
+    if (_column_id_count != src_block.columns() ||
+        output_block_column_size != _tuple_descriptor->slots().size()) {
+        return Status::InternalError(
+                "not equal wal _column_id_count={} vs wal block columns size={}, "
+                "output block columns size={} vs tuple_descriptor size={}",
+                std::to_string(_column_id_count), std::to_string(src_block.columns()),
+                std::to_string(output_block_column_size),
+                std::to_string(_tuple_descriptor->slots().size()));
     }
-    _offset += k_wal_magic_length;
-    uint8_t version_buf[WalWriter::VERSION_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {version_buf, WalWriter::VERSION_SIZE}, &bytes_read));
-    _offset += WalWriter::VERSION_SIZE;
-    version = decode_fixed32_le(version_buf);
-    uint8_t len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t len = decode_fixed64_le(len_buf);
-    col_ids.resize(len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, col_ids, &bytes_read));
-    _offset += len;
-    if (len != bytes_read) {
-        return Status::InternalError("failed to read header expected= " + std::to_string(len) +
-                                     ",actually=" + std::to_string(bytes_read));
+    for (auto* slot_desc : _tuple_descriptor->slots()) {
+        auto pos = _column_pos_map[slot_desc->col_unique_id()];
+        if (pos >= src_block.columns()) {
+            return Status::InternalError("read wal {} fail, pos {}, columns size {}", _wal_path,
+                                         pos, src_block.columns());
+        }
+        vectorized::ColumnPtr column_ptr = src_block.get_by_position(pos).column;
+        if (!column_ptr && slot_desc->is_nullable()) {

Review Comment:
   `make_nullable()` dereferences its argument; calling it with a null `column_ptr` will crash. If a WAL column can be absent/null here, construct an all-NULL column of the expected type/row count instead; otherwise, remove the null check and assert the column is always present.
   ```suggestion
           if (!column_ptr) {
               // WAL column is absent; create an all-NULL column with the expected type and row count.
               auto& type = output_block_columns[index].type;
               column_ptr = type->create_column();
               column_ptr->insert_many_defaults(src_block.rows());
           } else if (slot_desc->is_nullable()) {
   ```



##########
be/src/load/group_commit/wal/wal_reader.h:
##########
@@ -16,32 +16,41 @@
 // under the License.
 
 #pragma once
+#include "format/generic_reader.h"
+#include "load/group_commit/wal/wal_file_reader.h"
+#include "runtime/descriptors.h"
 
-#include <gen_cpp/internal_service.pb.h>
+namespace doris::vectorized {
+#include "common/compile_check_begin.h"
+struct ScannerCounter;
+class WalReader : public GenericReader {
+    ENABLE_FACTORY_CREATOR(WalReader);
 
-#include "common/status.h"
-#include "io/fs/file_reader_writer_fwd.h"
-
-namespace doris {
-
-class WalReader {
 public:
-    explicit WalReader(const std::string& file_name);
-    ~WalReader();
-
-    Status init();
-    Status finalize();
-
-    Status read_block(PBlock& block);
-    Status read_header(uint32_t& version, std::string& col_ids);
+    WalReader(RuntimeState* state);
+    ~WalReader() override = default;
+    Status init_reader(const TupleDescriptor* tuple_descriptor);
+    Status get_next_block(Block* block, size_t* read_rows, bool* eof) override;

Review Comment:
   `WalReader`'s public API uses `RuntimeState*`, but this header doesn't declare `RuntimeState` (nor include `runtime/runtime_state.h`). This can break any TU that includes this header without already forward-declaring `RuntimeState` (e.g. `wal_manager.h` includes it). Add a forward declaration for `doris::RuntimeState` (preferred) or include the defining header.



##########
be/src/load/group_commit/wal/wal_reader.cpp:
##########
@@ -15,144 +15,110 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "load/group_commit/wal/wal_reader.h"
+#include "wal_reader.h"
 
-#include <crc32c/crc32c.h>
+#include <absl/strings/str_split.h>
 
-#include <string_view>
-#include <utility>
+#include "agent/be_exec_version_manager.h"
+#include "common/logging.h"
+#include "core/block/block.h"
+#include "cpp/sync_point.h"
+#include "load/group_commit/wal/wal_manager.h"
+#include "runtime/runtime_state.h"
 
-#include "common/status.h"
-#include "io/fs/file_reader.h"
-#include "io/fs/file_system.h"
-#include "io/fs/path.h"
-#include "load/group_commit/wal/wal_writer.h"
-#include "util/coding.h"
-#include "util/string_util.h"
-
-namespace doris {
-
-WalReader::WalReader(const std::string& file_name) : _file_name(file_name), _offset(0) {}
-
-WalReader::~WalReader() = default;
-Status WalReader::_deserialize(PBlock& block, const std::string& buf, size_t block_len,
-                               size_t bytes_read) {
-    if (UNLIKELY(!block.ParseFromString(buf))) {
-        return Status::InternalError(
-                "failed to deserialize row, file_size=" + std::to_string(file_reader->size()) +
-                ", read_offset=" + std::to_string(_offset) + +", block_bytes=" +
-                std::to_string(block_len) + ", read_block_bytes=" + std::to_string(bytes_read));
-    }
-    return Status::OK();
+namespace doris::vectorized {
+#include "common/compile_check_begin.h"
+WalReader::WalReader(RuntimeState* state) : _state(state) {
+    _wal_id = state->wal_id();
 }
 
-std::pair<int64_t, int64_t> parse_db_tb_from_wal_path(const std::string& wal_path) {
-    auto ret = split(wal_path, "/");
-    DCHECK_GT(ret.size(), 3);
-    auto db_id_pos = ret.size() - 1 - 2;
-    auto tb_id_pos = ret.size() - 1 - 1;
-    auto db_id = std::stoll(ret[db_id_pos]);
-    auto tb_id = std::stoll(ret[tb_id_pos]);
-
-    return {db_id, tb_id};
-}
-
-Status WalReader::init() {
-    auto [db_id, tb_id] = parse_db_tb_from_wal_path(_file_name);
-    io::FileSystemSPtr fs;
-    RETURN_IF_ERROR(determine_wal_fs(db_id, tb_id, fs));
-    bool exists = false;
-    RETURN_IF_ERROR(fs->exists(_file_name, &exists));
-    if (!exists) {
-        LOG(WARNING) << "not exist wal= " << _file_name;
-        return Status::NotFound("wal {} doesn't exist", _file_name);
-    }
-    RETURN_IF_ERROR(fs->open_file(_file_name, &file_reader));
-
+Status WalReader::init_reader(const TupleDescriptor* tuple_descriptor) {
+    _tuple_descriptor = tuple_descriptor;
+    RETURN_IF_ERROR(_state->exec_env()->wal_mgr()->get_wal_path(_wal_id, _wal_path));
+    _wal_reader = std::make_shared<doris::WalFileReader>(_wal_path);
+    RETURN_IF_ERROR(_wal_reader->init());
     return Status::OK();
 }
 
-Status WalReader::finalize() {
-    if (file_reader) {
-        return file_reader->close();
-    }
-    return Status::OK();
-}
-
-Status WalReader::read_block(PBlock& block) {
-    if (_offset >= file_reader->size()) {
-        return Status::EndOfFile("end of wal file");
+Status WalReader::get_next_block(Block* block, size_t* read_rows, bool* eof) {
+    //read src block
+    PBlock pblock;
+    auto st = _wal_reader->read_block(pblock);
+    if (st.is<ErrorCode::END_OF_FILE>()) {
+        LOG(INFO) << "read eof on wal:" << _wal_path;
+        *read_rows = 0;
+        *eof = true;
+        return Status::OK();
     }
-    size_t bytes_read = 0;
-    uint8_t row_len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {row_len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t block_len = decode_fixed64_le(row_len_buf);
-    if (block_len == 0) {
-        return Status::DataQualityError("fail to read wal {} ,block is empty", _file_name);
+    if (!st.ok()) {
+        LOG(WARNING) << "Failed to read wal on path = " << _wal_path;
+        return st;
     }
-    if (_offset == file_reader->size()) {
-        LOG(WARNING) << "need read block with length=" << block_len << ", but offset=" << _offset
-                     << " reached end of WAL (path=" << _file_name
-                     << ", size=" << file_reader->size() << ")";
-        return Status::EndOfFile("end of wal file");
+    int be_exec_version = pblock.has_be_exec_version() ? pblock.be_exec_version() : 0;
+    if (!BeExecVersionManager::check_be_exec_version(be_exec_version)) {
+        return Status::DataQualityError("check be exec version fail when reading wal file {}",
+                                        _wal_path);
     }
-    // read block
-    std::string block_buf;
-    block_buf.resize(block_len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {block_buf.c_str(), block_len}, &bytes_read));
-    RETURN_IF_ERROR(_deserialize(block, block_buf, block_len, bytes_read));
-    _offset += block_len;
-    // checksum
-    uint8_t checksum_len_buf[WalWriter::CHECKSUM_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {checksum_len_buf, WalWriter::CHECKSUM_SIZE},
-                                         &bytes_read));
-    _offset += WalWriter::CHECKSUM_SIZE;
-    uint32_t checksum = decode_fixed32_le(checksum_len_buf);
-    RETURN_IF_ERROR(_check_checksum(block_buf.data(), block_len, checksum));
-    return Status::OK();
-}
-
-Status WalReader::read_header(uint32_t& version, std::string& col_ids) {
-    if (file_reader->size() == 0) {
-        return Status::DataQualityError("empty file");
-    }
-    size_t bytes_read = 0;
-    std::string magic_str;
-    magic_str.resize(k_wal_magic_length);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, magic_str, &bytes_read));
-    if (strcmp(magic_str.c_str(), k_wal_magic) != 0) {
-        return Status::Corruption("Bad wal file {}: magic number not match", _file_name);
+    Block src_block;
+    size_t uncompressed_size = 0;
+    int64_t uncompressed_time = 0;
+    RETURN_IF_ERROR(src_block.deserialize(pblock, &uncompressed_size, &uncompressed_time));
+    //convert to dst block
+    Block dst_block;
+    int index = 0;
+    auto output_block_columns = block->get_columns_with_type_and_name();
+    size_t output_block_column_size = output_block_columns.size();
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_column_id_count", &_column_id_count);
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_out_block_column_size", &output_block_column_size);
+    if (_column_id_count != src_block.columns() ||
+        output_block_column_size != _tuple_descriptor->slots().size()) {
+        return Status::InternalError(
+                "not equal wal _column_id_count={} vs wal block columns size={}, "
+                "output block columns size={} vs tuple_descriptor size={}",
+                std::to_string(_column_id_count), std::to_string(src_block.columns()),
+                std::to_string(output_block_column_size),
+                std::to_string(_tuple_descriptor->slots().size()));
     }
-    _offset += k_wal_magic_length;
-    uint8_t version_buf[WalWriter::VERSION_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {version_buf, WalWriter::VERSION_SIZE}, &bytes_read));
-    _offset += WalWriter::VERSION_SIZE;
-    version = decode_fixed32_le(version_buf);
-    uint8_t len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t len = decode_fixed64_le(len_buf);
-    col_ids.resize(len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, col_ids, &bytes_read));
-    _offset += len;
-    if (len != bytes_read) {
-        return Status::InternalError("failed to read header expected= " + std::to_string(len) +
-                                     ",actually=" + std::to_string(bytes_read));
+    for (auto* slot_desc : _tuple_descriptor->slots()) {
+        auto pos = _column_pos_map[slot_desc->col_unique_id()];

Review Comment:
   Using `_column_pos_map[slot_desc->col_unique_id()]` will insert a default entry (pos=0) when the WAL header doesn't contain that column id, silently reading the wrong column. Use a lookup that doesn't mutate the map and return an error / record it in `missing_cols` when the id is absent.
   ```suggestion
           auto it = _column_pos_map.find(slot_desc->col_unique_id());
           if (it == _column_pos_map.end()) {
               return Status::InternalError("read wal {} fail, column id {} not found in header",
                                            _wal_path, slot_desc->col_unique_id());
           }
           auto pos = it->second;
   ```



##########
be/src/load/group_commit/wal/wal_reader.cpp:
##########
@@ -15,144 +15,110 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "load/group_commit/wal/wal_reader.h"
+#include "wal_reader.h"
 
-#include <crc32c/crc32c.h>
+#include <absl/strings/str_split.h>
 
-#include <string_view>
-#include <utility>
+#include "agent/be_exec_version_manager.h"
+#include "common/logging.h"
+#include "core/block/block.h"
+#include "cpp/sync_point.h"
+#include "load/group_commit/wal/wal_manager.h"
+#include "runtime/runtime_state.h"
 
-#include "common/status.h"
-#include "io/fs/file_reader.h"
-#include "io/fs/file_system.h"
-#include "io/fs/path.h"
-#include "load/group_commit/wal/wal_writer.h"
-#include "util/coding.h"
-#include "util/string_util.h"
-
-namespace doris {
-
-WalReader::WalReader(const std::string& file_name) : _file_name(file_name), _offset(0) {}
-
-WalReader::~WalReader() = default;
-Status WalReader::_deserialize(PBlock& block, const std::string& buf, size_t block_len,
-                               size_t bytes_read) {
-    if (UNLIKELY(!block.ParseFromString(buf))) {
-        return Status::InternalError(
-                "failed to deserialize row, file_size=" + std::to_string(file_reader->size()) +
-                ", read_offset=" + std::to_string(_offset) + +", block_bytes=" +
-                std::to_string(block_len) + ", read_block_bytes=" + std::to_string(bytes_read));
-    }
-    return Status::OK();
+namespace doris::vectorized {
+#include "common/compile_check_begin.h"
+WalReader::WalReader(RuntimeState* state) : _state(state) {
+    _wal_id = state->wal_id();
 }
 
-std::pair<int64_t, int64_t> parse_db_tb_from_wal_path(const std::string& wal_path) {
-    auto ret = split(wal_path, "/");
-    DCHECK_GT(ret.size(), 3);
-    auto db_id_pos = ret.size() - 1 - 2;
-    auto tb_id_pos = ret.size() - 1 - 1;
-    auto db_id = std::stoll(ret[db_id_pos]);
-    auto tb_id = std::stoll(ret[tb_id_pos]);
-
-    return {db_id, tb_id};
-}
-
-Status WalReader::init() {
-    auto [db_id, tb_id] = parse_db_tb_from_wal_path(_file_name);
-    io::FileSystemSPtr fs;
-    RETURN_IF_ERROR(determine_wal_fs(db_id, tb_id, fs));
-    bool exists = false;
-    RETURN_IF_ERROR(fs->exists(_file_name, &exists));
-    if (!exists) {
-        LOG(WARNING) << "not exist wal= " << _file_name;
-        return Status::NotFound("wal {} doesn't exist", _file_name);
-    }
-    RETURN_IF_ERROR(fs->open_file(_file_name, &file_reader));
-
+Status WalReader::init_reader(const TupleDescriptor* tuple_descriptor) {
+    _tuple_descriptor = tuple_descriptor;
+    RETURN_IF_ERROR(_state->exec_env()->wal_mgr()->get_wal_path(_wal_id, _wal_path));
+    _wal_reader = std::make_shared<doris::WalFileReader>(_wal_path);
+    RETURN_IF_ERROR(_wal_reader->init());
     return Status::OK();
 }
 
-Status WalReader::finalize() {
-    if (file_reader) {
-        return file_reader->close();
-    }
-    return Status::OK();
-}
-
-Status WalReader::read_block(PBlock& block) {
-    if (_offset >= file_reader->size()) {
-        return Status::EndOfFile("end of wal file");
+Status WalReader::get_next_block(Block* block, size_t* read_rows, bool* eof) {
+    //read src block
+    PBlock pblock;
+    auto st = _wal_reader->read_block(pblock);
+    if (st.is<ErrorCode::END_OF_FILE>()) {
+        LOG(INFO) << "read eof on wal:" << _wal_path;
+        *read_rows = 0;
+        *eof = true;
+        return Status::OK();
     }
-    size_t bytes_read = 0;
-    uint8_t row_len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {row_len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t block_len = decode_fixed64_le(row_len_buf);
-    if (block_len == 0) {
-        return Status::DataQualityError("fail to read wal {} ,block is empty", _file_name);
+    if (!st.ok()) {
+        LOG(WARNING) << "Failed to read wal on path = " << _wal_path;
+        return st;
     }
-    if (_offset == file_reader->size()) {
-        LOG(WARNING) << "need read block with length=" << block_len << ", but offset=" << _offset
-                     << " reached end of WAL (path=" << _file_name
-                     << ", size=" << file_reader->size() << ")";
-        return Status::EndOfFile("end of wal file");
+    int be_exec_version = pblock.has_be_exec_version() ? pblock.be_exec_version() : 0;
+    if (!BeExecVersionManager::check_be_exec_version(be_exec_version)) {
+        return Status::DataQualityError("check be exec version fail when reading wal file {}",
+                                        _wal_path);
     }
-    // read block
-    std::string block_buf;
-    block_buf.resize(block_len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {block_buf.c_str(), block_len}, &bytes_read));
-    RETURN_IF_ERROR(_deserialize(block, block_buf, block_len, bytes_read));
-    _offset += block_len;
-    // checksum
-    uint8_t checksum_len_buf[WalWriter::CHECKSUM_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {checksum_len_buf, WalWriter::CHECKSUM_SIZE},
-                                         &bytes_read));
-    _offset += WalWriter::CHECKSUM_SIZE;
-    uint32_t checksum = decode_fixed32_le(checksum_len_buf);
-    RETURN_IF_ERROR(_check_checksum(block_buf.data(), block_len, checksum));
-    return Status::OK();
-}
-
-Status WalReader::read_header(uint32_t& version, std::string& col_ids) {
-    if (file_reader->size() == 0) {
-        return Status::DataQualityError("empty file");
-    }
-    size_t bytes_read = 0;
-    std::string magic_str;
-    magic_str.resize(k_wal_magic_length);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, magic_str, &bytes_read));
-    if (strcmp(magic_str.c_str(), k_wal_magic) != 0) {
-        return Status::Corruption("Bad wal file {}: magic number not match", _file_name);
+    Block src_block;
+    size_t uncompressed_size = 0;
+    int64_t uncompressed_time = 0;
+    RETURN_IF_ERROR(src_block.deserialize(pblock, &uncompressed_size, &uncompressed_time));
+    //convert to dst block
+    Block dst_block;
+    int index = 0;
+    auto output_block_columns = block->get_columns_with_type_and_name();
+    size_t output_block_column_size = output_block_columns.size();
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_column_id_count", &_column_id_count);
+    TEST_SYNC_POINT_CALLBACK("WalReader::set_out_block_column_size", &output_block_column_size);
+    if (_column_id_count != src_block.columns() ||
+        output_block_column_size != _tuple_descriptor->slots().size()) {
+        return Status::InternalError(
+                "not equal wal _column_id_count={} vs wal block columns size={}, "
+                "output block columns size={} vs tuple_descriptor size={}",
+                std::to_string(_column_id_count), std::to_string(src_block.columns()),
+                std::to_string(output_block_column_size),
+                std::to_string(_tuple_descriptor->slots().size()));
     }
-    _offset += k_wal_magic_length;
-    uint8_t version_buf[WalWriter::VERSION_SIZE];
-    RETURN_IF_ERROR(
-            file_reader->read_at(_offset, {version_buf, WalWriter::VERSION_SIZE}, &bytes_read));
-    _offset += WalWriter::VERSION_SIZE;
-    version = decode_fixed32_le(version_buf);
-    uint8_t len_buf[WalWriter::LENGTH_SIZE];
-    RETURN_IF_ERROR(file_reader->read_at(_offset, {len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
-    _offset += WalWriter::LENGTH_SIZE;
-    size_t len = decode_fixed64_le(len_buf);
-    col_ids.resize(len);
-    RETURN_IF_ERROR(file_reader->read_at(_offset, col_ids, &bytes_read));
-    _offset += len;
-    if (len != bytes_read) {
-        return Status::InternalError("failed to read header expected= " + std::to_string(len) +
-                                     ",actually=" + std::to_string(bytes_read));
+    for (auto* slot_desc : _tuple_descriptor->slots()) {
+        auto pos = _column_pos_map[slot_desc->col_unique_id()];
+        if (pos >= src_block.columns()) {
+            return Status::InternalError("read wal {} fail, pos {}, columns size {}", _wal_path,
+                                         pos, src_block.columns());
+        }
+        vectorized::ColumnPtr column_ptr = src_block.get_by_position(pos).column;
+        if (!column_ptr && slot_desc->is_nullable()) {
+            column_ptr = make_nullable(column_ptr);
+        }
+        dst_block.insert(index, vectorized::ColumnWithTypeAndName(
+                                        std::move(column_ptr), output_block_columns[index].type,
+                                        output_block_columns[index].name));
+        index++;
     }
+    block->swap(dst_block);
+    *read_rows = block->rows();
+    VLOG_DEBUG << "read block rows:" << *read_rows;
     return Status::OK();
 }
 
-Status WalReader::_check_checksum(const char* binary, size_t size, uint32_t checksum) {
-    uint32_t computed_checksum = crc32c::Crc32c(binary, size);
-    if (LIKELY(computed_checksum == checksum)) {
-        return Status::OK();
+Status WalReader::get_columns(std::unordered_map<std::string, DataTypePtr>* name_to_type,
+                              std::unordered_set<std::string>* missing_cols) {
+    std::string col_ids;
+    RETURN_IF_ERROR(_wal_reader->read_header(_version, col_ids));
+    std::vector<std::string> column_id_vector =
+            absl::StrSplit(col_ids, ",", absl::SkipWhitespace());
+    _column_id_count = column_id_vector.size();
+    try {
+        int64_t pos = 0;
+        for (auto col_id_str : column_id_vector) {
+            auto col_id = std::strtoll(col_id_str.c_str(), nullptr, 10);
+            _column_pos_map.emplace(col_id, pos);
+            pos++;
+        }
+    } catch (const std::invalid_argument& e) {
+        return Status::InvalidArgument("Invalid format, {}", e.what());

Review Comment:
   `std::strtoll` doesn't throw `std::invalid_argument`, so the try/catch here is ineffective. If you need validation, parse with an end-pointer/errno check and return `InvalidArgument` when the entire token isn't a valid integer; also consider clearing `_column_pos_map` before filling to avoid stale entries if `get_columns()` is called more than once.



##########
be/src/load/group_commit/wal/wal_file_reader.cpp:
##########
@@ -0,0 +1,158 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "load/group_commit/wal/wal_file_reader.h"
+
+#include <crc32c/crc32c.h>
+
+#include <string_view>
+#include <utility>
+
+#include "common/status.h"
+#include "io/fs/file_reader.h"
+#include "io/fs/file_system.h"
+#include "io/fs/path.h"
+#include "load/group_commit/wal/wal_writer.h"
+#include "util/coding.h"
+#include "util/string_util.h"
+
+namespace doris {
+
+WalFileReader::WalFileReader(const std::string& file_name) : _file_name(file_name), _offset(0) {}
+
+WalFileReader::~WalFileReader() = default;
+Status WalFileReader::_deserialize(PBlock& block, const std::string& buf, size_t block_len,
+                                   size_t bytes_read) {
+    if (UNLIKELY(!block.ParseFromString(buf))) {
+        return Status::InternalError(
+                "failed to deserialize row, file_size=" + std::to_string(file_reader->size()) +
+                ", read_offset=" + std::to_string(_offset) + +", block_bytes=" +

Review Comment:
   `_deserialize()` builds an error string with `... + std::to_string(_offset) + + ", block_bytes=" + ...` (double `+`), which is a compile-time error. Remove the stray `+` so the concatenation is valid (or switch to a formatter to avoid manual concatenation).
   ```suggestion
                   ", read_offset=" + std::to_string(_offset) + ", block_bytes=" +
   ```



##########
be/src/load/group_commit/wal/wal_file_reader.cpp:
##########
@@ -0,0 +1,158 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "load/group_commit/wal/wal_file_reader.h"
+
+#include <crc32c/crc32c.h>
+
+#include <string_view>
+#include <utility>
+
+#include "common/status.h"
+#include "io/fs/file_reader.h"
+#include "io/fs/file_system.h"
+#include "io/fs/path.h"
+#include "load/group_commit/wal/wal_writer.h"
+#include "util/coding.h"
+#include "util/string_util.h"
+
+namespace doris {
+
+WalFileReader::WalFileReader(const std::string& file_name) : _file_name(file_name), _offset(0) {}
+
+WalFileReader::~WalFileReader() = default;
+Status WalFileReader::_deserialize(PBlock& block, const std::string& buf, size_t block_len,
+                                   size_t bytes_read) {
+    if (UNLIKELY(!block.ParseFromString(buf))) {
+        return Status::InternalError(
+                "failed to deserialize row, file_size=" + std::to_string(file_reader->size()) +
+                ", read_offset=" + std::to_string(_offset) + +", block_bytes=" +
+                std::to_string(block_len) + ", read_block_bytes=" + std::to_string(bytes_read));
+    }
+    return Status::OK();
+}
+
+std::pair<int64_t, int64_t> parse_db_tb_from_wal_path(const std::string& wal_path) {
+    auto ret = split(wal_path, "/");
+    DCHECK_GT(ret.size(), 3);
+    auto db_id_pos = ret.size() - 1 - 2;
+    auto tb_id_pos = ret.size() - 1 - 1;
+    auto db_id = std::stoll(ret[db_id_pos]);
+    auto tb_id = std::stoll(ret[tb_id_pos]);
+
+    return {db_id, tb_id};
+}
+
+Status WalFileReader::init() {
+    auto [db_id, tb_id] = parse_db_tb_from_wal_path(_file_name);
+    io::FileSystemSPtr fs;
+    RETURN_IF_ERROR(determine_wal_fs(db_id, tb_id, fs));
+    bool exists = false;
+    RETURN_IF_ERROR(fs->exists(_file_name, &exists));
+    if (!exists) {
+        LOG(WARNING) << "not exist wal= " << _file_name;
+        return Status::NotFound("wal {} doesn't exist", _file_name);
+    }
+    RETURN_IF_ERROR(fs->open_file(_file_name, &file_reader));
+
+    return Status::OK();
+}
+
+Status WalFileReader::finalize() {
+    if (file_reader) {
+        return file_reader->close();
+    }
+    return Status::OK();
+}
+
+Status WalFileReader::read_block(PBlock& block) {
+    if (_offset >= file_reader->size()) {
+        return Status::EndOfFile("end of wal file");
+    }
+    size_t bytes_read = 0;
+    uint8_t row_len_buf[WalWriter::LENGTH_SIZE];
+    RETURN_IF_ERROR(
+            file_reader->read_at(_offset, {row_len_buf, WalWriter::LENGTH_SIZE}, &bytes_read));
+    _offset += WalWriter::LENGTH_SIZE;
+    size_t block_len = decode_fixed64_le(row_len_buf);
+    if (block_len == 0) {
+        return Status::DataQualityError("fail to read wal {} ,block is empty", _file_name);
+    }
+    if (_offset == file_reader->size()) {
+        LOG(WARNING) << "need read block with length=" << block_len << ", but offset=" << _offset
+                     << " reached end of WAL (path=" << _file_name
+                     << ", size=" << file_reader->size() << ")";
+        return Status::EndOfFile("end of wal file");
+    }
+    // read block
+    std::string block_buf;
+    block_buf.resize(block_len);
+    RETURN_IF_ERROR(file_reader->read_at(_offset, {block_buf.c_str(), block_len}, &bytes_read));

Review Comment:
   `read_at()` writes into the provided buffer, but `block_buf.c_str()` returns a pointer to a const, null-terminated view of the string. Writing through it relies on `const_cast` and is undefined behavior per the C++ standard; use a mutable buffer pointer from the string (e.g., its writable data) instead.
   ```suggestion
       RETURN_IF_ERROR(file_reader->read_at(_offset, {block_buf.data(), block_len}, &bytes_read));
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "mymeiyi (via GitHub)" <gi...@apache.org>.
mymeiyi commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020842784

   run buildall


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "yiguolei (via GitHub)" <gi...@apache.org>.
yiguolei merged PR #61135:
URL: https://github.com/apache/doris/pull/61135


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "hello-stephen (via GitHub)" <gi...@apache.org>.
hello-stephen commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020869952

   skip buildall


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "hello-stephen (via GitHub)" <gi...@apache.org>.
hello-stephen commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020821293

   
   Thank you for your contribution to Apache Doris.
   Don't know what should be done next? See [How to process your PR](https://cwiki.apache.org/confluence/display/DORIS/How+to+process+your+PR).
   
   Please clearly describe your PR:
   1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
   2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
   3. What features were added. Why was this function added?
   4. Which code was refactored and why was this part of the code refactored?
   5. Which functions were optimized and what is the difference before and after the optimization?
       


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


Re: [PR] [fix](wal) rename wal_reader and move to wal directory [doris]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #61135:
URL: https://github.com/apache/doris/pull/61135#issuecomment-4020852455

   PR approved by at least one committer and no changes requested.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org