From 5a8af59841ed4eb0bc573ba877d5ade7f31aa212 Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Thu, 5 Dec 2024 23:15:29 -0800 Subject: [PATCH] Seperate InitDataModel out --- .../CodegenDataModelProvider.cpp | 10 +++++++--- .../CodegenDataModelProvider.h | 3 +++ src/app/data-model-provider/Provider.h | 3 +++ src/app/server/Server.cpp | 17 +++++++++++++---- src/app/tests/test-interaction-model-api.h | 2 ++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/app/codegen-data-model-provider/CodegenDataModelProvider.cpp b/src/app/codegen-data-model-provider/CodegenDataModelProvider.cpp index 81fe64064efea4..cf0e7105aac993 100644 --- a/src/app/codegen-data-model-provider/CodegenDataModelProvider.cpp +++ b/src/app/codegen-data-model-provider/CodegenDataModelProvider.cpp @@ -412,6 +412,13 @@ DefaultAttributePersistenceProvider gDefaultAttributePersistence; } // namespace +void CodegenDataModelProvider::InitDataModel() +{ + // Call the Ember-specific InitDataModelHandler + InitDataModelHandler(); + ChipLogProgress(AppServer, "CodegenDataModelHandler initialized."); +} + CHIP_ERROR CodegenDataModelProvider::Startup(DataModel::InteractionModelContext context) { ReturnErrorOnFailure(DataModel::Provider::Startup(context)); @@ -438,9 +445,6 @@ CHIP_ERROR CodegenDataModelProvider::Startup(DataModel::InteractionModelContext } } - // Call the Ember-specific InitDataModelHandler - InitDataModelHandler(); - return CHIP_NO_ERROR; } diff --git a/src/app/codegen-data-model-provider/CodegenDataModelProvider.h b/src/app/codegen-data-model-provider/CodegenDataModelProvider.h index 0493272dbbff47..3c0cd2db4b4b27 100644 --- a/src/app/codegen-data-model-provider/CodegenDataModelProvider.h +++ b/src/app/codegen-data-model-provider/CodegenDataModelProvider.h @@ -126,6 +126,9 @@ class CodegenDataModelProvider : public DataModel::Provider }; public: + /// Initialize the data model internal code to be ready to send and receive data model messages. + void InitDataModel() override; + /// clears out internal caching. Especially useful in unit tests, /// where path caching does not really apply (the same path may result in different outcomes) void Reset() diff --git a/src/app/data-model-provider/Provider.h b/src/app/data-model-provider/Provider.h index c547b75b81984f..b555e2d9d5af2f 100644 --- a/src/app/data-model-provider/Provider.h +++ b/src/app/data-model-provider/Provider.h @@ -47,6 +47,9 @@ class Provider : public ProviderMetadataTree public: virtual ~Provider() = default; + // Initialize the data model internal code to be ready to send and receive data model messages. + virtual void InitDataModel() {} + // `context` pointers will be guaranteed valid until Shutdown is called() virtual CHIP_ERROR Startup(InteractionModelContext context) { diff --git a/src/app/server/Server.cpp b/src/app/server/Server.cpp index dab68787b2daac..b4b724df056d7f 100644 --- a/src/app/server/Server.cpp +++ b/src/app/server/Server.cpp @@ -169,6 +169,17 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams) SuccessOrExit(err = mAttributePersister.Init(mDeviceStorage)); SetSafeAttributePersistenceProvider(&mAttributePersister); + // SetDataModelProvider() actually initializes/starts the provider. We need + // to preserve the following ordering guarantees: + // + // 1) Provider initialization (under SetDataModelProvider) happens after + // SetSafeAttributePersistenceProvider, since the provider can then use + // the safe persistence provider to implement and initialize its own attribute persistence logic. + // 2) For now, provider initialization happens before InitDataModelHandler(), which depends + // on atttribute persistence being already set up before it runs. Longer-term, the logic from + // InitDataModelHandler should just move into the codegen provider. + app::InteractionModelEngine::GetInstance()->SetDataModelProvider(initParams.dataModelProvider); + { FabricTable::InitParams fabricTableInitParams; fabricTableInitParams.storage = mDeviceStorage; @@ -290,10 +301,8 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams) } #endif // CHIP_CONFIG_ENABLE_SERVER_IM_EVENT - // Set the data model provider, initializing it in the process. This must - // happen after SetSafeAttributePersistenceProvider to ensure the provider - // can utilize the safe persistence provider for its attribute storage. - app::InteractionModelEngine::GetInstance()->SetDataModelProvider(initParams.dataModelProvider); + // This initializes clusters, so should come after lower level initialization. + app::InteractionModelEngine::GetInstance()->GetDataModelProvider()->InitDataModel(); #if defined(CHIP_APP_USE_ECHO) err = InitEchoHandler(&mExchangeMgr); diff --git a/src/app/tests/test-interaction-model-api.h b/src/app/tests/test-interaction-model-api.h index 2120ec4304eb8e..a93c9f6ff984e1 100644 --- a/src/app/tests/test-interaction-model-api.h +++ b/src/app/tests/test-interaction-model-api.h @@ -101,6 +101,8 @@ class TestImCustomDataModel : public DataModel::Provider public: static TestImCustomDataModel & Instance(); + void InitDataModel() override {} + CHIP_ERROR Shutdown() override { return CHIP_NO_ERROR; } DataModel::ActionReturnStatus ReadAttribute(const DataModel::ReadAttributeRequest & request,