MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
VoidFs.cpp
1 /*
2  Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; version 2 of the License.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include "Ndbfs.hpp"
19 
20 #include "AsyncFile.hpp"
21 
22 #include <signaldata/FsOpenReq.hpp>
23 #include <signaldata/FsCloseReq.hpp>
24 #include <signaldata/FsReadWriteReq.hpp>
25 #include <signaldata/FsAppendReq.hpp>
26 #include <signaldata/FsRemoveReq.hpp>
27 #include <signaldata/FsConf.hpp>
28 #include <signaldata/FsRef.hpp>
29 #include <signaldata/NdbfsContinueB.hpp>
30 #include <signaldata/DumpStateOrd.hpp>
31 
32 #include <RefConvert.hpp>
33 #include <Configuration.hpp>
34 
35 VoidFs::VoidFs(Block_context & ctx) :
36  Ndbfs(ctx)
37 {
38  // Set received signals
39  addRecSignal(GSN_SEND_PACKED, &VoidFs::execSEND_PACKED, true);
40  addRecSignal(GSN_READ_CONFIG_REQ, &VoidFs::execREAD_CONFIG_REQ, true);
41  addRecSignal(GSN_DUMP_STATE_ORD, &VoidFs::execDUMP_STATE_ORD, true);
42  addRecSignal(GSN_STTOR, &VoidFs::execSTTOR, true);
43  addRecSignal(GSN_FSOPENREQ, &VoidFs::execFSOPENREQ, true);
44  addRecSignal(GSN_FSCLOSEREQ, &VoidFs::execFSCLOSEREQ, true);
45  addRecSignal(GSN_FSWRITEREQ, &VoidFs::execFSWRITEREQ, true);
46  addRecSignal(GSN_FSREADREQ, &VoidFs::execFSREADREQ, true);
47  addRecSignal(GSN_FSSYNCREQ, &VoidFs::execFSSYNCREQ, true);
48  addRecSignal(GSN_FSAPPENDREQ, &VoidFs::execFSAPPENDREQ, true);
49  addRecSignal(GSN_FSREMOVEREQ, &VoidFs::execFSREMOVEREQ, true);
50  addRecSignal(GSN_FSSUSPENDORD, &VoidFs::execFSSUSPENDORD, true);
51  // Set send signals
52 }
53 
54 VoidFs::~VoidFs()
55 {
56 }
57 
58 void
59 VoidFs::execREAD_CONFIG_REQ(Signal* signal)
60 {
61  const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
62 
63  Uint32 ref = req->senderRef;
64  Uint32 senderData = req->senderData;
65 
66  ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
67  conf->senderRef = reference();
68  conf->senderData = senderData;
69  sendSignal(ref, GSN_READ_CONFIG_CONF, signal,
70  ReadConfigConf::SignalLength, JBB);
71 
72  signal->theData[0] = NdbfsContinueB::ZSCAN_MEMORYCHANNEL_10MS_DELAY;
73  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 10, 1);
74 }
75 
76 void
77 VoidFs::execSTTOR(Signal* signal)
78 {
79  jamEntry();
80 
81  if(signal->theData[1] == 0){ // StartPhase 0
82  jam();
83  signal->theData[3] = 255;
84  sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 4, JBB);
85  return;
86  }
87  ndbrequire(0);
88 }
89 
90 void
91 VoidFs::execSEND_PACKED(Signal* signal)
92 {
93  jamEntry();
94  if (scanningInProgress == false && scanIPC(signal))
95  {
96  jam();
97  scanningInProgress = true;
98  signal->theData[0] = NdbfsContinueB::ZSCAN_MEMORYCHANNEL_NO_DELAY;
99  sendSignal(reference(), GSN_CONTINUEB, signal, 1, JBB);
100  }
101 }
102 
103 void
104 VoidFs::execFSOPENREQ(Signal* signal)
105 {
106  jamEntry();
107  const FsOpenReq * const fsOpenReq = (FsOpenReq *)&signal->theData[0];
108  const BlockReference userRef = fsOpenReq->userReference;
109  const Uint32 userPointer = fsOpenReq->userPointer;
110 
111  Uint32 flags = fsOpenReq->fileFlags;
112  if(flags == FsOpenReq::OM_READONLY){
113  // Initialise FsRef signal
114  FsRef * const fsRef = (FsRef *)&signal->theData[0];
115  fsRef->userPointer = userPointer;
116  fsRef->errorCode = FsRef::fsErrFileDoesNotExist;
117  fsRef->osErrorCode = ~0;
118  sendSignal(userRef, GSN_FSOPENREF, signal, 3, JBB);
119  return;
120  }
121 
122  if(flags & FsOpenReq::OM_WRITEONLY || flags & FsOpenReq::OM_READWRITE){
123  signal->theData[0] = userPointer;
124  signal->theData[1] = c_maxFileNo++;
125  sendSignal(userRef, GSN_FSOPENCONF, signal, 2, JBB);
126  }
127 }
128 
129 void
130 VoidFs::execFSREMOVEREQ(Signal* signal)
131 {
132  jamEntry();
133  const FsRemoveReq * const req = (FsRemoveReq *)signal->getDataPtr();
134  const Uint32 userRef = req->userReference;
135  const Uint32 userPointer = req->userPointer;
136 
137  signal->theData[0] = userPointer;
138  sendSignal(userRef, GSN_FSREMOVECONF, signal, 1, JBB);
139 }
140 
141 /*
142  * PR0: File Pointer DR0: User reference DR1: User Pointer DR2: Flag bit 0= 1
143  * remove file
144  */
145 void
146 VoidFs::execFSCLOSEREQ(Signal * signal)
147 {
148  jamEntry();
149 
150  const FsCloseReq * const req = (FsCloseReq *)signal->getDataPtr();
151  const Uint32 userRef = req->userReference;
152  const Uint32 userPointer = req->userPointer;
153 
154  signal->theData[0] = userPointer;
155  sendSignal(userRef, GSN_FSCLOSECONF, signal, 1, JBB);
156 }
157 
158 void
159 VoidFs::execFSWRITEREQ(Signal* signal)
160 {
161  jamEntry();
162  const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
163  const Uint32 userRef = req->userReference;
164  const Uint32 userPointer = req->userPointer;
165 
166  SectionHandle handle(this, signal);
167  releaseSections(handle);
168 
169  signal->theData[0] = userPointer;
170  sendSignal(userRef, GSN_FSWRITECONF, signal, 1, JBB);
171 }
172 
173 void
174 VoidFs::execFSREADREQ(Signal* signal)
175 {
176  jamEntry();
177 
178  const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
179  const Uint32 userRef = req->userReference;
180  const Uint32 userPointer = req->userPointer;
181 
182  SectionHandle handle(this, signal);
183  releaseSections(handle);
184 
185  signal->theData[0] = userPointer;
186  sendSignal(userRef, GSN_FSREADCONF, signal, 1, JBB);
187 #if 0
188  FsRef * const fsRef = (FsRef *)&signal->theData[0];
189  fsRef->userPointer = userPointer;
190  fsRef->errorCode = FsRef::fsErrEnvironmentError;
191  fsRef->osErrorCode = ~0; // Indicate local error
192  sendSignal(userRef, GSN_FSREADREF, signal, 3, JBB);
193 #endif
194 }
195 
196 void
197 VoidFs::execFSSYNCREQ(Signal * signal)
198 {
199  jamEntry();
200 
201  BlockReference userRef = signal->theData[1];
202  const UintR userPointer = signal->theData[2];
203 
204  signal->theData[0] = userPointer;
205  sendSignal(userRef, GSN_FSSYNCCONF, signal, 1, JBB);
206 
207  return;
208 }
209 
210 void
211 VoidFs::execFSAPPENDREQ(Signal * signal)
212 {
213  const FsAppendReq * const fsReq = (FsAppendReq *)&signal->theData[0];
214  const UintR userPointer = fsReq->userPointer;
215  const BlockReference userRef = fsReq->userReference;
216  const Uint32 size = fsReq->size;
217 
218  signal->theData[0] = userPointer;
219  signal->theData[1] = size << 2;
220  sendSignal(userRef, GSN_FSAPPENDCONF, signal, 2, JBB);
221 }
222 
223 /*
224  * PR0: File Pointer DR0: User reference DR1: User Pointer
225  */
226 void
227 VoidFs::execFSSUSPENDORD(Signal * signal)
228 {
229  jamEntry();
230 }
231 
232 void
233 VoidFs::execDUMP_STATE_ORD(Signal* signal)
234 {
235 }//VoidFs::execDUMP_STATE_ORD()
236 
237 
238 
239 BLOCK_FUNCTIONS(VoidFs)
240