📄 log_i.cpp
字号:
{
if (this->admin_state_ == DsLogAdmin::locked)
ACE_THROW (DsLogAdmin::LogLocked ());
else
if (this->op_state_ == DsLogAdmin::disabled)
ACE_THROW (DsLogAdmin::LogDisabled ());
}
return; // we are not scheduled at this time.
}
CORBA::Short num_written (0);
DsLogAdmin::LogRecord record;
for (CORBA::ULong i = 0; i < reclist.length (); i++)
{
// Check if the log is full.
if (avail_status_.log_full == 1
&& this->log_full_action_ == DsLogAdmin::halt )
{
ACE_THROW (DsLogAdmin::LogFull (num_written));
}
else
{
// retval == 1 => log store reached max size.
record = reclist[i]; // can't avoid this copy, reclist is const.
int retval = this->recordstore_.log (record);
if (retval == 1)
{
// The Log is full . check what the policy is
// and take appropriate action.
if (this->log_full_action_ == DsLogAdmin::halt)
avail_status_.log_full = 1;
else // the policy is to wrap. for this we need to delete
{ // a few records. let the record store decide how many.
if (this->recordstore_.purge_old_records () == -1)
ACE_THROW (CORBA::PERSIST_STORE ());
}
// Now, we want to attempt to write the same record again
// so decrement the index to balance the inc. in the for loop.
--i;
}
else
if (retval == 0)
num_written++;
else
ACE_THROW (CORBA::PERSIST_STORE ());
} // else
this->check_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
} // for
}
void
TAO_Log_i::set_record_attribute (DsLogAdmin::RecordId id,
const DsLogAdmin::NVList &attr_list
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidRecordId,
DsLogAdmin::InvalidAttribute))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// TODO: validate attributes here.
DsLogAdmin::LogRecord rec;
if (this->recordstore_.retrieve (id, rec) == -1)
{
ACE_THROW (DsLogAdmin::InvalidRecordId ());
}
rec.attr_list = attr_list;
if (this->recordstore_.update (rec) == -1)
{
ACE_THROW (CORBA::PERSIST_STORE ());
}
}
CORBA::ULong
TAO_Log_i::set_records_attribute (const char *grammar,
const char *constraint,
const DsLogAdmin::NVList
&attr_list ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidGrammar,
DsLogAdmin::InvalidConstraint,
DsLogAdmin::InvalidAttribute))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
DsLogAdmin::Iterator_var iter_out;
DsLogAdmin::RecordList_var rec_list =
this->query (grammar,
constraint,
iter_out
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
for (CORBA::ULong i = 0; i < rec_list->length (); ++i)
{
this->set_record_attribute (rec_list[i].id,
attr_list
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
return rec_list->length ();
}
DsLogAdmin::NVList*
TAO_Log_i::get_record_attribute (DsLogAdmin::RecordId id
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidRecordId))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
DsLogAdmin::LogRecord rec;
if (this->recordstore_.retrieve (id, rec) == -1)
{
ACE_THROW_RETURN (DsLogAdmin::InvalidRecordId (),
0);
}
DsLogAdmin::NVList* nvlist;
ACE_NEW_THROW_EX (nvlist,
DsLogAdmin::NVList (rec.attr_list),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
return nvlist;
}
// @@ Should I just raise the exception?
void
TAO_Log_i::flush (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::UnsupportedQoS))
{
ACE_THROW (CORBA::NO_IMPLEMENT ());
// @@ Perhaps later use a MMAP_Memory_Pool as the backing store, and
// just have this map to its sync method
}
CORBA::Boolean
TAO_Log_i::validate_capacity_alarm_thresholds (
const DsLogAdmin::CapacityAlarmThresholdList & threshs
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
for (CORBA::ULong i = 0; i < threshs.length (); i++)
if (threshs[i] > 100)
return false;
if (threshs.length () != 0)
for (CORBA::ULong i = 0; i < threshs.length () - 1; i++)
if (threshs[i] >= threshs[i +1])
return false;
return true;
}
CORBA::Boolean
TAO_Log_i::scheduled (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TimeBase::TimeT current_time;
ACE_Time_Value now = ACE_OS::gettimeofday ();
ORBSVCS_Time::Time_Value_to_TimeT (current_time, now);
if ((current_time >= interval_.start) &&
((current_time <= interval_.stop) || (interval_.stop == 0)) )
{
if (weekly_intervals_.length () > 0)
{
TimeBase::TimeT current_time;
ACE_Time_Value now = ACE_OS::gettimeofday ();
ORBSVCS_Time::Time_Value_to_TimeT (current_time, now);
// work out when sunday is in nanoseconds.
timeval t;
t = (timeval) now;
struct tm *sunday;
time_t clock = (time_t) t.tv_sec;
sunday = ACE_OS::localtime (&clock);
sunday->tm_sec = 0;
sunday->tm_min = 0;
sunday->tm_hour = 0;
sunday->tm_mday -= sunday->tm_wday;
t.tv_sec = ACE_OS::mktime (sunday) ;
t.tv_usec = 0;
TimeBase::TimeT nano_sunday =
(CORBA::ULongLong) t.tv_sec * 10000000;
for (CORBA::ULong i = 0; i < weekly_intervals_.length (); ++i)
{
if (current_time >= (weekly_intervals_[i].start + nano_sunday) &&
current_time <= (weekly_intervals_[i].stop + nano_sunday))
{
return true;
}
}
return false;
}
else
return true;
}
else
return false;
}
void
TAO_Log_i::check_grammar (const char* grammar
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
DsLogAdmin::InvalidGrammar))
{
// Verify that the grammar is "TCL".
// The spec. asks for "extended TCL"
if (ACE_OS::strcmp (grammar, QUERY_LANG_SUPPORTED_BY_LOG) != 0)
ACE_THROW (DsLogAdmin::InvalidGrammar ());
}
void
TAO_Log_i::copy_attributes (DsLogAdmin::Log_ptr log
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
const DsLogAdmin::LogFullActionType log_full_action =
this->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_log_full_action (log_full_action
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
const CORBA::ULongLong max_size =
this->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_max_size (max_size
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
DsLogAdmin::QoSList_var log_qos =
this->get_log_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_log_qos (log_qos.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
const CORBA::ULong max_record_life =
this->get_max_record_life (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_max_record_life (max_record_life
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
const DsLogAdmin::AdministrativeState adminstrative_state =
this->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
log->set_administrative_state (adminstrative_state
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
const DsLogAdmin::ForwardingState forwarding_state =
this->get_forwarding_state (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_forwarding_state (forwarding_state
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
const DsLogAdmin::TimeInterval interval =
this->get_interval (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_interval (interval
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
DsLogAdmin::CapacityAlarmThresholdList_var capacity_list =
this->get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_capacity_alarm_thresholds (capacity_list.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
DsLogAdmin::WeekMask_var week_mask =
this->get_week_mask (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
log->set_week_mask (week_mask.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
TAO_Log_i::remove_old_records (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TimeBase::TimeT time;
ORBSVCS_Time::Time_Value_to_TimeT (time, ACE_OS::gettimeofday ());
TimeBase::TimeT purge_time = time - this->max_record_life_;
CORBA::ULongLong p_time = (CORBA::ULongLong) purge_time;
static char out[256] = "";
double temp1 = ACE_UINT64_DBLCAST_ADAPTER (p_time);;
ACE_OS::sprintf (out, "time > %.0f", temp1);
// Use an Interpreter to build an expression tree.
TAO_Log_Constraint_Interpreter interpreter (out
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Get the underlying storage.
TAO_LogRecordStore::LOG_RECORD_STORE &store =
this->recordstore_.get_storage ();
// Create an iterator
TAO_LogRecordStore::LOG_RECORD_STORE_ITER iter (store);
CORBA::ULong len = ACE_static_cast (CORBA::ULong, store.current_size ());
// How many entries?
// Iterate over and populate the list.
TAO_LogRecordStore::LOG_RECORD_HASH_MAP_ENTRY *hash_entry;
CORBA::ULong count = 0; // count of matches found.
for (CORBA::ULong i = 0; i < len; ++i)
{
if (iter.next (hash_entry) == -1 || iter.advance () == -1)
{
break;
}
// Use an evaluator.
TAO_Log_Constraint_Visitor evaluator (hash_entry->int_id_);
// Does it match the constraint?
if (interpreter.evaluate (evaluator) == 1)
{
if (this->recordstore_.remove (hash_entry->int_id_.id) == 0)
count++;
}
}
this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
void
TAO_Log_i::check_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
CORBA::ULongLong max_size = this->recordstore_.get_max_size ();
if (max_size != 0 && this->thresholds_.length () > 0)
{
CORBA::ULongLong current_size = this->recordstore_.get_current_size ();
const CORBA::UShort percent =
ACE_static_cast (
CORBA::UShort,
((double) ACE_UINT64_DBLCAST_ADAPTER (current_size * 100U) /
(double) ACE_UINT64_DBLCAST_ADAPTER (max_size)));
while (current_threshold_ < this->thresholds_.length ()
&& this->thresholds_[this->current_threshold_] <= percent)
{
DsLogNotification::PerceivedSeverityType severity =
percent == 100 ? DsLogNotification::critical :
DsLogNotification::minor;
if (notifier_)
{
DsLogAdmin::Log_var log =
this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
notifier_->threshold_alarm (
log.in (),
logid_,
this->thresholds_[this->current_threshold_],
percent,
severity
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
else
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"threshold of %d breached\n",
this->thresholds_[this->current_threshold_]));
}
++this->current_threshold_;
}
if (this->current_threshold_ == this->thresholds_.length ()
&& this->log_full_action_ != DsLogAdmin::halt)
{
this->current_threshold_ = 0;
}
}
}
void
TAO_Log_i::reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
CORBA::ULongLong max_size = this->recordstore_.get_max_size ();
if (max_size != 0 && this->thresholds_.length() > 0)
{
CORBA::ULongLong current_size = this->recordstore_.get_current_size ();
const CORBA::UShort percent =
ACE_static_cast (
CORBA::UShort,
(((double) ACE_UINT64_DBLCAST_ADAPTER (current_size * 100U)) /
(double) ACE_UINT64_DBLCAST_ADAPTER (max_size)));
this->current_threshold_ = 0;
while (this->current_threshold_ < this->thresholds_.length ()
&& this->thresholds_[this->current_threshold_] <= percent)
++this->current_threshold_;
}
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class TAO_Unbounded_Sequence<DsLogAdmin::TimeInterval>;
#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate TAO_Unbounded_Sequence<DsLogAdmin::TimeInterval>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -