Skip to content

Commit bd3ee3a

Browse files
committed
MDEV-34614 mysqlbinlog warn on EOF before GTID in --stop-position
This commit adds warnings for `--stop-position` GTIDs that were not reached at EOF, mainly as a follow-up to MDEV-27037 “Mysqlbinlog should output a warning if EOF is found before its stop condition” `--stop-position` warnings inform possible mistakes in the input, especially for progress reporting of scripts/wrappers. MDEV-34614 enhances MDEV-27037 with individualized GTID validation, for GTID range selection weren’t in all versions that MDEV-27037 targeted. The `Gtid_event_filter` family provides the the warning mechanism polymorphically and through the new public method `verify_completed_state`. This design is hierarchically extensible (e.g., to `--ignore-server-ids`). This commit also includes minor touchups: * `rpl_gtid.cc`: adjust cases when a `Window_gtid_event_filter` has only one of `--start-` and `--stop-position` (without intensive refactors) * `rpl_gtid.cc`: function docs improvements * `rpl_gtid.h`: Remove unimplemented, red-herring function prototype `Window_gtid_event_filter::verify_gtid_is_expected` Reviewed-by: Brandon Nesterenko <brandon.nesterenko@mariadb.com>
1 parent d9bb59e commit bd3ee3a

7 files changed

+410
-21
lines changed

client/mysqlbinlog.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3711,7 +3711,8 @@ int main(int argc, char** argv)
37113711
}
37123712

37133713
/*
3714-
Emit a warning if we finished processing input before reaching the stop
3714+
Emit warning(s) (in Gtid_event_filter::verify_completed_state() for GTID(s))
3715+
if we finished processing input before reaching the stop
37153716
boundaries indicated by --stop-datetime or --stop-position.
37163717
*/
37173718
if (stop_datetime != MY_TIME_T_MAX &&
@@ -3722,6 +3723,8 @@ int main(int argc, char** argv)
37223723
stop_position > last_processed_ev.position)
37233724
warning("Did not reach stop position %llu before end of input",
37243725
stop_position);
3726+
if (position_gtid_filter)
3727+
position_gtid_filter->verify_final_state();
37253728

37263729
/*
37273730
If enable flashback, need to print the events from the end to the
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
#
2+
# Clear the existing binary log state.
3+
#
4+
RESET MASTER;
5+
SET @@SESSION.gtid_domain_id= 0;
6+
SET @@SESSION.server_id= 1;
7+
SET @@SESSION.gtid_seq_no= 1;
8+
create table t1 (a int);
9+
insert into t1 values (1);
10+
SET @@SESSION.gtid_domain_id= 1;
11+
insert into t1 values (2);
12+
flush binary logs;
13+
insert into t1 values (3);
14+
# Tag binlog_f2_mid
15+
insert into t1 values (4);
16+
insert into t1 values (5);
17+
SET @@SESSION.gtid_domain_id= 0;
18+
insert into t1 values (6);
19+
insert into t1 values (7);
20+
flush binary logs;
21+
drop table t1;
22+
# Ensuring binary log order is correct
23+
#
24+
#
25+
# Test using --read-from-remote-server
26+
#
27+
connection default;
28+
#
29+
# --stop-position tests
30+
#
31+
# Case 1.a) With one binlog file, a --stop-position before the end of
32+
# the file should not result in a warning
33+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
34+
#
35+
# Case 1.b) With one binlog file, a --stop-position at the exact end of
36+
# the file should not result in a warning
37+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f1_end binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
38+
#
39+
# Case 1.c) With one binlog file, a --stop-position past the end of the
40+
# file should(!) result in a warning
41+
# MYSQL_BINLOG --read-from-remote-server --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
42+
WARNING: Did not reach stop position 1-1-2 before end of input
43+
#
44+
# Case 2.a) With two binlog files, a --stop-position targeting b2 which
45+
# exists in the size of b1 should:
46+
# 1) not provide any warnings
47+
# 2) not prevent b2 from outputting its desired events before the
48+
# stop position
49+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
50+
include/assert_grep.inc [Ensure all intended GTIDs are present]
51+
include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present]
52+
#
53+
# Case 2.b) With two binlog files, a --stop-position targeting the end
54+
# of binlog 2 should:
55+
# 1) not provide any warnings
56+
# 2) not prevent b2 from outputting its entire binary log
57+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
58+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
59+
include/assert_grep.inc [Ensure the last GTID binlogged is present]
60+
#
61+
# Case 2.c) With two binlog files, a --stop-position targeting beyond
62+
# the eof of binlog 2 should:
63+
# 1) provide a warning that the stop position was not reached
64+
# 2) not prevent b2 from outputting its entire binary log
65+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
66+
WARNING: Did not reach stop position 0-1-5 before end of input
67+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
68+
#
69+
#
70+
# Test using local binlog files
71+
#
72+
connection default;
73+
#
74+
# --stop-position tests
75+
#
76+
# Case 1.a) With one binlog file, a --stop-position before the end of
77+
# the file should not result in a warning
78+
# MYSQL_BINLOG --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
79+
#
80+
# Case 1.b) With one binlog file, a --stop-position at the exact end of
81+
# the file should not result in a warning
82+
# MYSQL_BINLOG --stop-position=binlog_f1_end binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
83+
#
84+
# Case 1.c) With one binlog file, a --stop-position past the end of the
85+
# file should(!) result in a warning
86+
# MYSQL_BINLOG --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
87+
WARNING: Did not reach stop position 1-1-2 before end of input
88+
#
89+
# Case 2.a) With two binlog files, a --stop-position targeting b2 which
90+
# exists in the size of b1 should:
91+
# 1) not provide any warnings
92+
# 2) not prevent b2 from outputting its desired events before the
93+
# stop position
94+
# MYSQL_BINLOG --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
95+
include/assert_grep.inc [Ensure all intended GTIDs are present]
96+
include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present]
97+
#
98+
# Case 2.b) With two binlog files, a --stop-position targeting the end
99+
# of binlog 2 should:
100+
# 1) not provide any warnings
101+
# 2) not prevent b2 from outputting its entire binary log
102+
# MYSQL_BINLOG --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
103+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
104+
include/assert_grep.inc [Ensure the last GTID binlogged is present]
105+
#
106+
# Case 2.c) With two binlog files, a --stop-position targeting beyond
107+
# the eof of binlog 2 should:
108+
# 1) provide a warning that the stop position was not reached
109+
# 2) not prevent b2 from outputting its entire binary log
110+
# MYSQL_BINLOG --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
111+
WARNING: Did not reach stop position 0-1-5 before end of input
112+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
113+
# Poison GTID lists with an extraneous GTID domain - expect additional `9-1-1` warnings
114+
#
115+
#
116+
# Test extraneous stop GTID using --read-from-remote-server
117+
#
118+
connection default;
119+
#
120+
# --stop-position tests
121+
#
122+
# Case 1.a) With one binlog file, a --stop-position before the end of
123+
# the file should not result in a warning
124+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
125+
WARNING: Did not reach stop position 9-1-1 before end of input
126+
#
127+
# Case 1.b) With one binlog file, a --stop-position at the exact end of
128+
# the file should not result in a warning
129+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f1_end binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
130+
WARNING: Did not reach stop position 9-1-1 before end of input
131+
#
132+
# Case 1.c) With one binlog file, a --stop-position past the end of the
133+
# file should(!) result in a warning
134+
# MYSQL_BINLOG --read-from-remote-server --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
135+
WARNING: Did not reach stop position 1-1-2 before end of input
136+
WARNING: Did not reach stop position 9-1-1 before end of input
137+
#
138+
# Case 2.a) With two binlog files, a --stop-position targeting b2 which
139+
# exists in the size of b1 should:
140+
# 1) not provide any warnings
141+
# 2) not prevent b2 from outputting its desired events before the
142+
# stop position
143+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
144+
WARNING: Did not reach stop position 9-1-1 before end of input
145+
include/assert_grep.inc [Ensure all intended GTIDs are present]
146+
include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present]
147+
#
148+
# Case 2.b) With two binlog files, a --stop-position targeting the end
149+
# of binlog 2 should:
150+
# 1) not provide any warnings
151+
# 2) not prevent b2 from outputting its entire binary log
152+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
153+
WARNING: Did not reach stop position 9-1-1 before end of input
154+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
155+
include/assert_grep.inc [Ensure the last GTID binlogged is present]
156+
#
157+
# Case 2.c) With two binlog files, a --stop-position targeting beyond
158+
# the eof of binlog 2 should:
159+
# 1) provide a warning that the stop position was not reached
160+
# 2) not prevent b2 from outputting its entire binary log
161+
# MYSQL_BINLOG --read-from-remote-server --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
162+
WARNING: Did not reach stop position 0-1-5 before end of input
163+
WARNING: Did not reach stop position 9-1-1 before end of input
164+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
165+
#
166+
#
167+
# Test extraneous stop GTID using local binlog files
168+
#
169+
connection default;
170+
#
171+
# --stop-position tests
172+
#
173+
# Case 1.a) With one binlog file, a --stop-position before the end of
174+
# the file should not result in a warning
175+
# MYSQL_BINLOG --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
176+
WARNING: Did not reach stop position 9-1-1 before end of input
177+
#
178+
# Case 1.b) With one binlog file, a --stop-position at the exact end of
179+
# the file should not result in a warning
180+
# MYSQL_BINLOG --stop-position=binlog_f1_end binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
181+
WARNING: Did not reach stop position 9-1-1 before end of input
182+
#
183+
# Case 1.c) With one binlog file, a --stop-position past the end of the
184+
# file should(!) result in a warning
185+
# MYSQL_BINLOG --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1
186+
WARNING: Did not reach stop position 1-1-2 before end of input
187+
WARNING: Did not reach stop position 9-1-1 before end of input
188+
#
189+
# Case 2.a) With two binlog files, a --stop-position targeting b2 which
190+
# exists in the size of b1 should:
191+
# 1) not provide any warnings
192+
# 2) not prevent b2 from outputting its desired events before the
193+
# stop position
194+
# MYSQL_BINLOG --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
195+
WARNING: Did not reach stop position 9-1-1 before end of input
196+
include/assert_grep.inc [Ensure all intended GTIDs are present]
197+
include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present]
198+
#
199+
# Case 2.b) With two binlog files, a --stop-position targeting the end
200+
# of binlog 2 should:
201+
# 1) not provide any warnings
202+
# 2) not prevent b2 from outputting its entire binary log
203+
# MYSQL_BINLOG --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
204+
WARNING: Did not reach stop position 9-1-1 before end of input
205+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
206+
include/assert_grep.inc [Ensure the last GTID binlogged is present]
207+
#
208+
# Case 2.c) With two binlog files, a --stop-position targeting beyond
209+
# the eof of binlog 2 should:
210+
# 1) provide a warning that the stop position was not reached
211+
# 2) not prevent b2 from outputting its entire binary log
212+
# MYSQL_BINLOG --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1
213+
WARNING: Did not reach stop position 0-1-5 before end of input
214+
WARNING: Did not reach stop position 9-1-1 before end of input
215+
include/assert_grep.inc [Ensure a GTID exists for each transaction]
216+
#
217+
# End of binlog_mysqlbinlog_warn_stop_gtid.test
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#
2+
# Test ensures that --stop-position work correctly for mysqlbinlog. This high
3+
# level test sets up the binary log (and tags certain locations for comparison),
4+
# and the helper file binlog_mysqlbinlog_warn_stop_position.inc performs the
5+
# actual tests.
6+
#
7+
# References:
8+
# MDEV-34614 mysqlbinlog warn on EOF before GTID in --stop-position
9+
#
10+
--source include/have_log_bin.inc
11+
12+
--let $binlog_out_relpath= tmp/warn_position_test_file.out
13+
--let $binlog_out= $MYSQLTEST_VARDIR/$binlog_out_relpath
14+
15+
--echo #
16+
--echo # Clear the existing binary log state.
17+
--echo #
18+
RESET MASTER;
19+
20+
SET @@SESSION.gtid_domain_id= 0;
21+
SET @@SESSION.server_id= 1;
22+
--let $binlog_f1= query_get_value(SHOW MASTER STATUS, File, 1)
23+
SET @@SESSION.gtid_seq_no= 1;
24+
create table t1 (a int);
25+
insert into t1 values (1);
26+
SET @@SESSION.gtid_domain_id= 1;
27+
insert into t1 values (2);
28+
--let $binlog_f1_pre_rotate= `SELECT @@GLOBAL.gtid_binlog_pos`
29+
flush binary logs;
30+
--let $binlog_f1_end= `SELECT @@GLOBAL.gtid_binlog_pos`
31+
32+
--let $binlog_f2= query_get_value(SHOW MASTER STATUS, File, 1)
33+
insert into t1 values (3);
34+
--echo # Tag binlog_f2_mid
35+
--let $binlog_f2_mid= `SELECT @@GLOBAL.gtid_binlog_pos`
36+
--let $binlog_f1_over_eof= $binlog_f2_mid
37+
insert into t1 values (4);
38+
--let $binlog_f2_gtid_after_midpoint= `SELECT @@GLOBAL.gtid_binlog_pos`
39+
insert into t1 values (5);
40+
SET @@SESSION.gtid_domain_id= 0;
41+
insert into t1 values (6);
42+
insert into t1 values (7);
43+
--let $binlog_f2_last_gtid= `SELECT REGEXP_SUBSTR(@@GLOBAL.gtid_binlog_pos, '0-1-\\\\\\\\d++')`
44+
flush binary logs;
45+
--let $binlog_f2_end= `SELECT @@GLOBAL.gtid_binlog_pos`
46+
drop table t1;
47+
--let $binlog_f2_over_eof= `SELECT @@GLOBAL.gtid_binlog_pos`
48+
49+
--echo # Ensuring binary log order is correct
50+
--let $binlog_f1_show= query_get_value(SHOW BINARY LOGS, Log_name, 1)
51+
if (`SELECT strcmp('$binlog_f1','$binlog_f1_show') != 0`)
52+
{
53+
--echo # Real binlog_f1: $binlog_f1
54+
--echo # First binlog in SHOW BINLOG FILES: $binlog_f1_show
55+
--die Wrong order of binary log files in SHOW BINARY LOGS
56+
}
57+
--let $binlog_f2_show= query_get_value(SHOW BINARY LOGS, Log_name, 2)
58+
if (`SELECT strcmp('$binlog_f2','$binlog_f2_show') != 0`)
59+
{
60+
--echo # Real binlog_f2: $binlog_f2
61+
--echo # First binlog in SHOW BINLOG FILES: $binlog_f2_show
62+
--die Wrong order of binary log files in SHOW BINARY LOGS
63+
}
64+
65+
--let $domain_id= [01]
66+
67+
--echo #
68+
--echo #
69+
--echo # Test using --read-from-remote-server
70+
--echo #
71+
--let $read_from_remote_server= 1
72+
--source binlog_mysqlbinlog_warn_stop_position.inc
73+
74+
--echo #
75+
--echo #
76+
--echo # Test using local binlog files
77+
--echo #
78+
--let $read_from_remote_server= 0
79+
--source binlog_mysqlbinlog_warn_stop_position.inc
80+
81+
--echo # Poison GTID lists with an extraneous GTID domain - expect additional `9-1-1` warnings
82+
--let $binlog_f1_pre_rotate= 9-1-1
83+
--let $binlog_f2_mid= $binlog_f1_pre_rotate,$binlog_f2_mid
84+
--let $binlog_f1_end= $binlog_f1_pre_rotate,$binlog_f1_end
85+
--let $binlog_f2_end= $binlog_f1_pre_rotate,$binlog_f2_end
86+
--let $binlog_f1_over_eof= $binlog_f1_pre_rotate,$binlog_f1_over_eof
87+
--let $binlog_f2_over_eof= $binlog_f1_pre_rotate,$binlog_f2_over_eof
88+
--echo #
89+
--echo #
90+
--echo # Test extraneous stop GTID using --read-from-remote-server
91+
--echo #
92+
--let $read_from_remote_server= 1
93+
--source binlog_mysqlbinlog_warn_stop_position.inc
94+
95+
--echo #
96+
--echo #
97+
--echo # Test extraneous stop GTID using local binlog files
98+
--echo #
99+
--let $read_from_remote_server= 0
100+
--source binlog_mysqlbinlog_warn_stop_position.inc
101+
102+
--echo #
103+
--echo # End of binlog_mysqlbinlog_warn_stop_gtid.test

mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.inc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ if (!$read_from_remote_server)
5050
--echo #
5151
--echo # Case 1.c) With one binlog file, a --stop-position past the end of the
5252
--echo # file should(!) result in a warning
53-
--let $binlog_f1_over_eof= `SELECT $binlog_f1_end + 1`
5453
--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=$binlog_out_relpath 2>&1
5554
--replace_result $binlog_f1_over_eof <BINLOG_F1_OVER_EOF>
5655
--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --short-form --stop-position=$binlog_f1_over_eof $binlog_f1_full --result-file=$binlog_out 2>&1
@@ -65,7 +64,6 @@ if (!$read_from_remote_server)
6564
--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_mid $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1
6665

6766
--let $server_id= `SELECT @@GLOBAL.server_id`
68-
--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id`
6967
--let $assert_file= $binlog_out
7068
--let $assert_text= Ensure all intended GTIDs are present
7169
--let $assert_select= GTID $domain_id-$server_id-
@@ -86,7 +84,6 @@ if (!$read_from_remote_server)
8684
--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_end $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1
8785

8886
--let $server_id= `SELECT @@GLOBAL.server_id`
89-
--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id`
9087
--let $assert_text= Ensure a GTID exists for each transaction
9188
--let $assert_select= GTID $domain_id-$server_id-
9289
--let $assert_count= 8
@@ -102,13 +99,11 @@ if (!$read_from_remote_server)
10299
--echo # the eof of binlog 2 should:
103100
--echo # 1) provide a warning that the stop position was not reached
104101
--echo # 2) not prevent b2 from outputting its entire binary log
105-
--let $binlog_f2_over_eof= `SELECT $binlog_f2_end + 1`
106102
--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1
107103
--replace_result $binlog_f2_over_eof <BINLOG_F2_OVER_EOF>
108104
--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_over_eof $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1
109105

110106
--let $server_id= `SELECT @@GLOBAL.server_id`
111-
--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id`
112107
--let $assert_text= Ensure a GTID exists for each transaction
113108
--let $assert_select= GTID $domain_id-$server_id-
114109
--let $assert_count= 8

mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ if ($binlog_f2_mid > $binlog_f1_end)
6464
--die Mid point chosen to end in binlog 2 does not exist in earlier binlog
6565
}
6666

67+
--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id`
68+
--let $binlog_f1_over_eof= `SELECT $binlog_f1_end + 1`
69+
--let $binlog_f2_over_eof= `SELECT $binlog_f2_end + 1`
70+
6771
--echo #
6872
--echo #
6973
--echo # Test using --read-from-remote-server

0 commit comments

Comments
 (0)