Refactor concurrency handling to introduce STALE_HEARTBEAT_THRESHOLD_MS constant and utilize SweepstoreWorkerTicketSnapshot for improved state management

This commit is contained in:
ImBenji
2025-11-23 20:27:08 +00:00
parent 580f07c483
commit f8e8636677
4 changed files with 98 additions and 85 deletions

View File

@@ -218,68 +218,68 @@ class SweepstoreWorkerTicket {
// All offsets are relative to the start of the workers ticket
int get _baseOffset => endOfStaticHeaderOffset + (ticketIndex * ticketSize);
// Offset 0 - 4 bytes
int get identifier {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset, _baseOffset + 4);
_concurrencyHeader._header._file.setPositionSync(_baseOffset);
int id = _concurrencyHeader._header._file.readIntSync(4);
_concurrencyHeader._header._file.unlockSync(_baseOffset, _baseOffset + 4);
return id;
}
// Offset 4 - 4 bytes
int get workerHeartbeat {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 4, _baseOffset + 8);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 4);
int heartbeat = _concurrencyHeader._header._file.readIntSync(4);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 4, _baseOffset + 8);
return heartbeat;
}
// Offset 8 - 1 byte
SweepstoreTicketState get ticketState {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 8, _baseOffset + 9);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 8);
int stateValue = _concurrencyHeader._header._file.readIntSync(1);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 8, _baseOffset + 9);
return SweepstoreTicketState.values[stateValue];
}
// Offset 9 - 1 byte
SweepstoreTicketOperation get ticketOperation {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 9, _baseOffset + 10);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 9);
int operationValue = _concurrencyHeader._header._file.readIntSync(1);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 9, _baseOffset + 10);
return SweepstoreTicketOperation.values[operationValue];
}
// Offset 10 - 8 bytes
int get keyHash {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 10, _baseOffset + 18);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 10);
int hash = _concurrencyHeader._header._file.readIntSync(8);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 10, _baseOffset + 18);
return hash;
}
// Offset 18 - 8 bytes
SweepstorePointer get writePointer {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 18, _baseOffset + 26);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 18);
int address = _concurrencyHeader._header._file.readIntSync(8);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 18, _baseOffset + 26);
return SweepstorePointer(address);
}
// Offset 26 - 4 bytes
int get writeSize {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 26, _baseOffset + 30);
_concurrencyHeader._header._file.setPositionSync(_baseOffset + 26);
int size = _concurrencyHeader._header._file.readIntSync(4);
_concurrencyHeader._header._file.unlockSync(_baseOffset + 26, _baseOffset + 30);
return size;
}
// // Offset 0 - 4 bytes
// int get identifier {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset, _baseOffset + 4);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset);
// int id = _concurrencyHeader._header._file.readIntSync(4);
// _concurrencyHeader._header._file.unlockSync(_baseOffset, _baseOffset + 4);
// return id;
// }
//
// // Offset 4 - 4 bytes
// int get workerHeartbeat {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 4, _baseOffset + 8);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 4);
// int heartbeat = _concurrencyHeader._header._file.readIntSync(4);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 4, _baseOffset + 8);
// return heartbeat;
// }
//
// // Offset 8 - 1 byte
// SweepstoreTicketState get ticketState {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 8, _baseOffset + 9);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 8);
// int stateValue = _concurrencyHeader._header._file.readIntSync(1);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 8, _baseOffset + 9);
// return SweepstoreTicketState.values[stateValue];
// }
//
// // Offset 9 - 1 byte
// SweepstoreTicketOperation get ticketOperation {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 9, _baseOffset + 10);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 9);
// int operationValue = _concurrencyHeader._header._file.readIntSync(1);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 9, _baseOffset + 10);
// return SweepstoreTicketOperation.values[operationValue];
// }
//
// // Offset 10 - 8 bytes
// int get keyHash {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 10, _baseOffset + 18);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 10);
// int hash = _concurrencyHeader._header._file.readIntSync(8);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 10, _baseOffset + 18);
// return hash;
// }
//
// // Offset 18 - 8 bytes
// SweepstorePointer get writePointer {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 18, _baseOffset + 26);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 18);
// int address = _concurrencyHeader._header._file.readIntSync(8);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 18, _baseOffset + 26);
// return SweepstorePointer(address);
// }
//
// // Offset 26 - 4 bytes
// int get writeSize {
// _concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset + 26, _baseOffset + 30);
// _concurrencyHeader._header._file.setPositionSync(_baseOffset + 26);
// int size = _concurrencyHeader._header._file.readIntSync(4);
// _concurrencyHeader._header._file.unlockSync(_baseOffset + 26, _baseOffset + 30);
// return size;
// }
// Writer
void write({
@@ -362,12 +362,12 @@ class SweepstoreWorkerTicket {
SweepstoreWorkerTicketSnapshot snapshot() {
_concurrencyHeader._header._file.lockSync(FileLock.blockingShared, _baseOffset, _baseOffset + ticketSize);
// _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);
// _concurrencyHeader._header._file.unlockSync(_baseOffset, _baseOffset + ticketSize);
buffer.setPositionSync(0);
int identifier = buffer.readIntSync(4);