# This test verifies the DisableConfChangeValidation setting.
# With it set, raft should allow configuration changes to enter the log even
# if they appear to be incompatible with the currently active configuration.
#
# The test sets up a single-voter group that applies entries one at a time.
# Then it proposes a bogus entry followed by a conf change. When the bogus entry
# has applied, a second (compatible, but the node doesn't know this yet)
# configuration change is proposed. That configuration change is accepted into
# the log since due to DisableConfChangeValidation=true.
add-nodes 4 voters=(1) index=2 max-committed-size-per-ready=1 disable-conf-change-validation=true
----
INFO 1 switched to configuration voters=(1)
INFO 1 became follower at term 0
DEBUG 1 reset election elapsed to 0
INFO newRaft 1 [peers: [1], term: 0, commit: 2, applied: 2, lastindex: 2, lastterm: 1]
INFO 2 switched to configuration voters=(1)
INFO 2 became follower at term 0
DEBUG 2 reset election elapsed to 0
INFO newRaft 2 [peers: [1], term: 0, commit: 2, applied: 2, lastindex: 2, lastterm: 1]
INFO 3 switched to configuration voters=(1)
INFO 3 became follower at term 0
DEBUG 3 reset election elapsed to 0
INFO newRaft 3 [peers: [1], term: 0, commit: 2, applied: 2, lastindex: 2, lastterm: 1]
INFO 4 switched to configuration voters=(1)
INFO 4 became follower at term 0
DEBUG 4 reset election elapsed to 0
INFO newRaft 4 [peers: [1], term: 0, commit: 2, applied: 2, lastindex: 2, lastterm: 1]

campaign 1
----
INFO 1 is starting a new election at term 0
INFO 1 became candidate at term 1

stabilize log-level=none
----
ok

# Dummy entry.
propose 1 foo
----
ok

propose-conf-change 1 transition=explicit
l2 l3
----
ok

# Entries both get appended and applied.
stabilize 1
----
> 1 handling Ready
  Ready MustSync=true:
  Entries:
  1/4 EntryNormal "foo"
  1/5 EntryConfChangeV2 l2 l3
> 1 handling Ready
  Ready MustSync=true:
  HardState Term:1 Vote:1 Commit:5 Lead:1 LeadEpoch:1
  CommittedEntries:
  1/4 EntryNormal "foo"
> 1 handling Ready
  Ready MustSync=false:
  CommittedEntries:
  1/5 EntryConfChangeV2 l2 l3
  INFO 1 switched to configuration voters=(1)&&(1) learners=(2 3)
> 1 handling Ready
  Ready MustSync=false:
  Messages:
  1->2 MsgFortifyLeader Term:1 Log:0/0
  1->3 MsgFortifyLeader Term:1 Log:0/0
  1->2 MsgApp Term:1 Log:1/4 Commit:5 Entries:[1/5 EntryConfChangeV2 l2 l3]
  1->3 MsgApp Term:1 Log:1/4 Commit:5 Entries:[1/5 EntryConfChangeV2 l2 l3]

# Propose new config change. Note how it isn't rejected,
# which is due to DisableConfChangeValidation=true.
propose-conf-change 1
l4
----
ok

# The new config change is appended to the log.
process-ready 1
----
Ready MustSync=true:
Entries:
1/6 EntryConfChangeV2 l4

# If we process-ready on node 1 now, the second config change will come up for
# application, and the node will panic with "config is already joint". The state
# machine must ensure not to apply it.
#
# TODO(pav-kv): support no-op command application in tests, or support asserting
# that the node panics.
