Browse Source

fixed FromDeviceRPCResponseProto.response handling in case of null

pull/15662/head
dashevchenko 2 weeks ago
parent
commit
674263dd9e
  1. 4
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java
  2. 4
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java
  3. 7
      common/proto/src/main/java/org/thingsboard/server/common/util/ProtoUtils.java
  4. 2
      common/proto/src/main/proto/queue.proto
  5. 11
      common/proto/src/test/java/org/thingsboard/server/common/util/ProtoUtilsTest.java

4
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java

@ -466,9 +466,9 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
} }
private void forwardToCoreRpcService(FromDeviceRPCResponseProto proto, TbCallback callback) { private void forwardToCoreRpcService(FromDeviceRPCResponseProto proto, TbCallback callback) {
RpcError error = proto.getError() > 0 ? RpcError.values()[proto.getError()] : null; RpcError error = proto.getError() >= 0 ? RpcError.values()[proto.getError()] : null;
FromDeviceRpcResponse response = new FromDeviceRpcResponse(new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB()) FromDeviceRpcResponse response = new FromDeviceRpcResponse(new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB())
, proto.getResponse(), error); , proto.hasResponse() ? proto.getResponse() : null, error);
tbCoreDeviceRpcService.processRpcResponseFromRuleEngine(response); tbCoreDeviceRpcService.processRpcResponseFromRuleEngine(response);
callback.onSuccess(); callback.onSuccess();
} }

4
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java

@ -180,9 +180,9 @@ public class DefaultTbRuleEngineConsumerService extends AbstractPartitionBasedCo
callback.onSuccess(); callback.onSuccess();
} else if (nfMsg.hasFromDeviceRpcResponse()) { } else if (nfMsg.hasFromDeviceRpcResponse()) {
TransportProtos.FromDeviceRPCResponseProto proto = nfMsg.getFromDeviceRpcResponse(); TransportProtos.FromDeviceRPCResponseProto proto = nfMsg.getFromDeviceRpcResponse();
RpcError error = proto.getError() > 0 ? RpcError.values()[proto.getError()] : null; RpcError error = proto.getError() >= 0 ? RpcError.values()[proto.getError()] : null;
FromDeviceRpcResponse response = new FromDeviceRpcResponse(new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB()) FromDeviceRpcResponse response = new FromDeviceRpcResponse(new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB())
, proto.getResponse(), error); , proto.hasResponse() ? proto.getResponse() : null, error);
tbDeviceRpcService.processRpcResponseFromDevice(response); tbDeviceRpcService.processRpcResponseFromDevice(response);
callback.onSuccess(); callback.onSuccess();
} else if (nfMsg.getQueueUpdateMsgsCount() > 0) { } else if (nfMsg.getQueueUpdateMsgsCount() > 0) {

7
common/proto/src/main/java/org/thingsboard/server/common/util/ProtoUtils.java

@ -583,10 +583,11 @@ public class ProtoUtils {
} }
private static ToDeviceActorNotificationMsg fromProto(TransportProtos.FromDeviceRpcResponseActorMsgProto proto) { private static ToDeviceActorNotificationMsg fromProto(TransportProtos.FromDeviceRpcResponseActorMsgProto proto) {
TransportProtos.FromDeviceRPCResponseProto rpcResponse = proto.getRpcResponse();
FromDeviceRpcResponse fromDeviceRpcResponse = new FromDeviceRpcResponse( FromDeviceRpcResponse fromDeviceRpcResponse = new FromDeviceRpcResponse(
new UUID(proto.getRpcResponse().getRequestIdMSB(), proto.getRpcResponse().getRequestIdLSB()), new UUID(rpcResponse.getRequestIdMSB(), rpcResponse.getRequestIdLSB()),
proto.getRpcResponse().getResponse(), rpcResponse.hasResponse() ? rpcResponse.getResponse() : null,
proto.getRpcResponse().getError() >= 0 ? RpcError.values()[proto.getRpcResponse().getError()] : null); rpcResponse.getError() >= 0 ? RpcError.values()[rpcResponse.getError()] : null);
return new FromDeviceRpcResponseActorMsg( return new FromDeviceRpcResponseActorMsg(
proto.getRequestId(), proto.getRequestId(),
TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())),

2
common/proto/src/main/proto/queue.proto

@ -1238,7 +1238,7 @@ message LocalSubscriptionServiceMsgProto {
message FromDeviceRPCResponseProto { message FromDeviceRPCResponseProto {
int64 requestIdMSB = 1; int64 requestIdMSB = 1;
int64 requestIdLSB = 2; int64 requestIdLSB = 2;
string response = 3; optional string response = 3;
int32 error = 4; int32 error = 4;
} }

11
common/proto/src/test/java/org/thingsboard/server/common/util/ProtoUtilsTest.java

@ -226,6 +226,17 @@ class ProtoUtilsTest {
assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg);
} }
@Test
void protoFromDeviceRpcResponseOnewaySerialization() {
// Oneway RPC success: response and error are both null. Relies on the proto
// 'optional string response' presence bit so the receiver round-trips null
// rather than seeing the proto3 default "".
FromDeviceRpcResponseActorMsg msg = new FromDeviceRpcResponseActorMsg(23, tenantId, deviceId, new FromDeviceRpcResponse(id, null, null));
TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg);
Assertions.assertNotNull(serializedMsg);
assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg);
}
@Test @Test
void protoRemoveRpcActorSerialization() { void protoRemoveRpcActorSerialization() {
RemoveRpcActorMsg msg = new RemoveRpcActorMsg(tenantId, deviceId, id); RemoveRpcActorMsg msg = new RemoveRpcActorMsg(tenantId, deviceId, id);

Loading…
Cancel
Save