summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/rep/storage/GCIContainer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/rep/storage/GCIContainer.hpp')
-rw-r--r--storage/ndb/src/old_files/rep/storage/GCIContainer.hpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/rep/storage/GCIContainer.hpp b/storage/ndb/src/old_files/rep/storage/GCIContainer.hpp
new file mode 100644
index 00000000000..48cbc66bfbd
--- /dev/null
+++ b/storage/ndb/src/old_files/rep/storage/GCIContainer.hpp
@@ -0,0 +1,121 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef GCI_CONTAINER_HPP
+#define GCI_CONTAINER_HPP
+
+#include <Vector.hpp>
+
+#include "LogRecord.hpp"
+#include "GCIBuffer.hpp"
+
+#undef swap
+#include <list>
+#include <iterator>
+
+/**
+ * @class GCIContainer
+ * @brief Responsible for storing LogRecord:s in GCIBuffer:s
+ *
+ * Each GCIBuffer stored in the GCIContainer is named by a pair <GCI, id>.
+ * (On PS REP the id is the nodeId, on SS REP the id is the node group).
+ */
+class GCIContainer {
+public:
+ GCIContainer(Uint32 maxNoOfIds);
+ ~GCIContainer();
+
+ /***************************************************************************
+ * GCIBuffer interface
+ ***************************************************************************/
+ /**
+ * @return GCIBuffer if success, NULL otherwise
+ */
+ GCIBuffer * createGCIBuffer(Uint32 gci, Uint32 id);
+
+ /**
+ * Destroy all buffers with GCI strictly less than gci.
+ */
+ void destroyGCIBuffersBeforeGCI(Uint32 gci, Uint32 id);
+
+ /**
+ * Destroy all buffers with GCI gci.
+ * @return true if buffer was deleted, false if no buffer exists
+ */
+ bool destroyGCIBuffer(Uint32 gci, Uint32 id);
+
+ /**
+ * Fetch buffer
+ * @return GCIBuffer for gci, or NULL if no buffer found
+ */
+ GCIBuffer * getGCIBuffer(Uint32 gci, Uint32 id);
+
+ /**
+ * Set that buffer is completed, i.e. no more records are to be inserted
+ */
+ void setCompleted(Uint32 gci, Uint32 id);
+
+
+ /**
+ * @fn insertPage
+ * @param gci GCI this page belongs to.
+ * @param id Id this page belongs to.
+ * @param dataPtr Pointer originating from Page::m_page
+ * @param dataBLen Length in bytes of data following dataptr.
+ */
+ void insertPage(Uint32 gci, Uint32 id, char * dataPtr, Uint32 dataBLen);
+
+
+ /***************************************************************************
+ * Record interface
+ ***************************************************************************/
+ void insertLogRecord(Uint32 id, Uint32 tableId, Uint32 operation,
+ class LinearSectionPtr ptr[3], Uint32 gci);
+
+ void insertMetaRecord(Uint32 id, Uint32 tableId,
+ class LinearSectionPtr ptr[3], Uint32 gci);
+
+ /**
+ * Get available (complete) GCI Buffers that exists in the container.
+ * first == last means that there is one complete buffer
+ * @param id Id for which to as for available gci buffers.
+ * @param first First complete gci buffer
+ * @param last Last complete gci buffer
+ */
+ void getAvailableGCIBuffers(Uint32 id, Uint32 * first, Uint32 * last);
+
+ /**
+ * Resets the gcicontainer to its original state (initial state and empty)
+ * I.e., same state as when the object was first constructed.
+ * @return true if reset was ok
+ */
+ bool reset();
+
+private:
+ NdbMutex* theMutexPtr;
+ MutexVector <GCIBuffer *> m_bufferList; ///< All GCIBuffers stored
+
+ typedef struct GCIRange {
+ Uint32 m_firstGCI;
+ Uint32 m_lastGCI;
+ };
+
+ Uint32 m_maxNoOfIds;
+
+ GCIRange * gciRange; ///< Array of GCI ranges for each id
+};
+
+#endif