Skip to content

Commit 1157819

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Revert "Make AddStatus generally VerifyOrDie and have centralized logging (#28634)" (#28661)
1 parent d9852d3 commit 1157819

File tree

12 files changed

+84
-75
lines changed

12 files changed

+84
-75
lines changed

src/app/CommandHandler.cpp

+23-23
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ Status CommandHandler::ProcessCommandDataIB(CommandDataIB::Parser & aCommandElem
272272
ChipLogDetail(DataManagement, "No command " ChipLogFormatMEI " in Cluster " ChipLogFormatMEI " on Endpoint 0x%x",
273273
ChipLogValueMEI(concretePath.mCommandId), ChipLogValueMEI(concretePath.mClusterId),
274274
concretePath.mEndpointId);
275-
return FallibleAddStatus(concretePath, commandExists) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
275+
return AddStatus(concretePath, commandExists) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
276276
}
277277
}
278278

@@ -287,18 +287,18 @@ Status CommandHandler::ProcessCommandDataIB(CommandDataIB::Parser & aCommandElem
287287
{
288288
if (err != CHIP_ERROR_ACCESS_DENIED)
289289
{
290-
return FallibleAddStatus(concretePath, Status::Failure) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
290+
return AddStatus(concretePath, Status::Failure) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
291291
}
292292
// TODO: when wildcard invokes are supported, handle them to discard rather than fail with status
293-
return FallibleAddStatus(concretePath, Status::UnsupportedAccess) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
293+
return AddStatus(concretePath, Status::UnsupportedAccess) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
294294
}
295295
}
296296

297297
if (CommandNeedsTimedInvoke(concretePath.mClusterId, concretePath.mCommandId) && !IsTimedInvoke())
298298
{
299299
// TODO: when wildcard invokes are supported, discard a
300300
// wildcard-expanded path instead of returning a status.
301-
return FallibleAddStatus(concretePath, Status::NeedsTimedInteraction) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
301+
return AddStatus(concretePath, Status::NeedsTimedInteraction) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
302302
}
303303

304304
if (CommandIsFabricScoped(concretePath.mClusterId, concretePath.mCommandId))
@@ -312,7 +312,7 @@ Status CommandHandler::ProcessCommandDataIB(CommandDataIB::Parser & aCommandElem
312312
{
313313
// TODO: when wildcard invokes are supported, discard a
314314
// wildcard-expanded path instead of returning a status.
315-
return FallibleAddStatus(concretePath, Status::UnsupportedAccess) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
315+
return AddStatus(concretePath, Status::UnsupportedAccess) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
316316
}
317317
}
318318

@@ -337,7 +337,7 @@ Status CommandHandler::ProcessCommandDataIB(CommandDataIB::Parser & aCommandElem
337337
exit:
338338
if (err != CHIP_NO_ERROR)
339339
{
340-
return FallibleAddStatus(concretePath, Status::InvalidCommand) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
340+
return AddStatus(concretePath, Status::InvalidCommand) != CHIP_NO_ERROR ? Status::Failure : Status::Success;
341341
}
342342

343343
// We have handled the error status above and put the error status in response, now return success status so we can process
@@ -468,31 +468,31 @@ CHIP_ERROR CommandHandler::AddStatusInternal(const ConcreteCommandPath & aComman
468468
return FinishStatus();
469469
}
470470

471-
void CommandHandler::AddStatus(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus,
472-
const char * context)
471+
CHIP_ERROR CommandHandler::AddStatus(const ConcreteCommandPath & aCommandPath, const Status aStatus)
473472
{
474-
475-
VerifyOrDie(FallibleAddStatus(aCommandPath, aStatus, context) == CHIP_NO_ERROR);
473+
return AddStatusInternal(aCommandPath, StatusIB(aStatus));
476474
}
477475

478-
CHIP_ERROR CommandHandler::FallibleAddStatus(const ConcreteCommandPath & path, const Protocols::InteractionModel::Status status,
479-
const char * context)
476+
void CommandHandler::AddStatusAndLogIfFailure(const ConcreteCommandPath & aCommandPath, const Status aStatus, const char * aMessage)
480477
{
481-
482-
if (status != Status::Success)
478+
if (aStatus != Status::Success)
483479
{
484-
if (context == nullptr)
485-
{
486-
context = "no additional context";
487-
}
488-
489480
ChipLogError(DataManagement,
490-
"Endpoint=%u Cluster=" ChipLogFormatMEI " Command=" ChipLogFormatMEI " status " ChipLogFormatIMStatus " (%s)",
491-
path.mEndpointId, ChipLogValueMEI(path.mClusterId), ChipLogValueMEI(path.mCommandId),
492-
ChipLogValueIMStatus(status), context);
481+
"Failed to handle on Endpoint=%u Cluster=" ChipLogFormatMEI " Command=" ChipLogFormatMEI
482+
" with " ChipLogFormatIMStatus ": %s",
483+
aCommandPath.mEndpointId, ChipLogValueMEI(aCommandPath.mClusterId), ChipLogValueMEI(aCommandPath.mCommandId),
484+
ChipLogValueIMStatus(aStatus), aMessage);
493485
}
494486

495-
return AddStatusInternal(path, StatusIB(status));
487+
CHIP_ERROR err = AddStatus(aCommandPath, aStatus);
488+
if (err != CHIP_NO_ERROR)
489+
{
490+
ChipLogError(DataManagement,
491+
"Failed to set status on Endpoint=%u Cluster=" ChipLogFormatMEI " Command=" ChipLogFormatMEI
492+
": %" CHIP_ERROR_FORMAT,
493+
aCommandPath.mEndpointId, ChipLogValueMEI(aCommandPath.mClusterId), ChipLogValueMEI(aCommandPath.mCommandId),
494+
err.Format());
495+
}
496496
}
497497

498498
CHIP_ERROR CommandHandler::AddClusterSpecificSuccess(const ConcreteCommandPath & aCommandPath, ClusterStatus aClusterStatus)

src/app/CommandHandler.h

+12-15
Original file line numberDiff line numberDiff line change
@@ -170,20 +170,13 @@ class CommandHandler : public Messaging::ExchangeDelegate
170170
*/
171171
void OnInvokeCommandRequest(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader,
172172
System::PacketBufferHandle && payload, bool isTimedInvoke);
173+
CHIP_ERROR AddStatus(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus);
173174

174-
/**
175-
* Adds the given command status and returns any failures in adding statuses (e.g. out
176-
* of buffer space) to the caller
177-
*/
178-
CHIP_ERROR FallibleAddStatus(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus,
179-
const char * context = nullptr);
180-
181-
/**
182-
* Adds a status when the caller is unable to handle any failures. Logging is performed
183-
* and failure to register the status is checked with VerifyOrDie.
184-
*/
185-
void AddStatus(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus,
186-
const char * context = nullptr);
175+
// Same as AddStatus, but logs that the command represented by aCommandPath failed with the given
176+
// error status and error message, if aStatus is an error. Errors on AddStatus are just logged
177+
// (since the caller likely can only log and not further add a status).
178+
void AddStatusAndLogIfFailure(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus,
179+
const char * aMessage);
187180

188181
CHIP_ERROR AddClusterSpecificSuccess(const ConcreteCommandPath & aCommandPath, ClusterStatus aClusterStatus);
189182

@@ -245,9 +238,13 @@ class CommandHandler : public Messaging::ExchangeDelegate
245238
template <typename CommandData>
246239
void AddResponse(const ConcreteCommandPath & aRequestCommandPath, const CommandData & aData)
247240
{
248-
if (AddResponseData(aRequestCommandPath, aData) != CHIP_NO_ERROR)
241+
if (CHIP_NO_ERROR != AddResponseData(aRequestCommandPath, aData))
249242
{
250-
AddStatus(aRequestCommandPath, Protocols::InteractionModel::Status::Failure);
243+
CHIP_ERROR err = AddStatus(aRequestCommandPath, Protocols::InteractionModel::Status::Failure);
244+
if (err != CHIP_NO_ERROR)
245+
{
246+
ChipLogError(DataManagement, "Failed to encode status: %" CHIP_ERROR_FORMAT, err.Format());
247+
}
251248
}
252249
}
253250

src/app/CommandResponseHelper.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class CommandResponseHelper
5353

5454
CHIP_ERROR Failure(Protocols::InteractionModel::Status aStatus)
5555
{
56-
CHIP_ERROR err = mCommandHandler->FallibleAddStatus(mCommandPath, aStatus);
56+
CHIP_ERROR err = mCommandHandler->AddStatus(mCommandPath, aStatus);
5757
if (err == CHIP_NO_ERROR)
5858
{
5959
mSentResponse = true;

src/app/clusters/barrier-control-server/barrier-control-server.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,10 @@ void emberAfBarrierControlClusterServerTickCallback(EndpointId endpoint)
286286

287287
static void sendDefaultResponse(app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath, Status status)
288288
{
289-
commandObj->AddStatus(commandPath, status);
289+
if (commandObj->AddStatus(commandPath, status) != CHIP_NO_ERROR)
290+
{
291+
ChipLogProgress(Zcl, "Failed to send default response");
292+
}
290293
}
291294

292295
bool emberAfBarrierControlClusterBarrierControlGoToPercentCallback(

src/app/clusters/door-lock-server/door-lock-server.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -3314,20 +3314,23 @@ bool DoorLockServer::RemoteOperationEnabled(chip::EndpointId endpointId) const
33143314
mode != OperatingModeEnum::kPrivacy && mode != OperatingModeEnum::kNoRemoteLockUnlock;
33153315
}
33163316

3317-
void DoorLockServer::sendClusterResponse(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
3318-
EmberAfStatus status)
3317+
CHIP_ERROR DoorLockServer::sendClusterResponse(chip::app::CommandHandler * commandObj,
3318+
const chip::app::ConcreteCommandPath & commandPath, EmberAfStatus status)
33193319
{
33203320
VerifyOrDie(nullptr != commandObj);
33213321

3322+
auto err = CHIP_NO_ERROR;
33223323
auto statusAsInteger = to_underlying(status);
33233324
if (statusAsInteger == to_underlying(DlStatus::kOccupied) || statusAsInteger == to_underlying(DlStatus::kDuplicate))
33243325
{
3325-
VerifyOrDie(commandObj->AddClusterSpecificFailure(commandPath, static_cast<chip::ClusterStatus>(status)) == CHIP_NO_ERROR);
3326+
err = commandObj->AddClusterSpecificFailure(commandPath, static_cast<chip::ClusterStatus>(status));
33263327
}
33273328
else
33283329
{
3329-
commandObj->AddStatus(commandPath, ToInteractionModelStatus(status));
3330+
err = commandObj->AddStatus(commandPath, ToInteractionModelStatus(status));
33303331
}
3332+
3333+
return err;
33313334
}
33323335

33333336
EmberAfDoorLockEndpointContext * DoorLockServer::getContext(chip::EndpointId endpointId)

src/app/clusters/door-lock-server/door-lock-server.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,8 @@ class DoorLockServer
422422

423423
bool engageLockout(chip::EndpointId endpointId);
424424

425-
static void sendClusterResponse(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
426-
EmberAfStatus status);
425+
static CHIP_ERROR sendClusterResponse(chip::app::CommandHandler * commandObj,
426+
const chip::app::ConcreteCommandPath & commandPath, EmberAfStatus status);
427427

428428
/**
429429
* @brief Common handler for LockDoor, UnlockDoor, UnlockWithTimeout commands

src/app/clusters/general-commissioning-server/general-commissioning-server.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ using Transport::Session;
5050
{ \
5151
if (!::chip::ChipError::IsSuccess(expr)) \
5252
{ \
53-
commandObj->AddStatus(commandPath, Protocols::InteractionModel::Status::code, #expr); \
53+
CHIP_ERROR statusErr = commandObj->AddStatus(commandPath, Protocols::InteractionModel::Status::code); \
54+
if (statusErr != CHIP_NO_ERROR) \
55+
{ \
56+
ChipLogError(Zcl, "%s: %" CHIP_ERROR_FORMAT, #expr, statusErr.Format()); \
57+
} \
5458
return true; \
5559
} \
5660
} while (false)

src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp

+13-11
Original file line numberDiff line numberDiff line change
@@ -414,13 +414,13 @@ bool GetProviderAndFabric(chip::app::CommandHandler * commandObj, const chip::ap
414414

415415
if (nullptr == provider)
416416
{
417-
commandObj->AddStatus(commandPath, Status::Failure, "Internal consistency error on provider!");
417+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::Failure, "Internal consistency error on provider!");
418418
return false;
419419
}
420420

421421
if (nullptr == fabric)
422422
{
423-
commandObj->AddStatus(commandPath, Status::Failure, "Internal consistency error on access fabric!");
423+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::Failure, "Internal consistency error on access fabric!");
424424
return false;
425425
}
426426

@@ -460,7 +460,7 @@ bool emberAfGroupKeyManagementClusterKeySetWriteCallback(
460460
Status status = ValidateKeySetWriteArguments(commandData);
461461
if (status != Status::Success)
462462
{
463-
commandObj->AddStatus(commandPath, status, "Failure to validate KeySet data dependencies.");
463+
commandObj->AddStatusAndLogIfFailure(commandPath, status, "Failure to validate KeySet data dependencies.");
464464
return true;
465465
}
466466

@@ -470,7 +470,8 @@ bool emberAfGroupKeyManagementClusterKeySetWriteCallback(
470470
// supported by the server, because it is ... a new value unrecognized
471471
// by a legacy server, then the server SHALL generate a general
472472
// constraint error
473-
commandObj->AddStatus(commandPath, Status::ConstraintError, "Received unknown GroupKeySecurityPolicyEnum value");
473+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::ConstraintError,
474+
"Received unknown GroupKeySecurityPolicyEnum value");
474475
return true;
475476
}
476477

@@ -481,8 +482,8 @@ bool emberAfGroupKeyManagementClusterKeySetWriteCallback(
481482
// any action attempting to set CacheAndSync in the
482483
// GroupKeySecurityPolicy field SHALL fail with an INVALID_COMMAND
483484
// error.
484-
commandObj->AddStatus(commandPath, Status::InvalidCommand,
485-
"Received a CacheAndSync GroupKeySecurityPolicyEnum when MCSP not supported");
485+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::InvalidCommand,
486+
"Received a CacheAndSync GroupKeySecurityPolicyEnum when MCSP not supported");
486487
return true;
487488
}
488489

@@ -528,7 +529,7 @@ bool emberAfGroupKeyManagementClusterKeySetWriteCallback(
528529
err = provider->SetKeySet(fabric->GetFabricIndex(), compressed_fabric_id, keyset);
529530
if (CHIP_ERROR_INVALID_LIST_LENGTH == err)
530531
{
531-
commandObj->AddStatus(commandPath, Status::ResourceExhausted, "Not enough space left to add a new KeySet");
532+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::ResourceExhausted, "Not enough space left to add a new KeySet");
532533
return true;
533534
}
534535

@@ -564,7 +565,7 @@ bool emberAfGroupKeyManagementClusterKeySetReadCallback(
564565
if (CHIP_NO_ERROR != provider->GetKeySet(fabricIndex, commandData.groupKeySetID, keyset))
565566
{
566567
// KeySet ID not found
567-
commandObj->AddStatus(commandPath, Status::NotFound, "Keyset ID not found in KeySetRead");
568+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::NotFound, "Keyset ID not found in KeySetRead");
568569
return true;
569570
}
570571

@@ -628,7 +629,8 @@ bool emberAfGroupKeyManagementClusterKeySetRemoveCallback(
628629
{
629630
// SPEC: This command SHALL fail with an INVALID_COMMAND status code back to the initiator if the GroupKeySetID being
630631
// removed is 0, which is the Key Set associated with the Identity Protection Key (IPK).
631-
commandObj->AddStatus(commandPath, Status::InvalidCommand, "Attempted to KeySetRemove the identity protection key!");
632+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::InvalidCommand,
633+
"Attempted to KeySetRemove the identity protection key!");
632634
return true;
633635
}
634636

@@ -647,7 +649,7 @@ bool emberAfGroupKeyManagementClusterKeySetRemoveCallback(
647649
}
648650

649651
// Send status response.
650-
commandObj->AddStatus(commandPath, status, "KeySetRemove failed");
652+
commandObj->AddStatusAndLogIfFailure(commandPath, status, "KeySetRemove failed");
651653
return true;
652654
}
653655

@@ -699,7 +701,7 @@ bool emberAfGroupKeyManagementClusterKeySetReadAllIndicesCallback(
699701
auto keysIt = provider->IterateKeySets(fabricIndex);
700702
if (nullptr == keysIt)
701703
{
702-
commandObj->AddStatus(commandPath, Status::Failure, "Failed iteration of key set indices!");
704+
commandObj->AddStatusAndLogIfFailure(commandPath, Status::Failure, "Failed iteration of key set indices!");
703705
return true;
704706
}
705707

src/app/clusters/groups-server/groups-server.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,11 @@ bool emberAfGroupsClusterAddGroupIfIdentifyingCallback(app::CommandHandler * com
351351
status = GroupAdd(fabricIndex, endpointId, groupId, groupName);
352352
}
353353

354-
commandObj->AddStatus(commandPath, status);
354+
CHIP_ERROR sendErr = commandObj->AddStatus(commandPath, status);
355+
if (CHIP_NO_ERROR != sendErr)
356+
{
357+
ChipLogDetail(Zcl, "Groups: failed to send %s: %" CHIP_ERROR_FORMAT, "status_response", sendErr.Format());
358+
}
355359
return true;
356360
}
357361

src/app/clusters/window-covering-server/window-covering-server.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,7 @@ bool emberAfWindowCoveringClusterStopMotionCallback(app::CommandHandler * comman
771771
}
772772
}
773773

774-
commandObj->AddStatus(commandPath, Status::Success);
775-
return true;
774+
return CHIP_NO_ERROR == commandObj->AddStatus(commandPath, Status::Success);
776775
}
777776

778777
/**

src/app/tests/TestCommandInteraction.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1095,8 +1095,9 @@ void TestCommandInteraction::TestCommandHandlerCommandEncodeExternalFailure(nlTe
10951095

10961096
err = commandHandler.AddResponseData(ConcreteCommandPath(path.mEndpointId, path.mClusterId, path.mCommandId), BadFields());
10971097
NL_TEST_ASSERT(apSuite, err != CHIP_NO_ERROR);
1098-
commandHandler.AddStatus(ConcreteCommandPath(path.mEndpointId, path.mClusterId, path.mCommandId),
1099-
Protocols::InteractionModel::Status::Failure);
1098+
err = commandHandler.AddStatus(ConcreteCommandPath(path.mEndpointId, path.mClusterId, path.mCommandId),
1099+
Protocols::InteractionModel::Status::Failure);
1100+
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
11001101
err = commandHandler.Finalize(commandPacket);
11011102
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
11021103

0 commit comments

Comments
 (0)