Skip to content

Commit

Permalink
MINIFICPP-2512 Only use a single logger per processor
Browse files Browse the repository at this point in the history
  • Loading branch information
lordgamez committed Feb 18, 2025
1 parent a2f8851 commit bf3e783
Show file tree
Hide file tree
Showing 61 changed files with 116 additions and 130 deletions.
6 changes: 5 additions & 1 deletion extension-utils/include/core/AbstractProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,16 @@
#include "core/Processor.h"
#include "core/PropertyDefinition.h"
#include "minifi-cpp/core/RelationshipDefinition.h"
#include "core/logging/LoggerFactory.h"

namespace org::apache::nifi::minifi::core {
template<typename ProcessorT>
class AbstractProcessor : public ProcessorImpl {
public:
using ProcessorImpl::ProcessorImpl;
explicit AbstractProcessor(std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ProcessorT>::getLogger(uuid_);
}

void initialize() final {
static_assert(std::is_same_v<typename decltype(ProcessorT::Properties)::value_type, PropertyReference>);
Expand Down
7 changes: 3 additions & 4 deletions extensions/bustache/ApplyTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ namespace org::apache::nifi::minifi::processors {
class ApplyTemplate final : public core::ProcessorImpl {
public:
explicit ApplyTemplate(const std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid) {}
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ApplyTemplate>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Applies the mustache template specified by the \"Template\" property and writes the output to the flow file content. "
"FlowFile attributes are used as template parameters.";
Expand All @@ -57,9 +59,6 @@ class ApplyTemplate final : public core::ProcessorImpl {

void onTrigger(core::ProcessContext& context, core::ProcessSession& session) override;
void initialize() override;

private:
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ApplyTemplate>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::processors
4 changes: 2 additions & 2 deletions extensions/civetweb/processors/ListenHTTP.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@ class ListenHTTP : public core::ProcessorImpl {
public:
friend struct ::org::apache::nifi::minifi::test::ListenHTTPTestAccessor;

explicit ListenHTTP(std::string_view name, const utils::Identifier& uuid = {})
explicit ListenHTTP(const std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ListenHTTP>::getLogger(uuid_);
callbacks_.log_message = &logMessage;
callbacks_.log_access = &logAccess;
}
Expand Down Expand Up @@ -284,7 +285,6 @@ class ListenHTTP : public core::ProcessorImpl {
return handler_ ? handler_->requestCount() : 0;
}

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ListenHTTP>::getLogger(uuid_);
CivetCallbacks callbacks_;
std::unique_ptr<CivetServer> server_;
std::unique_ptr<Handler> handler_;
Expand Down
1 change: 0 additions & 1 deletion extensions/couchbase/processors/GetCouchbaseKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ class GetCouchbaseKey final : public core::AbstractProcessor<GetCouchbaseKey> {
private:
std::shared_ptr<controllers::CouchbaseClusterService> couchbase_cluster_service_;
CouchbaseValueType document_type_ = CouchbaseValueType::Json;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<GetCouchbaseKey>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::couchbase::processors
1 change: 0 additions & 1 deletion extensions/couchbase/processors/PutCouchbaseKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ class PutCouchbaseKey final : public core::AbstractProcessor<PutCouchbaseKey> {
CouchbaseValueType document_type_ = CouchbaseValueType::Json;
::couchbase::persist_to persist_to_ = ::couchbase::persist_to::none;
::couchbase::replicate_to replicate_to_ = ::couchbase::replicate_to::none;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<PutCouchbaseKey>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::couchbase::processors
4 changes: 2 additions & 2 deletions extensions/elasticsearch/PostElasticsearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ class PostElasticsearch : public core::ProcessorImpl {
public:
EXTENSIONAPI static constexpr const char* Description = "An Elasticsearch/Opensearch post processor that uses the Elasticsearch/Opensearch _bulk REST API.";

explicit PostElasticsearch(const std::string& name, const utils::Identifier& uuid = {})
explicit PostElasticsearch(const std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<PostElasticsearch>::getLogger(uuid_);
}
~PostElasticsearch() override = default;

Expand Down Expand Up @@ -115,7 +116,6 @@ class PostElasticsearch : public core::ProcessorImpl {
std::string host_url_;
std::shared_ptr<ElasticsearchCredentialsControllerService> credentials_service_;
http::HTTPClient client_;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<PostElasticsearch>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::extensions::elasticsearch
2 changes: 1 addition & 1 deletion extensions/execute-process/ExecuteProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class ExecuteProcess final : public core::ProcessorImpl {
explicit ExecuteProcess(const std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid),
working_dir_(".") {
logger_ = core::logging::LoggerFactory<ExecuteProcess>::getLogger(uuid_);
}
~ExecuteProcess() override {
if (pid_ > 0) {
Expand Down Expand Up @@ -113,7 +114,6 @@ class ExecuteProcess final : public core::ProcessorImpl {
void readOutput(core::ProcessSession& session) const;
bool writeToFlowFile(core::ProcessSession& session, std::shared_ptr<core::FlowFile>& flow_file, std::span<const char> buffer) const;

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ExecuteProcess>::getLogger(uuid_);
std::string command_;
std::string command_argument_;
std::filesystem::path working_dir_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class CollectKubernetesPodMetrics : public core::ProcessorImpl {
public:
explicit CollectKubernetesPodMetrics(const std::string_view name, const utils::Identifier& uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<CollectKubernetesPodMetrics>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "A processor which collects pod metrics when MiNiFi is run inside Kubernetes.";
Expand All @@ -55,7 +56,6 @@ class CollectKubernetesPodMetrics : public core::ProcessorImpl {
void onTrigger(core::ProcessContext& context, core::ProcessSession& session) override;

private:
gsl::not_null<std::shared_ptr<core::logging::Logger>> logger_ = gsl::make_not_null(core::logging::LoggerFactory<CollectKubernetesPodMetrics>::getLogger(uuid_));
std::shared_ptr<controllers::KubernetesControllerService> kubernetes_controller_service_;
};

Expand Down
1 change: 0 additions & 1 deletion extensions/libarchive/BinFiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,6 @@ class BinFiles : public core::ProcessorImpl {
BinManager binManager_;

private:
std::shared_ptr<core::logging::Logger> logger_{core::logging::LoggerFactory<BinFiles>::getLogger(uuid_)};
uint32_t batchSize_{1};
uint32_t maxBinCount_{100};
core::FlowFileStore file_store_;
Expand Down
6 changes: 3 additions & 3 deletions extensions/libarchive/CompressContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,9 @@ namespace org::apache::nifi::minifi::processors {

class CompressContent : public core::ProcessorImpl {
public:
explicit CompressContent(std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
explicit CompressContent(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<CompressContent>::getLogger(uuid_);
}
~CompressContent() override = default;

Expand Down Expand Up @@ -214,7 +215,6 @@ class CompressContent : public core::ProcessorImpl {

void processFlowFile(const std::shared_ptr<core::FlowFile>& flowFile, core::ProcessSession& session);

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<CompressContent>::getLogger(uuid_);
int compressLevel_{};
compress_content::CompressionMode compressMode_;
compress_content::ExtendedCompressionFormat compressFormat_;
Expand Down
6 changes: 3 additions & 3 deletions extensions/libarchive/FocusArchiveEntry.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ namespace org::apache::nifi::minifi::processors {

class FocusArchiveEntry : public core::ProcessorImpl {
public:
explicit FocusArchiveEntry(std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
explicit FocusArchiveEntry(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<FocusArchiveEntry>::getLogger(uuid_);
}
~FocusArchiveEntry() override = default;

Expand Down Expand Up @@ -80,7 +81,6 @@ class FocusArchiveEntry : public core::ProcessorImpl {
};

private:
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<FocusArchiveEntry>::getLogger(uuid_);
static std::shared_ptr<utils::IdGenerator> id_generator_;
};

Expand Down
4 changes: 2 additions & 2 deletions extensions/libarchive/ManipulateArchive.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ using core::logging::Logger;

class ManipulateArchive : public core::ProcessorImpl {
public:
explicit ManipulateArchive(std::string_view name, const utils::Identifier& uuid = {})
explicit ManipulateArchive(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ManipulateArchive>::getLogger(uuid_);
}
~ManipulateArchive() override = default;

Expand Down Expand Up @@ -91,7 +92,6 @@ class ManipulateArchive : public core::ProcessorImpl {
void initialize() override;

private:
std::shared_ptr<Logger> logger_ = core::logging::LoggerFactory<ManipulateArchive>::getLogger(uuid_);
std::string before_, after_, operation_, destination_, targetEntry_;
};

Expand Down
2 changes: 1 addition & 1 deletion extensions/libarchive/MergeContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ class MergeContent : public processors::BinFiles {
public:
explicit MergeContent(const std::string& name, const utils::Identifier& uuid = {})
: processors::BinFiles(name, uuid) {
logger_ = core::logging::LoggerFactory<MergeContent>::getLogger(uuid_);
mergeStrategy_ = merge_content_options::MERGE_STRATEGY_DEFRAGMENT;
mergeFormat_ = merge_content_options::MERGE_FORMAT_CONCAT_VALUE;
delimiterStrategy_ = merge_content_options::DELIMITER_STRATEGY_FILENAME;
Expand Down Expand Up @@ -389,7 +390,6 @@ class MergeContent : public processors::BinFiles {
private:
void validatePropertyOptions();

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<MergeContent>::getLogger(uuid_);
std::string mergeStrategy_;
std::string mergeFormat_;
std::string correlationAttributeName_;
Expand Down
6 changes: 2 additions & 4 deletions extensions/libarchive/UnfocusArchiveEntry.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ using core::logging::Logger;

class UnfocusArchiveEntry : public core::ProcessorImpl {
public:
explicit UnfocusArchiveEntry(std::string_view name, const utils::Identifier& uuid = {})
explicit UnfocusArchiveEntry(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<UnfocusArchiveEntry>::getLogger(uuid_);
}
~UnfocusArchiveEntry() override = default;

Expand Down Expand Up @@ -74,9 +75,6 @@ class UnfocusArchiveEntry : public core::ProcessorImpl {
static int ok_cb(struct archive *, void* /*d*/) { return ARCHIVE_OK; }
static la_ssize_t write_cb(struct archive *, void *d, const void *buffer, size_t length);
};

private:
std::shared_ptr<Logger> logger_ = core::logging::LoggerFactory<UnfocusArchiveEntry>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::processors
2 changes: 0 additions & 2 deletions extensions/mqtt/processors/AbstractMQTTProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,6 @@ class AbstractMQTTProcessor : public core::ProcessorImpl {
mqtt::MqttQoS last_will_qos_{mqtt::MqttQoS::LEVEL_0};
bool last_will_retain_ = false;
std::string last_will_content_type_;

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<AbstractMQTTProcessor>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::processors
2 changes: 1 addition & 1 deletion extensions/mqtt/processors/ConsumeMQTT.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class ConsumeMQTT : public processors::AbstractMQTTProcessor {
public:
explicit ConsumeMQTT(std::string_view name, const utils::Identifier& uuid = {})
: processors::AbstractMQTTProcessor(name, uuid) {
logger_ = core::logging::LoggerFactory<ConsumeMQTT>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "This Processor gets the contents of a FlowFile from a MQTT broker for a specified topic. "
Expand Down Expand Up @@ -207,7 +208,6 @@ class ConsumeMQTT : public processors::AbstractMQTTProcessor {
std::unordered_map<uint16_t, std::string> alias_to_topic_;

moodycamel::ConcurrentQueue<SmartMessage> queue_;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ConsumeMQTT>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::processors
4 changes: 2 additions & 2 deletions extensions/mqtt/processors/PublishMQTT.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ namespace org::apache::nifi::minifi::processors {

class PublishMQTT : public processors::AbstractMQTTProcessor {
public:
explicit PublishMQTT(std::string_view name, const utils::Identifier& uuid = {})
explicit PublishMQTT(const std::string_view name, const utils::Identifier& uuid = {})
: processors::AbstractMQTTProcessor(name, uuid) {
metrics_ = gsl::make_not_null(std::make_shared<PublishMQTTMetrics>(*this, in_flight_message_counter_));
logger_ = core::logging::LoggerFactory<PublishMQTT>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "PublishMQTT serializes FlowFile content as an MQTT payload, sending the message to the configured topic and broker.";
Expand Down Expand Up @@ -191,7 +192,6 @@ class PublishMQTT : public processors::AbstractMQTTProcessor {
bool retain_ = false;
std::optional<std::chrono::seconds> message_expiry_interval_;
InFlightMessageCounter in_flight_message_counter_;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<PublishMQTT>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::processors
4 changes: 2 additions & 2 deletions extensions/opencv/CaptureRTSPFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ namespace org::apache::nifi::minifi::processors {
class CaptureRTSPFrame final : public core::ProcessorImpl {
public:
explicit CaptureRTSPFrame(const std::string_view name, const utils::Identifier &uuid = {})
: ProcessorImpl(name, uuid) {
: ProcessorImpl(std::move(name), uuid) {
logger_ = core::logging::LoggerFactory<CaptureRTSPFrame>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Captures a frame from the RTSP stream at specified intervals.";
Expand Down Expand Up @@ -90,7 +91,6 @@ class CaptureRTSPFrame final : public core::ProcessorImpl {
void notifyStop() override;

private:
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<CaptureRTSPFrame>::getLogger(uuid_);
std::mutex mutex_;
std::string rtsp_username_;
std::string rtsp_password_;
Expand Down
2 changes: 1 addition & 1 deletion extensions/opencv/MotionDetector.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class MotionDetector final : public core::ProcessorImpl {
public:
explicit MotionDetector(const std::string_view name, const utils::Identifier &uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<MotionDetector>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Detect motion from captured images.";
Expand Down Expand Up @@ -98,7 +99,6 @@ class MotionDetector final : public core::ProcessorImpl {
private:
bool detectAndDraw(cv::Mat &frame);

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<MotionDetector>::getLogger(uuid_);
std::mutex mutex_;
cv::Mat background_;
cv::Mat bg_img_;
Expand Down
2 changes: 1 addition & 1 deletion extensions/procfs/processors/ProcFsMonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class ProcFsMonitor final : public core::ProcessorImpl {
public:
explicit ProcFsMonitor(const std::string_view name, utils::Identifier uuid = utils::Identifier())
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ProcFsMonitor>::getLogger(uuid_);
}
~ProcFsMonitor() override = default;

Expand Down Expand Up @@ -141,7 +142,6 @@ class ProcFsMonitor final : public core::ProcessorImpl {
ResultRelativeness result_relativeness_ = ResultRelativeness::Absolute;

std::optional<uint8_t> decimal_places_;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ProcFsMonitor>::getLogger(uuid_);

ProcFs proc_fs_;

Expand Down
3 changes: 1 addition & 2 deletions extensions/python/ExecutePythonProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class ExecutePythonProcessor : public core::ProcessorImpl {
processor_initialized_(false),
python_dynamic_(false),
reload_on_script_change_(true) {
logger_ = core::logging::LoggerFactory<ExecutePythonProcessor>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Executes a script given the flow file and a process session. "
Expand Down Expand Up @@ -153,8 +154,6 @@ class ExecutePythonProcessor : public core::ProcessorImpl {
bool processor_initialized_;
bool python_dynamic_;

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ExecutePythonProcessor>::getLogger(uuid_);

std::string script_to_exec_;
bool reload_on_script_change_;
std::optional<std::chrono::file_clock::time_point> last_script_write_time_;
Expand Down
5 changes: 2 additions & 3 deletions extensions/script/ExecuteScript.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,9 @@ enum class ScriptEngineOption {

class ExecuteScript : public core::ProcessorImpl {
public:
explicit ExecuteScript(std::string_view name, const utils::Identifier &uuid = {})
explicit ExecuteScript(const std::string_view name, const utils::Identifier &uuid = {})
: ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ExecuteScript>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Executes a script given the flow file and a process session. "
Expand Down Expand Up @@ -99,8 +100,6 @@ class ExecuteScript : public core::ProcessorImpl {
}

private:
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ExecuteScript>::getLogger(uuid_);

std::unique_ptr<extensions::script::ScriptExecutor> script_executor_;
};

Expand Down
2 changes: 1 addition & 1 deletion extensions/smb/FetchSmb.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class FetchSmb final : public core::ProcessorImpl {
public:
explicit FetchSmb(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<FetchSmb>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Fetches files from a SMB Share. Designed to be used in tandem with ListSmb.";
Expand Down Expand Up @@ -83,7 +84,6 @@ class FetchSmb final : public core::ProcessorImpl {

private:
std::shared_ptr<SmbConnectionControllerService> smb_connection_controller_service_;
std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<FetchSmb>::getLogger(uuid_);
};

} // namespace org::apache::nifi::minifi::extensions::smb
4 changes: 2 additions & 2 deletions extensions/smb/ListSmb.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ namespace org::apache::nifi::minifi::extensions::smb {

class ListSmb : public core::ProcessorImpl {
public:
explicit ListSmb(std::string_view name, const utils::Identifier& uuid = {})
explicit ListSmb(const std::string_view name, const utils::Identifier& uuid = {})
: core::ProcessorImpl(name, uuid) {
logger_ = core::logging::LoggerFactory<ListSmb>::getLogger(uuid_);
}

EXTENSIONAPI static constexpr const char* Description = "Retrieves a listing of files from an SMB share. For each file that is listed, "
Expand Down Expand Up @@ -142,7 +143,6 @@ class ListSmb : public core::ProcessorImpl {
private:
std::shared_ptr<core::FlowFile> createFlowFile(core::ProcessSession& session, const utils::ListedFile& listed_file);

std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<ListSmb>::getLogger(uuid_);
std::filesystem::path input_directory_;
std::shared_ptr<SmbConnectionControllerService> smb_connection_controller_service_;
std::unique_ptr<minifi::utils::ListingStateManager> state_manager_;
Expand Down
Loading

0 comments on commit bf3e783

Please sign in to comment.