Commit 069d315e authored by unknown's avatar unknown
Browse files

Merge joreland@bk-internal.mysql.com:/home/bk/mysql-5.1-ndb-new

into  eel.(none):/home/jonas/src/mysql-5.1-new


storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp:
  Auto merged
storage/ndb/src/kernel/vm/ndbd_malloc_impl.hpp:
  merge
parents b1fd1321 c86ab7d8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ Cmvmi::Cmvmi(Block_context& ctx) :

Cmvmi::~Cmvmi()
{
  m_shared_page_pool.clear();
}


+26 −14
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@
#include <EventLogger.hpp>
extern EventLogger g_eventLogger;

#include <record_types.hpp>

/**
 * ---<a>-----<b>-----<c>-----<d>---> (time)
 *
@@ -95,7 +97,6 @@ Lgman::Lgman(Block_context & ctx) :
  m_logfile_group_hash.setSize(10);
  m_file_pool.setSize(10);
  m_data_buffer_pool.setSize(10);
  m_log_waiter_pool.setSize(10000);
}
  
Lgman::~Lgman()
@@ -118,6 +119,10 @@ Lgman::execREAD_CONFIG_REQ(Signal* signal)
    m_ctx.m_config.getOwnConfigIterator();
  ndbrequire(p != 0);

  Pool_context pc;
  pc.m_block = this;
  m_log_waiter_pool.wo_pool_init(RT_LGMAN_LOG_WAITER, pc);

  ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
  conf->senderRef = reference();
  conf->senderData = senderData;
@@ -271,9 +276,9 @@ Lgman::execDUMP_STATE_ORD(Signal* signal){
      if (!ptr.p->m_log_buffer_waiters.isEmpty())
      {
	Uint32 free_buffer= ptr.p->m_free_buffer_words;
	LocalDLFifoList<Log_waiter> 
	  list(m_log_waiter_pool, ptr.p->m_log_buffer_waiters);
	Ptr<Log_waiter> waiter;
	Local_log_waiter_list 
	  list(m_log_waiter_pool, ptr.p->m_log_buffer_waiters);
	list.first(waiter);
	infoEvent("  free_buffer_words: %d head(waiters).sz: %d %d",
		  ptr.p->m_free_buffer_words,
@@ -282,13 +287,21 @@ Lgman::execDUMP_STATE_ORD(Signal* signal){
      }
      if (!ptr.p->m_log_sync_waiters.isEmpty())
      {
	LocalDLFifoList<Log_waiter> 
	  list(m_log_waiter_pool, ptr.p->m_log_sync_waiters);
	Ptr<Log_waiter> waiter;
	Local_log_waiter_list 
	  list(m_log_waiter_pool, ptr.p->m_log_sync_waiters);
	list.first(waiter);
	infoEvent("  m_last_synced_lsn: %lld: %d head(waiters).m_sync_lsn: %lld",
	infoEvent("  m_last_synced_lsn: %lld head(waiters %x).m_sync_lsn: %lld",
		  ptr.p->m_last_synced_lsn,
		  waiter.i,
		  waiter.p->m_sync_lsn);
	
	while(!waiter.isNull())
	{
	  ndbout_c("ptr: %x %p lsn: %lld next: %x", 
		   waiter.i, waiter.p, waiter.p->m_sync_lsn, waiter.p->nextList);
	  list.next(waiter);
	}
      }
      m_logfile_group_list.next(ptr);
    }
@@ -1031,7 +1044,7 @@ Logfile_client::sync_lsn(Signal* signal,
    bool empty= false;
    Ptr<Lgman::Log_waiter> wait;
    {
      LocalDLFifoList<Lgman::Log_waiter> 
      Lgman::Local_log_waiter_list
	list(m_lgman->m_log_waiter_pool, ptr.p->m_log_sync_waiters);
      
      empty= list.isEmpty();
@@ -1065,8 +1078,7 @@ Lgman::force_log_sync(Signal* signal,
		      Ptr<Logfile_group> ptr, 
		      Uint32 lsn_hi, Uint32 lsn_lo)
{
  LocalDLFifoList<Lgman::Log_waiter> 
    list(m_log_waiter_pool, ptr.p->m_log_sync_waiters);
  Local_log_waiter_list list(m_log_waiter_pool, ptr.p->m_log_sync_waiters);
  Uint64 force_lsn = lsn_hi; force_lsn <<= 32; force_lsn += lsn_lo;

  if(ptr.p->m_last_sync_req_lsn < force_lsn)
@@ -1125,7 +1137,7 @@ Lgman::force_log_sync(Signal* signal,
void
Lgman::process_log_sync_waiters(Signal* signal, Ptr<Logfile_group> ptr)
{
  LocalDLFifoList<Log_waiter> 
  Local_log_waiter_list 
    list(m_log_waiter_pool, ptr.p->m_log_sync_waiters);

  if(list.isEmpty())
@@ -1144,7 +1156,7 @@ Lgman::process_log_sync_waiters(Signal* signal, Ptr<Logfile_group> ptr)
    SimulatedBlock* b = globalData.getBlock(block);
    b->execute(signal, waiter.p->m_callback, 0);

    list.release(waiter);
    list.releaseFirst(waiter);
  }
  
  if(removed && !list.isEmpty())
@@ -1260,7 +1272,7 @@ Logfile_client::get_log_buffer(Signal* signal, Uint32 sz,
    bool empty= false;
    {
      Ptr<Lgman::Log_waiter> wait;
      LocalDLFifoList<Lgman::Log_waiter> 
      Lgman::Local_log_waiter_list
	list(m_lgman->m_log_waiter_pool, ptr.p->m_log_buffer_waiters);
      
      empty= list.isEmpty();
@@ -1486,7 +1498,7 @@ void
Lgman::process_log_buffer_waiters(Signal* signal, Ptr<Logfile_group> ptr)
{
  Uint32 free_buffer= ptr.p->m_free_buffer_words;
  LocalDLFifoList<Log_waiter> 
  Local_log_waiter_list 
    list(m_log_waiter_pool, ptr.p->m_log_buffer_waiters);

  if(list.isEmpty())
@@ -1505,7 +1517,7 @@ Lgman::process_log_buffer_waiters(Signal* signal, Ptr<Logfile_group> ptr)
    SimulatedBlock* b = globalData.getBlock(block);
    b->execute(signal, waiter.p->m_callback, 0);

    list.release(waiter);
    list.releaseFirst(waiter);
  }
  
  if(removed && !list.isEmpty())
+16 −11
Original line number Diff line number Diff line
@@ -28,6 +28,9 @@
#include "diskpage.hpp"
#include <signaldata/GetTabInfo.hpp>

#include <WOPool.hpp>
#include <SLFifoList.hpp>

class Lgman : public SimulatedBlock
{
public:
@@ -77,18 +80,19 @@ protected:
public:
  struct Log_waiter
  {
    Callback m_callback;
    union {
      Uint32 m_size;
      Uint64 m_sync_lsn;
    };
    Uint32 m_block;
    Callback m_callback;
    union {
      Uint32 nextPool;
    Uint32 nextList;
    Uint32 m_magic;
  };
    Uint32 prevList;
  };

  typedef RecordPool<Log_waiter, WOPool> Log_waiter_pool;
  typedef SLFifoListImpl<Log_waiter_pool, Log_waiter> Log_waiter_list;
  typedef LocalSLFifoListImpl<Log_waiter_pool, Log_waiter> Local_log_waiter_list;
  
  struct Undofile
  {
@@ -183,13 +187,14 @@ public:
                                  Logfile_group::LG_FLUSH_THREAD;
    
    Uint64 m_last_lsn;
    Uint64 m_last_sync_req_lsn;
    Uint64 m_last_synced_lsn;
    Uint64 m_last_sync_req_lsn; // Outstanding
    Uint64 m_last_synced_lsn;   // 
    Uint64 m_max_sync_req_lsn;  // User requested lsn
    union {
      Uint64 m_last_read_lsn;
      Uint64 m_last_lcp_lsn;
    };
    DLFifoList<Log_waiter>::Head m_log_sync_waiters;
    Log_waiter_list::Head m_log_sync_waiters;
    
    Buffer_idx m_tail_pos[3]; // 0 is cut, 1 is saved, 2 is current
    Buffer_idx m_file_pos[2]; // 0 tail, 1 head = { file_ptr_i, page_no }
@@ -199,7 +204,7 @@ public:
    DLFifoList<Undofile>::Head m_meta_files;// Files being created or dropped
    
    Uint32 m_free_buffer_words;    // Free buffer page words
    DLFifoList<Log_waiter>::Head m_log_buffer_waiters;
    Log_waiter_list::Head m_log_buffer_waiters;
    Page_map::Head m_buffer_pages; // Pairs of { ptr.i, count }
    struct Position {
      Buffer_idx m_current_page;   // { m_buffer_pages.i, left in range }
@@ -234,7 +239,7 @@ private:
  friend class Logfile_client;
  ArrayPool<Undofile> m_file_pool;
  ArrayPool<Logfile_group> m_logfile_group_pool;
  ArrayPool<Log_waiter> m_log_waiter_pool;
  Log_waiter_pool m_log_waiter_pool;

  Page_map::DataBufferPool m_data_buffer_pool;

+5 −7
Original line number Diff line number Diff line
@@ -24,8 +24,7 @@
/**
 * Operations for dd
 *    PGMAN_PAGE_REQUEST
 *    LGMAN_LOG_BUFFER_WAITER
 *    LGMAN_LOG_SYNC_WAITER
 *    LGMAN_LOG_WAITER
 *    DBTUP_PAGE_REQUEST
 */
#define RG_DISK_OPERATIONS      1
@@ -45,12 +44,11 @@
/**
 * Record types
 */
#define PGMAN_PAGE_REQUEST      MAKE_TID(1, RG_DISK_OPERATIONS)
#define RT_PGMAN_PAGE_REQUEST      MAKE_TID(1, RG_DISK_OPERATIONS)

#define LGMAN_LOG_BUFFER_WAITER MAKE_TID(2, RG_DISK_OPERATIONS)
#define LGMAN_LOG_SYNC_WAITER   MAKE_TID(3, RG_DISK_OPERATIONS)
#define RT_LGMAN_LOG_WAITER        MAKE_TID(2, RG_DISK_OPERATIONS)

#define DBTUP_PAGE_REQUEST      MAKE_TID(4, RG_DISK_OPERATIONS)
#define DBTUP_EXTENT_INFO       MAKE_TID(5, RG_DISK_RECORDS)
#define RT_DBTUP_PAGE_REQUEST      MAKE_TID(3, RG_DISK_OPERATIONS)
#define RT_DBTUP_EXTENT_INFO       MAKE_TID(4, RG_DISK_RECORDS)

#endif
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ public:
   */
  bool setSize(Uint32 noOfElements, bool align = false, bool exit_on_error = true, bool guard = true);
  bool set(T*, Uint32 cnt, bool align = false);
  void clear() { theArray = 0; }

  inline Uint32 getNoOfFree() const {
    return noOfFree;
Loading