Lets say we have a state machine like so:
defmodule Stack do
def handle_write({:put, str}, stack) when is_binary(str) do
new_stack = [str | stack]
{Enum.count(new_stack), new_stack}
end
end
We have a stack that expects string arguments (I have no idea why anyone would do this in real life but it should illustrate the point).
The problem is that we can send any message to the raft process like so: Raft.write(leader, {:put, 1}). That message will effectively kill the raft process. This is because the message is only applied to the users state machine after its been persisted to disk. The raft process will attempt to apply this message, crash (which will cause the log to crash), the server will be restarted, attempt to apply the log message again, crash, etc. Generally speaking, any incorrect message has the potential to corrupt the log.
I think we should give users an "error handling" option. In some cases they may want to allow the exception to crash the raft process. In other cases they may want to simply log the error and simply "ignore" that message. My initial thought would be to provide something like this:
defmodule Stack do
use Raft.StateMachine, on_error: :nothing # Logs the error but maintains the user state machines current state and moves on.
use Raft.StateMachine, on_error: :raise # Raises and crashes the raft process.
end
What do y'all think?
Lets say we have a state machine like so:
We have a stack that expects string arguments (I have no idea why anyone would do this in real life but it should illustrate the point).
The problem is that we can send any message to the raft process like so:
Raft.write(leader, {:put, 1}). That message will effectively kill the raft process. This is because the message is only applied to the users state machine after its been persisted to disk. The raft process will attempt to apply this message, crash (which will cause the log to crash), the server will be restarted, attempt to apply the log message again, crash, etc. Generally speaking, any incorrect message has the potential to corrupt the log.I think we should give users an "error handling" option. In some cases they may want to allow the exception to crash the raft process. In other cases they may want to simply log the error and simply "ignore" that message. My initial thought would be to provide something like this:
What do y'all think?