-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Opinionated changes to internode tracking #1121
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -58,48 +58,41 @@ private void respond(Message<Mutation> respondTo, InetAddressAndPort respondToAd | |
|
||
private void addSensorsToResponse(Message.Builder<NoPayload> response, Mutation mutation) | ||
{ | ||
int tables = mutation.getTableIds().size(); | ||
|
||
// Add write bytes sensors to the response | ||
Function<String, String> requestParam = SensorsCustomParams::encodeTableInWriteBytesRequestParam; | ||
Function<String, String> tableParam = SensorsCustomParams::encodeTableInWriteBytesTableParam; | ||
Collection<Sensor> sensors = RequestTracker.instance.get().getSensors(Type.WRITE_BYTES); | ||
addSensorsToResponse(sensors, requestParam, tableParam, response); | ||
Collection<Sensor> requestSensors = RequestTracker.instance.get().getSensors(Type.WRITE_BYTES); | ||
addSensorsToResponse(requestSensors, requestParam, tableParam, response); | ||
|
||
// Add index write bytes sensors to the response | ||
requestParam = SensorsCustomParams::encodeTableInIndexWriteBytesRequestParam; | ||
tableParam = SensorsCustomParams::encodeTableInIndexWriteBytesTableParam; | ||
sensors = RequestTracker.instance.get().getSensors(Type.INDEX_WRITE_BYTES); | ||
addSensorsToResponse(sensors, requestParam, tableParam, response); | ||
|
||
// Add internode message sensors to the response | ||
for (PartitionUpdate update : mutation.getPartitionUpdates()) | ||
{ | ||
Context context = Context.from(update.metadata()); | ||
Optional<Sensor> internodeBytes = SensorsRegistry.instance.getSensor(context, Type.INTERNODE_MSG_BYTES); | ||
internodeBytes.ifPresent(sensor -> { | ||
byte[] bytes = SensorsCustomParams.sensorValueAsBytes(sensor.getValue()); | ||
String internodeBytesTableParam = SensorsCustomParams.encodeTableInInternodeBytesTableParam(context.getTable()); | ||
response.withCustomParam(internodeBytesTableParam, bytes); | ||
}); | ||
|
||
Optional<Sensor> internodeCount = SensorsRegistry.instance.getSensor(context, Type.INTERNODE_MSG_COUNT); | ||
internodeCount.ifPresent(sensor -> { | ||
byte[] count = SensorsCustomParams.sensorValueAsBytes(sensor.getValue()); | ||
String internodeCountTableParam = SensorsCustomParams.encodeTableInInternodeCountTableParam(context.getTable()); | ||
response.withCustomParam(internodeCountTableParam, count); | ||
}); | ||
} | ||
requestSensors = RequestTracker.instance.get().getSensors(Type.INDEX_WRITE_BYTES); | ||
addSensorsToResponse(requestSensors, requestParam, tableParam, response); | ||
|
||
// Add internode bytes sensors to the response after updating each per-table sensor with the current response | ||
// message size: this is missing the sensor values, but it's a good enough approximation | ||
int perSensorSize = response.currentPayloadSize(MessagingService.current_version) / tables; | ||
requestSensors = RequestTracker.instance.get().getSensors(Type.INTERNODE_BYTES); | ||
requestSensors.forEach(sensor -> RequestTracker.instance.get().incrementSensor(sensor.getContext(), sensor.getType(), perSensorSize)); | ||
RequestTracker.instance.get().syncAllSensors(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. But this comes after the mutation is applied right? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh right. In that case, the |
||
requestParam = SensorsCustomParams::encodeTableInInternodeBytesRequestParam; | ||
tableParam = SensorsCustomParams::encodeTableInInternodeBytesTableParam; | ||
addSensorsToResponse(requestSensors, requestParam, tableParam, response); | ||
} | ||
|
||
private void addSensorsToResponse(Collection<Sensor> sensors, Function<String, String> requestParamSupplier, Function<String, String> tableParamSupplier, Message.Builder<NoPayload> response) | ||
private void addSensorsToResponse(Collection<Sensor> requestSensors, Function<String, String> requestParamSupplier, Function<String, String> tableParamSupplier, Message.Builder<NoPayload> response) | ||
{ | ||
for (Sensor requestSensor : sensors) | ||
for (Sensor requestSensor : requestSensors) | ||
{ | ||
String requestBytesParam = requestParamSupplier.apply(requestSensor.getContext().getTable()); | ||
byte[] requestBytes = SensorsCustomParams.sensorValueAsBytes(requestSensor.getValue()); | ||
response.withCustomParam(requestBytesParam, requestBytes); | ||
|
||
// for each table in the mutation, send the global per table write/index bytes as observed by the registry | ||
Optional<Sensor> registrySensor = SensorsRegistry.instance.getSensor(requestSensor.getContext(), requestSensor.getType()); | ||
Optional<Sensor> registrySensor = SensorsRegistry.instance.getOrCreateSensor(requestSensor.getContext(), requestSensor.getType()); | ||
registrySensor.ifPresent(sensor -> { | ||
String tableBytesParam = tableParamSupplier.apply(sensor.getContext().getTable()); | ||
byte[] tableBytes = SensorsCustomParams.sensorValueAsBytes(sensor.getValue()); | ||
|
@@ -132,12 +125,18 @@ public void doVerb(Message<Mutation> message) | |
try | ||
{ | ||
// Initialize the sensor and set ExecutorLocals | ||
String keyspace = message.payload.getKeyspaceName(); | ||
Collection<TableMetadata> tables = message.payload.getPartitionUpdates().stream().map(PartitionUpdate::metadata).collect(Collectors.toList()); | ||
RequestSensors sensors = new RequestSensors(keyspace, tables); | ||
ExecutorLocals locals = ExecutorLocals.create(sensors); | ||
RequestSensors requestSensors = new RequestSensors(); | ||
ExecutorLocals locals = ExecutorLocals.create(requestSensors); | ||
ExecutorLocals.set(locals); | ||
|
||
// Initialize internode bytes with the inbound message size: | ||
tables.forEach(tm -> { | ||
Context context = Context.from(tm); | ||
requestSensors.registerSensor(context, Type.INTERNODE_BYTES); | ||
requestSensors.incrementSensor(context, Type.INTERNODE_BYTES, message.serializedSize(MessagingService.current_version) / tables.size()); | ||
}); | ||
|
||
message.payload.applyFuture(WriteOptions.DEFAULT).thenAccept(o -> respond(message, respondToAddress)).exceptionally(wto -> { | ||
failed(); | ||
return null; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I commented in the
ReadCommandVerbHandler
regarding this - I mean if we go with the approximation, we need to make it consistent - here we are including the sensors values from above (WRITE_BYTES
andINDEX_WRITE_BYTES
) are already added, but in the read example,READ_BYTES
is added after we calculate the size.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point, we can refactor this.