public NodeApiVersions(Collection<ApiVersion> nodeApiVersions) { for (ApiVersion nodeApiVersion : nodeApiVersions) { if (ApiKeys.hasId(nodeApiVersion.apiKey)) { ApiKeys nodeApiKey = ApiKeys.forId(nodeApiVersion.apiKey); supportedVersions.put(nodeApiKey, nodeApiVersion); } else { // Newer brokers may support ApiKeys we don't know about unknownApis.add(nodeApiVersion); } } }
private String apiVersionToText(ApiVersion apiVersion) { StringBuilder bld = new StringBuilder(); ApiKeys apiKey = null; if (ApiKeys.hasId(apiVersion.apiKey)) { apiKey = ApiKeys.forId(apiVersion.apiKey); bld.append(apiKey.name).append("(").append(apiKey.id).append("): "); } else { bld.append("UNKNOWN(").append(apiVersion.apiKey).append("): "); } if (apiVersion.minVersion == apiVersion.maxVersion) { bld.append(apiVersion.minVersion); } else { bld.append(apiVersion.minVersion).append(" to ").append(apiVersion.maxVersion); } if (apiKey != null) { ApiVersion supportedVersion = supportedVersions.get(apiKey); if (apiKey.latestVersion() < supportedVersion.minVersion) { bld.append(" [unusable: node too new]"); } else if (supportedVersion.maxVersion < apiKey.oldestVersion()) { bld.append(" [unusable: node too old]"); } else { short latestUsableVersion = Utils.min(apiKey.latestVersion(), supportedVersion.maxVersion); bld.append(" [usable: ").append(latestUsableVersion).append("]"); } } return bld.toString(); }
@Test(expected = IllegalArgumentException.class) public void testForIdWithInvalidIdLow() { ApiKeys.forId(-1); }
private Set<ApiKeys> apiKeysInResponse(final ApiVersionsResponse apiVersions) { final Set<ApiKeys> apiKeys = new HashSet<>(); for (final ApiVersionsResponse.ApiVersion version : apiVersions.apiVersions()) { apiKeys.add(ApiKeys.forId(version.apiKey)); } return apiKeys; }
@Test(expected = IllegalArgumentException.class) public void testForIdWithInvalidIdHigh() { ApiKeys.forId(10000); }
private void verifyApiKeysForMagic(final ApiVersionsResponse response, final byte maxMagic) { for (final ApiVersionsResponse.ApiVersion version : response.apiVersions()) { assertTrue(ApiKeys.forId(version.apiKey).minRequiredInterBrokerMagic <= maxMagic); } }
public RequestHeader(Struct struct) { short apiKey = struct.getShort(API_KEY_FIELD_NAME); if (!ApiKeys.hasId(apiKey)) throw new InvalidRequestException("Unknown API key " + apiKey); this.apiKey = ApiKeys.forId(apiKey); apiVersion = struct.getShort(API_VERSION_FIELD_NAME); // only v0 of the controlled shutdown request is missing the clientId if (struct.hasField(CLIENT_ID_FIELD_NAME)) clientId = struct.getString(CLIENT_ID_FIELD_NAME); else clientId = ""; correlationId = struct.getInt(CORRELATION_ID_FIELD_NAME); }
/** * Handle any disconnected connections * @param responses The list of responses that completed with the disconnection * @param now The current time */ private void handleDisconnections(List<ClientResponse> responses, long now) { for (int node : this.selector.disconnected()) { connectionStates.disconnected(node); log.debug("Node {} disconnected.", node); for (ClientRequest request : this.inFlightRequests.clearAll(node)) { log.trace("Cancelled request {} due to node {} being disconnected", request, node); ApiKeys requestKey = ApiKeys.forId(request.request().header().apiKey()); if (requestKey == ApiKeys.METADATA) metadataFetchInProgress = false; else responses.add(new ClientResponse(request, now, true, null)); } } // we got a disconnect so we should probably refresh our metadata and see if that broker is dead if (this.selector.disconnected().size() > 0) this.metadata.requestUpdate(); }
/** * Top-level method that handles all requests and multiplexes to the right api */ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ChannelBuffer buffer = (ChannelBuffer) e.getMessage(); Request request = new Request(ctx, buffer.toByteBuffer()); switch (ApiKeys.forId(request.getRequestId())) { case METADATA: handleMetadataRequest(ctx, request); break; case GROUP_COORDINATOR: handleGroupCoordinatorRequest(ctx, request); break; case JOIN_GROUP: handleJoinGroupRequest(ctx, request); break; case HEARTBEAT: handleHeartbeatRequest(ctx, request); break; case SYNC_GROUP: handleSyncGroupRequest(ctx, request); break; case LEAVE_GROUP: handleLeaveGroupRequest(ctx, request); break; default: throw new DatalinkException("Unknown api code " + request.getRequestId()); } }