summaryrefslogtreecommitdiff
path: root/ndb/src/common/transporter/OSE_Transporter.hpp
blob: 898352366baa536045413dc1b351fcacdaa46147 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/* 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 */

//****************************************************************************
//
//  AUTHOR
//      Magnus Svensson
//
//  NAME
//      OSE_Transporter
//
//  DESCRIPTION
//      A OSE_Transporter instance is created when OSE-signal communication 
//      shall be used (user specified). It handles connect, disconnect, 
//      send and receive.
//
//
//
//***************************************************************************/
#ifndef OSE_Transporter_H
#define OSE_Transporter_H

#include "Transporter.hpp"

#include "ose.h"

class OSE_Transporter : public Transporter {
  friend class OSE_Receiver;
  friend class TransporterRegistry;
public:
  
  // Initialize member variables
  OSE_Transporter(int prioASignalSize,
		  int prioBSignalSize,
		  NodeId localNodeId,
		  const char * lHostName,
		  NodeId remoteNodeId,
		  NodeId serverNodeId,
		  const char * rHostName,
		  int byteorder,
		  bool compression, 
		  bool checksum, 
		  bool signalId,
		  Uint32 reportFreq = 4096);
  
  // Disconnect, delete send buffers and receive buffer
  ~OSE_Transporter();
  
  /**
   * Allocate buffers for sending and receiving
   */
  bool initTransporter();

  /**
   * Connect
   */
  virtual void doConnect();

  /**
   * Disconnect
   */
  virtual void doDisconnect();
  
  Uint32 * getWritePtr(Uint32 lenBytes, Uint32 prio);
  void updateWritePtr(Uint32 lenBytes, Uint32 prio);
  
  /**
   * Retrieves the contents of the send buffers, copies it into 
   * an OSE signal and sends it. Until the send buffers are empty
   */
  void doSend();

  bool hasDataToSend() const {
    return prioBSignal->dataSignal.length > 0;
  }
  
protected:
  /**
   * Not implemented
   *   OSE uses async connect/disconnect
   */
  virtual bool connectImpl(Uint32 timeOut){
    return false;
  }
  
  /**
   * Not implemented
   *   OSE uses async connect/disconnect
   */
  virtual void disconnectImpl(){
  }

private:
  const bool isServer;
  
  int maxPrioBDataSize;

  /**
   * Remote node name
   * On same machine: ndb_node1
   * On remote machine: rhost/ndb_node1
   **/
  PROCESS  remoteNodePid;
  OSATTREF remoteNodeRef;
  char remoteNodeName[256];

  Uint32 signalIdCounter;

  int prioBSignalSize;

  Uint32 * prioBInsertPtr;
  union SIGNAL * prioBSignal;

  struct NdbTransporterData * allocPrioASignal(Uint32 lenBytes) const;
  
  /**
   * Statistics
   */
  Uint32 reportFreq;
  Uint32 receiveCount;
  Uint64 receiveSize;
  Uint32 sendCount;
  Uint64 sendSize;

  void initSignals();

  /**
   * OSE Receiver callbacks
   */
  void huntReceived(struct NdbTransporterHunt * sig);
  bool connectReq(struct NdbTransporterConnectReq * sig);
  bool connectRef(struct NdbTransporterConnectRef * sig);
  bool connectConf(struct NdbTransporterConnectConf * sig);
  bool disconnectOrd(struct NdbTransporterDisconnectOrd * sig);

  enum OSETransporterState {
    DISCONNECTED              = 0,
    WAITING_FOR_HUNT          = 1,
    WAITING_FOR_CONNECT_REQ   = 2,
    WAITING_FOR_CONNECT_CONF  = 3,
    CONNECTED                 = 4
  } state;
};

// Define of OSE_Transporter_H
#endif