logo

Crowdly

Browser

Add to Chrome

SYT9 5xHIT 25/26

Looking for SYT9 5xHIT 25/26 test answers and solutions? Browse our comprehensive collection of verified answers for SYT9 5xHIT 25/26 at elearning.tgm.ac.at.

Get instant access to accurate answers and detailed explanations for your course questions. Our community-driven platform helps students succeed!

Kafka nutzt in seiner neuesten Implementierung eine angepasste Raft-Implementierung, welche Aussagen treffen zu?
0%
0%
0%
0%
0%
0%
View this question

Im Raft-Paper die Regeln für die einzelnen Rollen der Server folgendermaßen definiert worden:

Image failed to load: RulesForServers

Im Java Code der Raft-grpc Implementierung ist folgende Funktion vorhanden:

private void startElection() {

if (suspended || state == NodeState.LEADER) {

return;

}

// Pre-vote phase: Check if election would be successful before disrupting cluster

log.info("Starting pre-vote phase for node {}", config.getNodeId());

boolean preVoteSuccessful = performPreVote();

if (!preVoteSuccessful) {

log.info("Pre-vote failed for node {}, not starting actual election", config.getNodeId());

startElectionTimer();

return;

}

log.info("Pre-vote successful! Starting actual election...");

logEvent(RaftEvent.EventType.STATE_CHANGE,

"FOLLOWER → CANDIDATE");

state = NodeState.CANDIDATE;

currentTerm.incrementAndGet();

logEvent(RaftEvent.EventType.TERM_INCREASED,

"Term increased to " + currentTerm.get());

votedFor = config.getNodeId();

currentLeader = null;

// Persist state change (CRITICAL for Raft safety - must persist before sending RequestVote RPCs)

persistenceService.saveState(config.getNodeId(), currentTerm.get(), votedFor);

int votesReceived = 1;

int votesNeeded = (stubs.size() + 2) / 2;

log.info("Node {} starting election for term {}", config.getNodeId(), currentTerm.get());

logEvent(RaftEvent.EventType.ELECTION_START,

"Starting election, need " + votesNeeded + " votes");

int lastLogIndex = getLastLogIndex();

int lastLogTerm = getLogTermAt(lastLogIndex);

VoteRequest voteRequest = VoteRequest.newBuilder()

.setTerm(currentTerm.get())

.setCandidateId(config.getNodeId())

.setLastLogIndex(lastLogIndex)

.setLastLogTerm(lastLogTerm)

.build();

for (Map.Entry<String, RaftServiceGrpc.RaftServiceBlockingStub> entry : stubs.entrySet()) {

try {

VoteResponse response = entry.getValue().requestVote(voteRequest);

if (response.getTerm() > currentTerm.get()) {

becomeFollower(response.getTerm());

return;

}

if (response.getVoteGranted()) {

votesReceived++;

log.info("Received vote from {} ({}/{})", entry.getKey(), votesReceived, votesNeeded);

logEvent(RaftEvent.EventType.VOTE_GRANTED,

"Vote granted from " + entry.getKey() + " (" + votesReceived + "/" + votesNeeded + ")");

} else {

logEvent(RaftEvent.EventType.VOTE_DENIED,

"Vote denied from " + entry.getKey());

}

} catch (Exception e) {

log.warn("Failed to request vote from {}: {}", entry.getKey(), e.getMessage());

}

}

if (votesReceived >= votesNeeded && state == NodeState.CANDIDATE) {

logEvent(RaftEvent.EventType.ELECTION_WON,

"Won election with " + votesReceived + " votes");

becomeLeader();

} else {

log.info("Election failed. Votes received: {}, needed: {}", votesReceived, votesNeeded);

logEvent(RaftEvent.EventType.ELECTION_LOST,

"Lost election: " + votesReceived + "/" + votesNeeded + " votes");

startElectionTimer();

}

}

Welche Aussagen treffen dabei zu?

0%
0%
0%
0%
View this question

Im Raft-Paper ist die RPC Funktion RequestVote folgendermaßen definiert worden:

Image failed to load: RequestVote

Im Java Code der Raft-grpc Implementierung ist die Funktion so implementiert worden:

public VoteResponse handleVoteRequest(VoteRequest request) {

log.info("Received vote request from {} for term {}", request.getCandidateId(), request.getTerm());

// Deny votes when suspended

if (suspended) {

log.info("Denying vote request - node is suspended");

return VoteResponse.newBuilder()

.setTerm(currentTerm.get())

.setVoteGranted(false)

.build();

}

if (request.getTerm() > currentTerm.get()) {

becomeFollower(request.getTerm());

}

boolean voteGranted = false;

if (request.getTerm() < currentTerm.get()) {

voteGranted = false;

logEvent(RaftEvent.EventType.VOTE_DENIED,

"Denied vote to " + request.getCandidateId() + " (stale term " + request.getTerm() + ")");

} else if (votedFor == null || votedFor.equals(request.getCandidateId())) {

int lastLogIndex = getLastLogIndex();

int lastLogTerm = getLogTermAt(lastLogIndex);

boolean logUpToDate = request.getLastLogTerm() > lastLogTerm ||

(request.getLastLogTerm() == lastLogTerm && request.getLastLogIndex() >= lastLogIndex);

if (logUpToDate) {

votedFor = request.getCandidateId();

voteGranted = true;

lastHeartbeat = System.currentTimeMillis();

// Persist vote (CRITICAL for Raft safety - must persist before responding)

persistenceService.saveState(config.getNodeId(), currentTerm.get(), votedFor);

startElectionTimer();

log.info("Voted for {}", request.getCandidateId());

logEvent(RaftEvent.EventType.VOTE_GRANTED,

"Granted vote to " + request.getCandidateId() + " for term " + request.getTerm());

} else {

logEvent(RaftEvent.EventType.VOTE_DENIED,

"Denied vote to " + request.getCandidateId() + " (log not up-to-date)");

}

} else {

logEvent(RaftEvent.EventType.VOTE_DENIED,

"Denied vote to " + request.getCandidateId() + " (already voted for " + votedFor + ")");

}

return VoteResponse.newBuilder()

.setTerm(currentTerm.get())

.setVoteGranted(voteGranted)

.build();

}

private void startElectionTimer() {

if (electionTask != null) {

electionTask.cancel(false);

}

int timeout = ThreadLocalRandom.current().nextInt(ELECTION_TIMEOUT_MIN, ELECTION_TIMEOUT_MAX);

electionTask = scheduler.schedule(this::startElection, timeout, TimeUnit.MILLISECONDS);

log.debug("Election timer started: {}ms", timeout);

}

Mit den folgenden gRPC Messages:

message VoteRequest {

int32 term = 1;

string candidateId = 2;

int32 lastLogIndex = 3;

int32 lastLogTerm = 4;

}

message VoteResponse {

int32 term = 1;

bool voteGranted = 2;

}

Welche Aussagen treffen dabei zu?

0%
0%
0%
0%
0%
0%
View this question

Im Raft-Paper ist die RPC Funktion AppendEntries folgendermaßen definiert worden:

Image failed to load: AppendEntries

Im Java Code der Raft-grpc Implementierung ist die Funktion so implementiert worden:

public AppendEntriesResponse handleAppendEntries(AppendEntriesRequest request) {

// Reject AppendEntries when suspended

if (suspended) {

log.debug("Rejecting AppendEntries - node is suspended");

return AppendEntriesResponse.newBuilder()

.setTerm(currentTerm.get())

.setSuccess(false)

.build();

}

lastHeartbeat = System.currentTimeMillis();

if (request.getTerm() > currentTerm.get()) {

becomeFollower(request.getTerm());

}

if (request.getTerm() < currentTerm.get()) {

return AppendEntriesResponse.newBuilder()

.setTerm(currentTerm.get())

.setSuccess(false)

.build();

}

if (state != NodeState.FOLLOWER) {

becomeFollower(request.getTerm());

}

currentLeader = request.getLeaderId();

startElectionTimer();

if (request.getEntriesCount() == 0) {

logEvent(RaftEvent.EventType.HEARTBEAT_RECEIVED,

"Heartbeat from leader " + request.getLeaderId());

}

// Check prevLogIndex/prevLogTerm consistency (logical indices)

int prevLogIndex = request.getPrevLogIndex();

if (prevLogIndex >= 0) {

// Check if we have the entry at prevLogIndex

int prevLogTerm = getLogTermAt(prevLogIndex);

if (prevLogTerm == 0 || prevLogTerm != request.getPrevLogTerm()) {

log.debug("Log consistency check failed at index {}: expected term {}, got {}",

prevLogIndex, request.getPrevLogTerm(), prevLogTerm);

return AppendEntriesResponse.newBuilder()

.setTerm(currentTerm.get())

.setSuccess(false)

.build();

}

}

// Process new entries (logical indices)

int newEntryLogicalIndex = prevLogIndex + 1;

int entriesAdded = 0;

List<LogEntry> entriesToPersist = new ArrayList<>();

for (GrpcLogEntry entry : request.getEntriesList()) {

int physicalIndex = logicalToPhysical(newEntryLogicalIndex);

// Check for conflicts

if (physicalIndex >= 0 && physicalIndex < raftLog.size()) {

if (raftLog.get(physicalIndex).getTerm() != entry.getTerm()) {

// Conflict detected - delete conflicting entries

synchronized (raftLog) {

raftLog.subList(physicalIndex, raftLog.size()).clear();

// Persist log deletion (CRITICAL for consistency)

persistenceService.deleteLogEntriesFrom(config.getNodeId(), newEntryLogicalIndex);

}

}

}

// Append if we don't have this entry

physicalIndex = logicalToPhysical(newEntryLogicalIndex);

if (physicalIndex >= raftLog.size()) {

// Convert gRPC entry back to internal LogEntry

LogEntry logEntry = convertFromGrpcLogEntry(entry);

synchronized (raftLog) {

raftLog.add(logEntry);

}

entriesToPersist.add(logEntry);

entriesAdded++;

}

newEntryLogicalIndex++;

}

// Persist all new entries in batch (CRITICAL for durability)

if (!entriesToPersist.isEmpty()) {

int startLogicalIndex = prevLogIndex + 1;

persistenceService.appendLogEntries(config.getNodeId(), startLogicalIndex, entriesToPersist);

}

if (entriesAdded > 0) {

logEvent(RaftEvent.EventType.LOG_REPLICATED,

"Replicated " + entriesAdded + " entries from leader " + request.getLeaderId());

}

// Update commit index based on leader's commit index (logical indices)

if (request.getLeaderCommit() > commitIndex.get()) {

commitIndex.set(Math.min(request.getLeaderCommit(), getLastLogIndex()));

applyCommittedEntries();

}

return AppendEntriesResponse.newBuilder()

.setTerm(currentTerm.get())

.setSuccess(true)

.setMatchIndex(getLastLogIndex()) // Logical index of last entry

.build();

}

Mit den folgenden gRPC Messages:

message AppendEntriesRequest {

int32 term = 1;

string leaderId = 2;

int32 prevLogIndex = 3;

int32 prevLogTerm = 4;

repeated GrpcLogEntry entries = 5;

int32 leaderCommit = 6;

}

message AppendEntriesResponse {

int32 term = 1;

bool success = 2;

int32 matchIndex = 3;

}

Welche Aussagen treffen dabei zu?

View this question

Consensus algorithms for practical systems typically have the following properties:

View this question

Raft guarantees that each of these properties is true at all times.

View this question

Folgende replizierte Log Struktur ist aufgetreten:

Image failed to load: Replicated Log

Welche Aussagen stimmen?

0%
View this question

Image failed to load: ReplicatedStateMachine

Welche Aussagen sind zutreffend?

View this question

One of the requirements for Raft is that safety must not depend on timing: the system must not produce incorrect results just because some event happens more quickly or slowly than expected.

Which answers are correct?

View this question
Welche Aussagen bzw. Definitionen treffen auf Kubernetes zu?
View this question

Want instant access to all verified answers on elearning.tgm.ac.at?

Get Unlimited Answers To Exam Questions - Install Crowdly Extension Now!

Browser

Add to Chrome