summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h399
1 files changed, 399 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h
new file mode 100644
index 00000000000..d4518fd3825
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h
@@ -0,0 +1,399 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_LogRecordStore.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_HASH_LOG_RECORD_STORE_H
+#define TAO_HASH_LOG_RECORD_STORE_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/LogRecordStore.h"
+#include "ace/Containers.h"
+#include "ace/RB_Tree.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Null_Mutex.h"
+#include "ace/RW_Thread_Mutex.h"
+#include "ace/Reactor.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+#define LOG_DEFAULT_MAX_REC_LIST_LEN 100
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+
+/**
+ * @class TAO_Hash_LogRecordStore
+ *
+ * @brief A concrete container class for storing DsLogAdmin::LogRecords
+ *
+ * This implementation uses an ACE_RB_Tree to store LogRecords.
+ * Permits fast searches by id and iteration, while allowing for
+ * ring-buffer like wrapping of entries.
+ *
+ * @note The name of this class is somewhat misleading, as it no
+ * longer uses a ACE_Hash_Map.
+ *
+ * @note LogRecords should be indexed by both id and timestamp.
+ * However, timestamps are not unique keys and there are no ACE
+ * multimap containers.
+ *
+ * @todo If ACE_RB_Tree supported an insertion "hint" like std::map,
+ * log insertion would be O(1) instead of O(lgN). This could be an
+ * issue for large log channels.
+ */
+class TAO_Log_Serv_Export TAO_Hash_LogRecordStore
+ : public TAO_LogRecordStore
+{
+ public:
+
+ // = Initialization and termination methods
+
+ /// Constructor.
+ TAO_Hash_LogRecordStore (TAO_LogMgr_i* logmgr,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType log_full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ );
+
+ /// Destructor.
+ virtual ~TAO_Hash_LogRecordStore (void);
+
+ /// Initialization.
+ virtual int open (void);
+
+ /// Close the record store.
+ virtual int close (void);
+
+
+ // = Log Parameters
+
+ /// Gets the administrative state of the log
+ virtual DsLogAdmin::AdministrativeState
+ get_administrative_state (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the administrative state of the log
+ virtual void
+ set_administrative_state (DsLogAdmin::AdministrativeState
+ ACE_ENV_ARG_DECL);
+
+ /// Get the capacity alarm thresholds
+ virtual DsLogAdmin::CapacityAlarmThresholdList*
+ get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the capacity alarm thresholds
+ virtual void
+ set_capacity_alarm_thresholds (const DsLogAdmin::CapacityAlarmThresholdList& thresholds
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the forwarding state
+ virtual DsLogAdmin::ForwardingState
+ get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the forwarding state
+ virtual void
+ set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL);
+
+ /// Get the log duration
+ virtual DsLogAdmin::TimeInterval
+ get_interval (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the log duration.
+ virtual void
+ set_interval (const DsLogAdmin::TimeInterval & interval
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the log full action
+ virtual DsLogAdmin::LogFullActionType
+ get_log_full_action (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the log full action
+ virtual void
+ set_log_full_action(DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL);
+
+ /// Get the list of the QoS properties supported by the log.
+ virtual DsLogAdmin::QoSList*
+ get_log_qos (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the list of the QoS properties supported by the log.
+ virtual void
+ set_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the max record life
+ virtual CORBA::ULong
+ get_max_record_life (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the max record life
+ virtual void
+ set_max_record_life (CORBA::ULong life
+ ACE_ENV_ARG_DECL);
+
+ /// Get the current set value of the max size of the log data.
+ virtual CORBA::ULongLong
+ get_max_size (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the max size of log data. size == 0, => infinite.
+ virtual void
+ set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL);
+
+ /// Get the weekly scheduling parameters
+ virtual DsLogAdmin::WeekMask*
+ get_week_mask (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set the weekly scheduling parameters.
+ virtual void
+ set_week_mask (const DsLogAdmin::WeekMask & masks
+ ACE_ENV_ARG_DECL);
+
+
+ // = LogRecordStore status methods
+
+ /// Gets the current size of the log data.
+ virtual CORBA::ULongLong
+ get_current_size (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Get the number of records in the log right now.
+ virtual CORBA::ULongLong
+ get_n_records (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ // = LogRecordStore gauge
+
+ /// Gets the current value of the "gauge" that measures the total
+ /// size of the records written to the log.
+ virtual CORBA::ULongLong
+ get_gauge(ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Resets the "gauge" to 0
+ virtual void
+ reset_gauge(ACE_ENV_SINGLE_ARG_DECL);
+
+
+ // = Record logging, retrieval, update and removal methods.
+
+ /// Insert rec into storage. Returns 0 on success -1 on failure and 1
+ /// if the log is full.
+ virtual int
+ log (const DsLogAdmin::LogRecord &rec ACE_ENV_ARG_DECL);
+
+ /// Deletes "old" records from the store.
+ virtual int
+ purge_old_records (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set single record attributes.
+ virtual void
+ set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Set the attributes of all records that matches the
+ /// constraints with same attr_list.
+ virtual CORBA::ULong
+ set_records_attribute (const char * grammar,
+ const char * c,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Get the attributes of the record with id <id>. Raises
+ /// DsLogAdmin::InvalidRecordId
+ virtual DsLogAdmin::NVList*
+ get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId));
+
+ /// Ensure changes have been flushed to persistent media
+ /// Returns 0 on success, -1 on failure.
+ virtual int
+ flush (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Returns all records in the log that match the given constraint
+ /// <c>.
+ virtual DsLogAdmin::RecordList*
+ query (const char * grammar,
+ const char * c,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Retrieve <how_many> records from time <from_time> using iterator
+ /// <i>.
+ virtual DsLogAdmin::RecordList*
+ retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns the number of records matching constraint <c>.
+ virtual CORBA::ULong
+ match (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching constraint <c>.
+ virtual CORBA::ULong
+ delete_records (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching ids in <ids>
+ virtual CORBA::ULong
+ delete_records_by_id (const DsLogAdmin::RecordIdList & ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong
+ remove_old_records (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Read-Write Lock
+ virtual ACE_SYNCH_RW_MUTEX& lock();
+
+/* protected: */
+ /// Defines types to represent the container that maps RecordIds to
+ /// LogRecords.
+ typedef ACE_RB_Tree <DsLogAdmin::RecordId,
+ DsLogAdmin::LogRecord,
+ ACE_Less_Than<DsLogAdmin::RecordId>,
+ ACE_Null_Mutex> LOG_RECORD_STORE;
+ typedef LOG_RECORD_STORE::ITERATOR LOG_RECORD_STORE_ITER;
+ typedef LOG_RECORD_STORE::ENTRY LOG_RECORD_STORE_ENTRY;
+
+protected:
+ /// Set rec to the pointer to the LogRecord with the given
+ /// id. Returns 0 on success, -1 on failure.
+ int retrieve_i (DsLogAdmin::RecordId id,
+ DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL);
+
+ /// Update into storage. Returns 0 on success -1 on failure.
+ int update_i (DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL);
+
+ /// Remove the record with id <id> from the LogRecordStore.
+ /// Returns 0 on success, -1 on failure.
+ int remove_i (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL);
+
+ /// Remove the record from the LogRecordStore.
+ void remove_i (LOG_RECORD_STORE_ITER iter
+ ACE_ENV_ARG_DECL);
+
+ DsLogAdmin::RecordList* query_i (const char *constraint,
+ DsLogAdmin::Iterator_out &iter_out,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Throws DsLogAdmin::InvalidGrammar if we don't support this grammar.
+ void check_grammar (const char* grammar ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar));
+
+
+ /// The size of a LogRecord
+ size_t log_record_size(const DsLogAdmin::LogRecord &rec);
+
+ TAO_LogMgr_i* logmgr_i_;
+
+ /// Assigned to a new RecordId and then incremented
+ /// @@ Should I have a list of reclaimed id's for when records are
+ /// deleted?
+ DsLogAdmin::RecordId maxid_;
+
+ /// The maximum size of the log.
+ CORBA::ULongLong max_size_;
+
+ /// The log id to which this LogRecordStore relates.
+ DsLogAdmin::LogId id_;
+
+ /// The current size (in bytes) of the log.
+ CORBA::ULongLong current_size_;
+
+ /// The current number of records in the log.
+ CORBA::ULongLong num_records_;
+
+ /// The current value of the "gauge" that measures the total size of
+ /// the records written to the log.
+ CORBA::ULongLong gauge_;
+
+ /// The max size of the record list returned in a query.
+ CORBA::ULong max_rec_list_len_;
+
+ /// The map of RecordId's to LogRecord's
+ LOG_RECORD_STORE rec_map_;
+
+
+ /// The administrative state of the log
+ DsLogAdmin::AdministrativeState admin_state_;
+
+ DsLogAdmin::CapacityAlarmThresholdList
+ thresholds_;
+
+ /// The forwarding state of the log
+ DsLogAdmin::ForwardingState forward_state_;
+
+ /// The interval during which the log should be in operation
+ DsLogAdmin::TimeInterval interval_;
+
+ /// The action to take if the log reaches max capacity
+ DsLogAdmin::LogFullActionType log_full_action_;
+
+ /// The list of the QoS properties supported by the log.
+ DsLogAdmin::QoSList log_qos_;
+
+ /// The maximum record lifetime
+ CORBA::ULong max_record_life_;
+
+ /// The days of the week that the log should be operational
+ DsLogAdmin::WeekMask weekmask_;
+
+
+ ACE_Reactor* reactor_;
+
+ PortableServer::POA_var iterator_poa_;
+
+ mutable ACE_SYNCH_RW_MUTEX lock_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /*TAO_HASH_LOG_RECORD_STORE_H*/