/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ /** * \file wrfc.h * * Qpid asynchronous store plugin library * * File containing code for class mrg::journal::wrfc (write rotating * file controller). See class documentation for details. * * \author Kim van der Riet */ #ifndef QPID_LEGACYSTORE_JRNL_WRFC_H #define QPID_LEGACYSTORE_JRNL_WRFC_H namespace mrg { namespace journal { class wrfc; } } #include #include "qpid/legacystore/jrnl/enums.h" #include "qpid/legacystore/jrnl/rrfc.h" namespace mrg { namespace journal { /** * \class wrfc * \brief Class to handle write management of a journal rotating file controller. */ class wrfc : public rfc { private: u_int32_t _fsize_sblks; ///< Size of journal files in sblks u_int32_t _fsize_dblks; ///< Size of journal files in dblks u_int32_t _enq_cap_offs_dblks; ///< Enqueue capacity offset u_int64_t _rid; ///< Master counter for record ID (rid) bool _reset_ok; ///< Flag set when reset succeeds bool _owi; ///< Overwrite indicator bool _frot; ///< Flag is true for first rotation, false otherwise public: wrfc(const lpmgr* lpmp); virtual ~wrfc(); /** * \brief Initialize the controller. * \param fsize_sblks Size of each journal file in sblks. * \param rdp Struct carrying restore information. Optional for non-restore use, defaults to 0 (NULL). */ using rfc::initialize; void initialize(const u_int32_t fsize_sblks, rcvdat* rdp = 0); /** * \brief Rotate active file controller to next file in rotating file group. * \exception jerrno::JERR__NINIT if called before calling initialize(). */ iores rotate(); /** * \brief Returns the index of the earliest complete file within the rotating * file group. Unwritten files are excluded. The currently active file is * excluded unless it is the only written file. */ u_int16_t earliest_index() const; /** * \brief Determines if a proposed write would cause the enqueue threshold to be exceeded. * * The following routine finds whether the next write will take the write pointer to beyond the * enqueue limit threshold. The following illustrates how this is achieved. *
        * Current file index: 4                         +---+----------+
        * X's mark still-enqueued records               |msg| 1-thresh |
        * msg = current msg size + unwritten cache      +---+----------+
        * thresh = JRNL_ENQ_THRESHOLD as a fraction     ^              V
        *            +-------+-------+-------+-------+--+----+-------+-+-----+-------+
        * file num ->|   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |
        * enq recs ->| X  XX |XX XXX |XX XXXX|XXXXXXX|XX     |       |       |     X |
        *            +-------+-------+-------+-------+--+----+-------+-+-----+-------+
        *                                               ^        ^       ^
        *                                  subm_dblks --+        |       |
        *                                                      These files must be free of enqueues
        *                                                      If not, return true.
        * 
* \param enq_dsize_dblks Proposed size of write in dblocks */ bool enq_threshold(const u_int32_t enq_dsize_dblks) const; inline u_int64_t rid() const { return _rid; } inline u_int64_t get_incr_rid() { return _rid++; } bool wr_reset(); inline bool is_wr_reset() const { return _reset_ok; } inline bool owi() const { return _owi; } inline bool frot() const { return _frot; } // Convenience access methods to current file controller inline int fh() const { return _curr_fc->wr_fh(); } inline u_int32_t subm_cnt_dblks() const { return _curr_fc->wr_subm_cnt_dblks(); } inline std::size_t subm_offs() const { return _curr_fc->wr_subm_offs(); } inline u_int32_t add_subm_cnt_dblks(u_int32_t a) { return _curr_fc->add_wr_subm_cnt_dblks(a); } inline u_int32_t cmpl_cnt_dblks() const { return _curr_fc->wr_cmpl_cnt_dblks(); } inline std::size_t cmpl_offs() const { return _curr_fc->wr_cmpl_offs(); } inline u_int32_t add_cmpl_cnt_dblks(u_int32_t a) { return _curr_fc->add_wr_cmpl_cnt_dblks(a); } inline u_int16_t aio_cnt() const { return _curr_fc->aio_cnt(); } inline u_int16_t incr_aio_cnt() { return _curr_fc->incr_aio_cnt(); } inline u_int16_t decr_aio_cnt() { return _curr_fc->decr_aio_cnt(); } inline bool is_void() const { return _curr_fc->wr_void(); } inline bool is_empty() const { return _curr_fc->wr_empty(); } inline u_int32_t remaining_dblks() const { return _curr_fc->wr_remaining_dblks(); } inline bool is_full() const { return _curr_fc->is_wr_full(); }; inline bool is_compl() const { return _curr_fc->is_wr_compl(); }; inline u_int32_t aio_outstanding_dblks() const { return _curr_fc->wr_aio_outstanding_dblks(); } inline bool file_rotate() const { return _curr_fc->wr_file_rotate(); } // Debug aid std::string status_str() const; }; } // namespace journal } // namespace mrg #endif // ifndef QPID_LEGACYSTORE_JRNL_WRFC_H