You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by Igor Galić <i....@brainsware.org> on 2013/11/02 00:34:09 UTC
Re: [12/17] git commit: TS-2302: convert Log::error_log into a
generic prefedined LogObject
----- Original Message -----
> TS-2302: convert Log::error_log into a generic prefedined LogObject
>
> Initialize LogObject pointer arrays to NULL before using them. Use
> const accessors to get to LogObject::m_name. Sprinkle more const
> through the logging API.
>
> Use the standard ConfigProcessor pattern to reload LogConfig. This
> removes part of the need to keep a global array of inactive LogObjects.
> Using newDeleter() in LogObjectManager::unmanage_api_object(),
> removes the rest of this need. Now the whole Log::inactive_object
> array can be removed.
>
> Using the ConfigProcessor reload pattern also fixes a memory leak,
> since previously the old LogConfig object was never freed.
>
> Fix LogObjectManager::transfer_objects(). Previously, matching
> objects would be assigned to the new manager, but also left on the
> old manager, leaving it unclear who should have ownership of which
> log object.
>
> Move a bunch of inline LogObjectManager methods to the .cc file
> where they are mre easily accessible. None of these are called often
> enough to justify being inline.
>
> The global Log::error_log is now managed my the log object manager
> just like other predefined log objects. This lets us remove code
> in a number of places that were treating is specially. It also fixes
> a log collation bug in LogConfig::init(). This function attempts
> to figure out which log space threshold to use. If all the logs are
> being collated, then it used the orphan space value. The problem
> is that the error log was never checked (and it is never collated),
> so enabling log collation and making a poor choice of space thresholds
> causes error logging to stop. Like the rest of the bugs here, the
> fix is to stop treating the error log specially, and bring it into
> the log object manager.
>
>
[snip]
> Commit: 538eba5c078f6b14cbd3b6e6887da669fd7205c9
[snip]
> diff --git a/proxy/logging/Log.h b/proxy/logging/Log.h
> index 883567f..a646275 100644
> --- a/proxy/logging/Log.h
> +++ b/proxy/logging/Log.h
> @@ -404,7 +404,7 @@ public:
> inkcoreapi static int error(const char *format, ...) TS_PRINTFLIKE(1, 2);
>
> // public data members
> - inkcoreapi static TextLogObject *error_log;
> + inkcoreapi static LogObject *error_log;
> static LogConfig *config;
> static LogFieldList global_field_list;
> // static LogBufferList global_buffer_full_list; vl: not used
> @@ -414,12 +414,6 @@ public:
> static LogObject *global_scrap_object;
> static LoggingMode logging_mode;
>
> - // keep track of inactive objects
> - static LogObject **inactive_objects;
> - static size_t numInactiveObjects;
> - static size_t maxInactiveObjects;
> - static void add_to_inactive(LogObject * obj);
> -
> // logging thread stuff
> static EventNotify *preproc_notify;
> static void *preproc_thread_main(void *args);
> @@ -442,6 +436,7 @@ public:
>
> Log(); // shut up stupid DEC C++ compiler
Really? Do we really care about DEC's C++ Compiler?
> + friend void RegressionTest_LogObjectManager_Transfer(RegressionTest *,
> int, int *);
> private:
>
> static void periodic_tasks(long time_now);
>
[snip]
> @@ -1335,3 +1418,67 @@ LogObjectManager::log(LogAccess * lad)
>
> return ret;
> }
> +
> +void
> +LogObjectManager::flush_all_objects()
> +{
> + for (unsigned i = 0; i < this->_numObjects; ++i) {
> + if (this->_objects[i]) {
> + this->_objects[i]->force_new_buffer();
> + }
> + }
> +
> + for (unsigned i = 0; i < this->_numAPIobjects; ++i) {
> + if (this->_APIobjects[i]) {
> + this->_APIobjects[i]->force_new_buffer();
> + }
> + }
> +}
> +
> +#if TS_HAS_TESTS
> +
> +static LogObject *
> +MakeTestLogObject(const char * name)
> +{
> + const char * tmpdir = getenv("TMPDIR");
> + LogFormat format("testfmt", NULL);
> +
> + if (!tmpdir) {
> + tmpdir = "/tmp";
> + }
> +
> + return NEW(new LogObject(&format, tmpdir, name,
> + LOG_FILE_ASCII /* file_format */, name /* header */,
> + 1 /* rolling_enabled */, 1 /* flush_threads */));
> +}
> +
> +REGRESSION_TEST(LogObjectManager_Transfer)(RegressionTest * t, int /* atype
> ATS_UNUSED */, int * pstatus)
> +{
> + TestBox box(t, pstatus);
> +
> + // There used to be a lot of confusion around whether LogObjects were
> owned by ome or more LogObjectManager
Who is `ome` ?
> + // objects, or handed off to static storage in the Log class. This test
> just verifies that this is no longer
> + // the case.
> + {
> + LogObjectManager mgr1;
> + LogObjectManager mgr2;
> +
> + mgr1.manage_object(MakeTestLogObject("object1"));
> + mgr1.manage_object(MakeTestLogObject("object2"));
> + mgr1.manage_object(MakeTestLogObject("object3"));
> + mgr1.manage_object(MakeTestLogObject("object4"));
> +
> + mgr2.transfer_objects(mgr1);
> +
> + rprintf(t, "mgr1 has %d objects, mgr2 has %d objects\n",
> + (int)mgr1.get_num_objects(), (int)mgr2.get_num_objects());
> +
> + rprintf(t, "running Log::periodoc_tasks()\n");
> + Log::periodic_tasks(ink_get_hrtime() / HRTIME_SECOND);
> + rprintf(t, "Log::periodoc_tasks() done\n");
> + }
> +
> + box = REGRESSION_TEST_PASSED;
> +}
> +
> +#endif
[snip]
++ i
Igor Galić
Tel: +43 (0) 664 886 22 883
Mail: i.galic@brainsware.org
URL: http://brainsware.org/
GPG: 6880 4155 74BD FD7C B515 2EA5 4B1D 9E08 A097 C9AE