Refactor concurrency handling to utilize SweepstoreWorkerTicketSnapshot for improved state management and add snapshot method in header.dart
This commit is contained in:
@@ -72,11 +72,13 @@ void spawnTicket(RandomAccessFile file, {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int identifier = ticket.identifier;
|
SweepstoreWorkerTicketSnapshot ticketSnapshot = ticket.snapshot();
|
||||||
|
|
||||||
|
int identifier = ticketSnapshot.identifier;
|
||||||
|
|
||||||
bool identifier_unassigned = identifier == 0;
|
bool identifier_unassigned = identifier == 0;
|
||||||
bool stale_heartbeat = (DateTime.now().millisecondsSinceEpoch32() - ticket.workerHeartbeat) > 2000;
|
bool stale_heartbeat = (DateTime.now().millisecondsSinceEpoch32() - ticketSnapshot.workerHeartbeat) > 2000;
|
||||||
bool is_free = ticket.ticketState == SweepstoreTicketState.FREE;
|
bool is_free = ticketSnapshot.ticketState == SweepstoreTicketState.FREE;
|
||||||
|
|
||||||
if (identifier_unassigned && stale_heartbeat && is_free) {
|
if (identifier_unassigned && stale_heartbeat && is_free) {
|
||||||
ticket.write(
|
ticket.write(
|
||||||
@@ -92,16 +94,17 @@ void spawnTicket(RandomAccessFile file, {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
preciseSleep(Duration(milliseconds: 1));
|
preciseSleep(Duration(milliseconds: 2));
|
||||||
|
|
||||||
// Ensure we still own the ticket - if not, reset and try again
|
// Ensure we still own the ticket - if not, reset and try again
|
||||||
if (ticketIndex != null) {
|
if (ticketIndex != null) {
|
||||||
SweepstoreWorkerTicket ticket = concurrencyHeader[ticketIndex];
|
SweepstoreWorkerTicketSnapshot verifySnapshot = concurrencyHeader[ticketIndex].snapshot();
|
||||||
if (ticket.identifier != newIdentifier) {
|
|
||||||
|
if (verifySnapshot.identifier != newIdentifier) {
|
||||||
log("Lost ticket $ticketIndex, retrying...");
|
log("Lost ticket $ticketIndex, retrying...");
|
||||||
ticketIndex = null;
|
ticketIndex = null;
|
||||||
} else {
|
} else {
|
||||||
return ticket;
|
return concurrencyHeader[ticketIndex];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -359,4 +359,58 @@ class SweepstoreWorkerTicket {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SweepstoreWorkerTicketSnapshot snapshot() {
|
||||||
|
|
||||||
|
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset, _baseOffset + ticketSize);
|
||||||
|
|
||||||
|
_concurrencyHeader._header._file.setPositionSync(_baseOffset);
|
||||||
|
List<int> existingBuffer = _concurrencyHeader._header._file.readSync(ticketSize);
|
||||||
|
RandomAccessMemory buffer = RandomAccessMemory(existingBuffer);
|
||||||
|
_concurrencyHeader._header._file.unlockSync(_baseOffset, _baseOffset + ticketSize);
|
||||||
|
|
||||||
|
buffer.setPositionSync(0);
|
||||||
|
int identifier = buffer.readIntSync(4);
|
||||||
|
int workerHeartbeat = buffer.readIntSync(4);
|
||||||
|
SweepstoreTicketState ticketState = SweepstoreTicketState.values[buffer.readIntSync(1)];
|
||||||
|
SweepstoreTicketOperation ticketOperation = SweepstoreTicketOperation.values[buffer.readIntSync(1)];
|
||||||
|
int keyHash = buffer.readIntSync(8);
|
||||||
|
SweepstorePointer writePointer = SweepstorePointer(buffer.readIntSync(8));
|
||||||
|
int writeSize = buffer.readIntSync(4);
|
||||||
|
return SweepstoreWorkerTicketSnapshot._(
|
||||||
|
ticketIndex: ticketIndex,
|
||||||
|
identifier: identifier,
|
||||||
|
workerHeartbeat: workerHeartbeat,
|
||||||
|
ticketState: ticketState,
|
||||||
|
ticketOperation: ticketOperation,
|
||||||
|
keyHash: keyHash,
|
||||||
|
writePointer: writePointer,
|
||||||
|
writeSize: writeSize,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class SweepstoreWorkerTicketSnapshot {
|
||||||
|
|
||||||
|
final int ticketIndex;
|
||||||
|
final int identifier;
|
||||||
|
final int workerHeartbeat;
|
||||||
|
final SweepstoreTicketState ticketState;
|
||||||
|
final SweepstoreTicketOperation ticketOperation;
|
||||||
|
final int keyHash;
|
||||||
|
final SweepstorePointer writePointer;
|
||||||
|
final int writeSize;
|
||||||
|
|
||||||
|
SweepstoreWorkerTicketSnapshot._({
|
||||||
|
required this.ticketIndex,
|
||||||
|
required this.identifier,
|
||||||
|
required this.workerHeartbeat,
|
||||||
|
required this.ticketState,
|
||||||
|
required this.ticketOperation,
|
||||||
|
required this.keyHash,
|
||||||
|
required this.writePointer,
|
||||||
|
required this.writeSize,
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user