Remove Deferred Updates
Remove deferred consumption of settings Manual/NTP and allow instant
consumption.
Tested:
Manually set the timeMode to NTP on the WEB and successfully.
busctl get-property xyz.openbmc_project.Settings
/xyz/openbmc_project/time/sync_method
xyz.openbmc_project.Time.Synchronization TimeSyncMethod
s "xyz.openbmc_project.Time.Synchronization.Method.NTP"
Manually set the date time successfully by D-Bus when timeMode is MANUAL
busctl set-property xyz.openbmc_project.Time.Manager
/xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
t 1514765953791262
Manually set the date time failed by D-Bus when timeMode is NTP.
busctl set-property xyz.openbmc_project.Time.Manager
/xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
t 1514765953791262
Failed to set property Elapsed on interface
xyz.openbmc_project.TIme.EpochTime: The operation failed
~# journalctl -b | grep timemanager
Jan 01 00:15:26 fp5280g2 phosphor-timemanager[309]: Error in setting
system time
Jan 01 00:15:26 fp5280g2 phosphor-timemanager[309]: The operation
failed
Refer: https://lists.ozlabs.org/pipermail/openbmc/2020-April/021409.html
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I7be25a9d0f56615bad6800a0b07df7f84fc0acc3
diff --git a/manager.cpp b/manager.cpp
index 92a7a3c..4cc0b57 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -2,17 +2,17 @@
#include "utils.hpp"
+#include <assert.h>
+
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/elog.hpp>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
-#include <xyz/openbmc_project/State/Host/server.hpp>
namespace rules = sdbusplus::bus::match::rules;
namespace // anonymous
{
-constexpr auto HOST_CURRENT_STATE = "CurrentHostState";
constexpr auto SYSTEMD_TIME_SERVICE = "org.freedesktop.timedate1";
constexpr auto SYSTEMD_TIME_PATH = "/org/freedesktop/timedate1";
@@ -27,26 +27,14 @@
using namespace phosphor::logging;
-const std::set<std::string> Manager::managedProperties = {PROPERTY_TIME_MODE};
-
Manager::Manager(sdbusplus::bus::bus& bus) : bus(bus), settings(bus)
{
using namespace sdbusplus::bus::match::rules;
- hostStateChangeMatch =
- std::make_unique<decltype(hostStateChangeMatch)::element_type>(
- bus, propertiesChanged(settings.hostState, settings::hostStateIntf),
- std::bind(std::mem_fn(&Manager::onHostStateChanged), this,
- std::placeholders::_1));
settingsMatches.emplace_back(
bus, propertiesChanged(settings.timeSyncMethod, settings::timeSyncIntf),
std::bind(std::mem_fn(&Manager::onSettingsChanged), this,
std::placeholders::_1));
- checkHostOn();
-
- // Restore settings from persistent storage
- restoreSettings();
-
// Check the settings daemon to process the new settings
auto mode = getSetting(settings.timeSyncMethod.c_str(),
settings::timeSyncIntf, PROPERTY_TIME_MODE);
@@ -54,53 +42,14 @@
onPropertyChanged(PROPERTY_TIME_MODE, mode);
}
-void Manager::addListener(PropertyChangeListner* listener)
-{
- // Notify listener about the initial value
- listener->onModeChanged(timeMode);
-
- listeners.insert(listener);
-}
-
-void Manager::restoreSettings()
-{
- auto mode = utils::readData<std::string>(modeFile);
- if (!mode.empty())
- {
- timeMode = utils::strToMode(mode);
- }
-}
-
-void Manager::checkHostOn()
-{
- using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
- auto hostService = utils::getService(bus, settings.hostState.c_str(),
- settings::hostStateIntf);
- auto stateStr = utils::getProperty<std::string>(
- bus, hostService.c_str(), settings.hostState.c_str(),
- settings::hostStateIntf, HOST_CURRENT_STATE);
- auto state = Host::convertHostStateFromString(stateStr);
- hostOn = (state == Host::HostState::Running);
-}
-
void Manager::onPropertyChanged(const std::string& key,
const std::string& value)
{
- if (hostOn)
- {
- // If host is on, set the values as requested time mode.
- // And when host becomes off, notify the listeners.
- setPropertyAsRequested(key, value);
- }
- else
- {
- // If host is off, notify listeners
- if (key == PROPERTY_TIME_MODE)
- {
- setCurrentTimeMode(value);
- onTimeModeChanged(value);
- }
- }
+ assert(key == PROPERTY_TIME_MODE);
+
+ // Notify listeners
+ setCurrentTimeMode(value);
+ onTimeModeChanged(value);
}
int Manager::onSettingsChanged(sdbusplus::message::message& msg)
@@ -123,30 +72,6 @@
return 0;
}
-void Manager::setPropertyAsRequested(const std::string& key,
- const std::string& value)
-{
- if (key == PROPERTY_TIME_MODE)
- {
- setRequestedMode(value);
- }
- else
- {
- // The key shall be already the supported one
- using InvalidArgumentError =
- sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
- using namespace xyz::openbmc_project::Common;
- elog<InvalidArgumentError>(
- InvalidArgument::ARGUMENT_NAME(key.c_str()),
- InvalidArgument::ARGUMENT_VALUE(value.c_str()));
- }
-}
-
-void Manager::setRequestedMode(const std::string& mode)
-{
- requestedMode = mode;
-}
-
void Manager::updateNtpSetting(const std::string& value)
{
bool isNtp =
@@ -168,50 +93,6 @@
}
}
-void Manager::onHostStateChanged(sdbusplus::message::message& msg)
-{
- using Interface = std::string;
- using Property = std::string;
- using Value = std::string;
- using Properties = std::map<Property, std::variant<Value>>;
- using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
-
- Interface interface;
- Properties properties;
-
- msg.read(interface, properties);
-
- for (const auto& p : properties)
- {
- if (p.first == HOST_CURRENT_STATE)
- {
- auto state = Host::convertHostStateFromString(
- std::get<std::string>(p.second));
- onHostState(state == Host::HostState::Running);
- break;
- }
- }
-}
-
-void Manager::onHostState(bool on)
-{
- hostOn = on;
- if (hostOn)
- {
- log<level::INFO>("Changing time settings is *deferred* now");
- return;
- }
- log<level::INFO>("Changing time settings allowed now");
- if (!requestedMode.empty())
- {
- if (setCurrentTimeMode(requestedMode))
- {
- onTimeModeChanged(requestedMode);
- }
- setRequestedMode({}); // Clear requested mode
- }
-}
-
bool Manager::setCurrentTimeMode(const std::string& mode)
{
auto newMode = utils::strToMode(mode);
@@ -220,7 +101,6 @@
log<level::INFO>("Time mode is changed",
entry("MODE=%s", mode.c_str()));
timeMode = newMode;
- utils::writeData(modeFile, mode);
return true;
}
else
@@ -231,10 +111,6 @@
void Manager::onTimeModeChanged(const std::string& mode)
{
- for (const auto listener : listeners)
- {
- listener->onModeChanged(timeMode);
- }
// When time_mode is updated, update the NTP setting
updateNtpSetting(mode);
}