summaryrefslogtreecommitdiff
path: root/ndb/src/kernel/vm
diff options
context:
space:
mode:
authorunknown <joreland@mysql.com>2004-05-04 11:19:19 +0200
committerunknown <joreland@mysql.com>2004-05-04 11:19:19 +0200
commit5f02d41c0d3d3008286c4ad03ee21bdaa9c7a08b (patch)
treef59c19e8bd7bce4bd4668619571afd3f4a12d23e /ndb/src/kernel/vm
parent4841aa284b861ec94eabd3a5b6d542e9a5531732 (diff)
downloadmariadb-git-5f02d41c0d3d3008286c4ad03ee21bdaa9c7a08b.tar.gz
Merge NDB patches into 4.1-clone, below is list of changesets
# -------------------------------------------- # 04/04/13 joreland@mysql.com 1.1858.1.1 # Removal of NDBT_Table # -------------------------------------------- # 04/04/13 joreland@mysql.com 1.1858.1.2 # Removal of NDBT_Table # -------------------------------------------- # 04/04/13 joreland@mysql.com 1.1858.1.3 # Fix for crashing AT # -------------------------------------------- # 04/04/13 joreland@mysql.com 1.1858.1.4 # Bug fixes in testIndex # -------------------------------------------- # 04/04/13 joreland@mysql.com 1.1866.1.5 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mysql.com:/home/jonas/src/tmp # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.1.5 # Fix for takeover when accessing indexes. # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1866.1.6 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mysql.com:/home/jonas/src/tmp # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.2.1 # Fixed error handling of fire_trigger_ord + lqhkeyref w.r.t indexes # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.2.2 # Simple retry mechanism in UTIL # Helps testIndex -n BuildDuring _a lot_ # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.2.3 # Misc fixes to test prg. # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.2.4 # Allow more retires on application errors # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1858.2.5 # Pass no of rows fetched in SUB_SYNC_CONTINUE_REQ # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1869 # wl1714 # Improve parallellism # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1870 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mysql.com:/home/jonas/src/wl1714 # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1866.1.7 # Merge # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1871 # Merge mysql.com:/home/jonas/src/wl1714 # into mysql.com:/home/jonas/src/mysql-4.1-ndb # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1872 # Fix for testScan -n ScanReadError5030 # -------------------------------------------- # 04/04/14 joreland@mysql.com 1.1873 # fix testDict -n FragmentType* # -------------------------------------------- # 04/04/14 johan@stingray.(none) 1.1866.2.1 # small fixes # -------------------------------------------- # 04/04/14 johan@stingray.(none) 1.1874 # Merge jandersson@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into stingray.(none):/space/bk/rep/mysql-4.1-ndb # -------------------------------------------- # 04/04/14 johan@stingray.(none) 1.1875 # handle rep node as an api node # -------------------------------------------- # 04/04/14 pekka@mysql.com 1.1873.1.1 # Fix for NDBT_Table removal # -------------------------------------------- # 04/04/15 joreland@mysql.com 1.1873.1.2 # Uninitialized var. # -------------------------------------------- # 04/04/15 johan@stingray.(none) 1.1876 # Merge jandersson@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into stingray.(none):/space/bk/rep/mysql-4.1-ndb # -------------------------------------------- # 04/04/15 joreland@mysql.com 1.1873.1.3 # Write pid before changing user # (as runas user probably doesn't have permissions on pid-dir) # -------------------------------------------- # -------------------------------------------- # 04/04/15 ndb@mc03.ndb.mysql.com 1.1862.1.3 # Fix printout of varchars # -------------------------------------------- # 04/04/15 ndb@mc03.ndb.mysql.com 1.1877 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mc03.ndb.mysql.com:/space/ndb/tmp # -------------------------------------------- # 04/04/15 ndb@mc03.ndb.mysql.com 1.1862.1.4 # Hmm.. don't print attr as many times as length of array # -------------------------------------------- # 04/04/15 ndb@mc03.ndb.mysql.com 1.1878 # Merge mc03.ndb.mysql.com:/space/ndb/mysql-4.1-ndb # into mc03.ndb.mysql.com:/space/ndb/tmp # -------------------------------------------- # 04/04/15 joreland@mysql.com 1.1876.1.1 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mysql.com:/home/jonas/src/mysql-4.1-ndb # -------------------------------------------- # 04/04/15 joreland@mysql.com 1.1877.1.1 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mysql.com:/home/jonas/src/mysql-4.1-ndb # -------------------------------------------- # 04/04/15 ndb@mc03.ndb.mysql.com 1.1879 # Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb # into mc03.ndb.mysql.com:/space/ndb/tmp # -------------------------------------------- # 04/04/17 joreland@mysql.com 1.1880 # LCP bug when restarting ops take's longer than DIH sending a new lcp ord # Solution: # Send LCP_FRAG_REP after restarting all ops # -------------------------------------------- # 04/04/18 joreland@mysql.com 1.1881 # Missspelled ERROR_INSERT # -------------------------------------------- # 04/04/18 joreland@mysql.com 1.1882 # Added possibility to log only distributed signals # -------------------------------------------- # 04/04/22 joreland@mysql.com 1.1883 # Removed dependancy to libstdc++ # * pure virtual functions "__cxa_pure_virtual" is defined in libstd++ -> # remove all pure virtual functions # -------------------------------------------- # 04/04/23 joreland@mysql.com 1.1884 # Various minor bug fixes for problems found while compiling # with icc # -------------------------------------------- # -------------------------------------------- # 04/04/25 joreland@mysql.com 1.1885 # Removed debug code (joreland:1.1875) # -------------------------------------------- # 04/04/26 ejonore@mc03.ndb.mysql.com 1.1862.1.5 # Lock pages in memory _after_ daemon-mode (exec/fork) # -------------------------------------------- # 04/04/27 ejonore@mc03.ndb.mysql.com 1.1862.1.6 # 1) Trap abort() # 2) StopStart/StopAborted events # 3) warning if memlock fails # 4) use g_logger more often (instead of ndbout) # # -------------------------------------------- # 04/04/27 joreland@mysql.com 1.1886 # bug fix for a bug in wl1714 + software upgrade # -------------------------------------------- # 04/04/27 joreland@mysql.com 1.1887 # Cset exclude: joreland@mysql.com|ChangeSet|20040422160720|05374 # -------------------------------------------- # 04/04/27 joreland@mysql.com 1.1888 # removed libstc++ second try... # -------------------------------------------- # 04/04/28 ejonore@mc03.ndb.mysql.com 1.1862.1.7 # 1) Don't lock FUTURE pages but only current # 2) Do this when SIZEALT has completed # -------------------------------------------- # 04/04/30 joreland@mysql.com 1.1889 # Merge jonas@orca:/home/ndb/releases/mysql-4.1-ndb-3.4.x # into mysql.com:/home/jonas/src/mysql-4.1-ndb # -------------------------------------------- # 04/05/03 ndb@mc03.ndb.mysql.com 1.1862.1.8 # Version update # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1862.3.1 # Changed restart behavior. # Use "angel" process which monitor "real" process # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1862.1.9 # Merge jonas@orca:/home/ndb/releases/mysql-4.1-ndb-3.4.x # into mysql.com:/home/jonas/src/mysql-4.1-ndb-3.4.x # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1890 # Merge B2 fixes # -------------------------------------------- # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1862.1.10 # Better handling of children terminations # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1862.1.11 # Fixes for angel-restarting # -------------------------------------------- # 04/05/03 joreland@mysql.com 1.1891 # Merge mysql.com:/home/jonas/src/mysql-4.1-ndb-3.4.x # into mysql.com:/home/jonas/src/mysql-4.1-ndb # -------------------------------------------- # ndb/config/Defs.LINUX.x86.GCC.mk: Merge ndb fixes ndb/examples/ndbapi_async_example/Makefile: Merge ndb fixes ndb/examples/ndbapi_async_example/ndbapi_async.cpp: Merge ndb fixes ndb/examples/ndbapi_scan_example/Makefile: Merge ndb fixes ndb/include/debugger/SignalLoggerManager.hpp: Merge ndb fixes ndb/include/kernel/signaldata/ScanFrag.hpp: Merge ndb fixes ndb/include/ndb_version.h: Merge ndb fixes ndb/include/ndbapi/NdbScanOperation.hpp: Merge ndb fixes ndb/include/util/SocketServer.hpp: Merge ndb fixes ndb/src/common/debugger/SignalLoggerManager.cpp: Merge ndb fixes ndb/src/common/logger/ConsoleLogHandler.cpp: Merge ndb fixes ndb/src/common/portlib/unix/NdbMem.c: Merge ndb fixes ndb/src/common/util/Makefile: Merge ndb fixes ndb/src/common/util/version.c: Merge ndb fixes ndb/src/cw/cpcd/Process.cpp: Merge ndb fixes ndb/src/kernel/blocks/ERROR_codes.txt: Merge ndb fixes ndb/src/kernel/blocks/backup/restore/Restore.cpp: Merge ndb fixes ndb/src/kernel/blocks/backup/restore/Restore.hpp: Merge ndb fixes ndb/src/kernel/blocks/backup/restore/main.cpp: Merge ndb fixes ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp: Merge ndb fixes ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Merge ndb fixes ndb/src/kernel/blocks/dblqh/Dblqh.hpp: Merge ndb fixes ndb/src/kernel/blocks/dblqh/DblqhInit.cpp: Merge ndb fixes ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: Merge ndb fixes ndb/src/kernel/blocks/dbtc/Dbtc.hpp: Merge ndb fixes ndb/src/kernel/blocks/dbtc/DbtcInit.cpp: Merge ndb fixes ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Merge ndb fixes ndb/src/kernel/blocks/dbutil/DbUtil.cpp: Merge ndb fixes ndb/src/kernel/blocks/dbutil/DbUtil.hpp: Merge ndb fixes ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp: Merge ndb fixes ndb/src/kernel/blocks/ndbfs/Filename.cpp: Merge ndb fixes ndb/src/kernel/blocks/suma/Suma.cpp: Merge ndb fixes ndb/src/kernel/error/Error.hpp: Merge ndb fixes ndb/src/kernel/ndb-main/Main.cpp: Merge ndb fixes ndb/src/kernel/vm/Configuration.cpp: Merge ndb fixes ndb/src/kernel/vm/Configuration.hpp: Merge ndb fixes ndb/src/kernel/vm/DLFifoList.hpp: Merge ndb fixes ndb/src/kernel/vm/Emulator.cpp: Merge ndb fixes ndb/src/kernel/vm/SignalCounter.hpp: Merge ndb fixes ndb/src/kernel/vm/SimulatedBlock.cpp: Merge ndb fixes ndb/src/mgmsrv/MgmtSrvr.cpp: Merge ndb fixes ndb/src/mgmsrv/NodeLogLevel.cpp: Merge ndb fixes ndb/src/ndbapi/ClusterMgr.cpp: Merge ndb fixes ndb/src/ndbapi/Ndberror.cpp: Merge ndb fixes ndb/src/rep/rep_version.hpp: Merge ndb fixes ndb/test/ndbapi/testDict/testDict.cpp: Merge ndb fixes ndb/test/ndbapi/testIndex/testIndex.cpp: Merge ndb fixes ndb/test/ndbapi/testMgm/testMgm.cpp: Merge ndb fixes ndb/test/ndbapi/testScan/testScan.cpp: Merge ndb fixes ndb/test/src/HugoTransactions.cpp: Merge ndb fixes ndb/test/src/NDBT_Tables.cpp: Merge ndb fixes ndb/test/src/NDBT_Test.cpp: Merge ndb fixes ndb/test/src/UtilTransactions.cpp: Merge ndb fixes BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
Diffstat (limited to 'ndb/src/kernel/vm')
-rw-r--r--ndb/src/kernel/vm/Configuration.cpp12
-rw-r--r--ndb/src/kernel/vm/Configuration.hpp1
-rw-r--r--ndb/src/kernel/vm/DLFifoList.hpp22
-rw-r--r--ndb/src/kernel/vm/Emulator.cpp142
-rw-r--r--ndb/src/kernel/vm/SignalCounter.hpp2
-rw-r--r--ndb/src/kernel/vm/SimulatedBlock.cpp1
6 files changed, 53 insertions, 127 deletions
diff --git a/ndb/src/kernel/vm/Configuration.cpp b/ndb/src/kernel/vm/Configuration.cpp
index 0b680940105..03495449787 100644
--- a/ndb/src/kernel/vm/Configuration.cpp
+++ b/ndb/src/kernel/vm/Configuration.cpp
@@ -32,6 +32,9 @@ extern "C" {
void ndbSetOwnVersion();
}
+#include <EventLogger.hpp>
+extern EventLogger g_eventLogger;
+
bool
Configuration::init(int argc, const char** argv){
@@ -259,10 +262,6 @@ Configuration::setupConfiguration(){
delete p;
- if (_lockPagesInMainMemory) {
- NdbMem_MemLockAll();
- }
-
/**
* Create the watch dog thread
*/
@@ -336,3 +335,8 @@ Configuration::getConnectStringCopy() const {
return strdup(_connectString);
return 0;
}
+
+void
+Configuration::setInitialStart(bool val){
+ _initialStart = val;
+}
diff --git a/ndb/src/kernel/vm/Configuration.hpp b/ndb/src/kernel/vm/Configuration.hpp
index e7e3a125394..3f96bb454c5 100644
--- a/ndb/src/kernel/vm/Configuration.hpp
+++ b/ndb/src/kernel/vm/Configuration.hpp
@@ -62,6 +62,7 @@ public:
*
*/
bool getInitialStart() const;
+ void setInitialStart(bool val);
bool getDaemonMode() const;
private:
diff --git a/ndb/src/kernel/vm/DLFifoList.hpp b/ndb/src/kernel/vm/DLFifoList.hpp
index 0b40d00f56e..91b5b421b0c 100644
--- a/ndb/src/kernel/vm/DLFifoList.hpp
+++ b/ndb/src/kernel/vm/DLFifoList.hpp
@@ -60,6 +60,11 @@ public:
void add(Ptr<T> &);
/**
+ * Remove from list
+ */
+ void remove(Ptr<T> &);
+
+ /**
* Return an object to pool
*/
void release(Uint32 i);
@@ -241,14 +246,11 @@ DLFifoList<T>::release(Uint32 i){
p.p = thePool.getPtr(i);
release(p);
}
-
-/**
- * Return an object to pool
- */
+
template <class T>
inline
void
-DLFifoList<T>::release(Ptr<T> & p){
+DLFifoList<T>::remove(Ptr<T> & p){
T * t = p.p;
Uint32 ni = t->nextList;
Uint32 pi = t->prevList;
@@ -268,6 +270,16 @@ DLFifoList<T>::release(Ptr<T> & p){
// We are releasing first
head.firstItem = ni;
}
+}
+
+/**
+ * Return an object to pool
+ */
+template <class T>
+inline
+void
+DLFifoList<T>::release(Ptr<T> & p){
+ remove(p);
thePool.release(p.i);
}
diff --git a/ndb/src/kernel/vm/Emulator.cpp b/ndb/src/kernel/vm/Emulator.cpp
index 43b5619d202..a852e045c6e 100644
--- a/ndb/src/kernel/vm/Emulator.cpp
+++ b/ndb/src/kernel/vm/Emulator.cpp
@@ -34,11 +34,14 @@
#include <stdlib.h>
#include <new>
-#ifdef NDB_WIN32
-#include <new.h>
-#include <process.h>
-#define execvp _execvp
-#define set_new_handler _set_new_handler
+extern "C" {
+ extern void (* ndb_new_handler)();
+}
+
+
+#if defined (NDB_LINUX) || defined (NDB_SOLARIS)
+#include <sys/types.h>
+#include <sys/wait.h>
#endif
/**
@@ -73,7 +76,7 @@ EmulatorData::EmulatorData(){
}
void
-ndb_new_handler(){
+ndb_new_handler_impl(){
ERROR_SET(fatal, ERR_MEMALLOC, "New handler", "");
}
@@ -88,11 +91,7 @@ EmulatorData::create(){
theShutdownMutex = NdbMutex_Create();
-#ifdef NDB_WIN32
- set_new_handler((_PNH)ndb_new_handler);
-#else
- std::set_new_handler(ndb_new_handler);
-#endif
+ ndb_new_handler = ndb_new_handler_impl;
}
void
@@ -110,60 +109,6 @@ EmulatorData::destroy(){
}
void
-NdbRestart(char * programName,
- NdbRestartType type, char * connString){
-#if ! ( defined NDB_OSE || defined NDB_SOFTOSE)
- int argc = 2;
- switch(type){
- case NRT_NoStart_Restart:
- case NRT_DoStart_InitialStart:
- argc = 3;
- break;
- case NRT_NoStart_InitialStart:
- argc = 4;
- break;
- case NRT_DoStart_Restart:
- case NRT_Default:
- default:
- argc = 2;
- break;
- }
-
- if(connString != 0){
- argc += 2;
- }
-
- char ** argv = new char * [argc];
- argv[0] = programName;
- argv[argc - 1] = 0;
-
- switch(type){
- case NRT_NoStart_Restart:
- argv[1] = "-n";
- break;
- case NRT_DoStart_InitialStart:
- argv[1] = "-i";
- break;
- case NRT_NoStart_InitialStart:
- argv[1] = "-n";
- argv[2] = "-i";
- break;
- case NRT_DoStart_Restart:
- case NRT_Default:
- default:
- break;
- }
-
- if(connString != 0){
- argv[argc-3] = "-c";
- argv[argc-2] = connString;
- }
-
- execvp(programName, argv);
-#endif
-}
-
-void
NdbShutdown(NdbShutdownType type,
NdbRestartType restartType){
@@ -181,27 +126,12 @@ NdbShutdown(NdbShutdownType type,
globalData.theRestartFlag = perform_stop;
bool restart = false;
- char * progName = 0;
- char * connString = 0;
#if ! ( defined NDB_OSE || defined NDB_SOFTOSE)
if((type != NST_Normal &&
globalEmulatorData.theConfiguration->stopOnError() == false) ||
type == NST_Restart) {
restart = true;
- progName = strdup(globalEmulatorData.theConfiguration->programName());
- connString = globalEmulatorData.theConfiguration->getConnectStringCopy();
- if(type != NST_Restart){
- /**
- * If we crash before we started
- *
- * Do restart -n
- */
- if(globalData.theStartLevel == NodeState::SL_STARTED)
- restartType = NRT_Default;
- else
- restartType = NRT_NoStart_Restart;
- }
}
#endif
@@ -238,21 +168,18 @@ NdbShutdown(NdbShutdownType type,
#endif
if(type == NST_Watchdog){
- if(restart){
- NdbRestart(progName, restartType, connString);
- }
-
/**
- * Very serious
+ * Very serious, don't attempt to free, just die!!
*/
ndbout << "Watchdog shutdown completed - " << exitAbort << endl;
#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
+ signal(6, SIG_DFL);
abort();
#else
- exit(1);
+ exit(-1);
#endif
}
-
+
globalEmulatorData.theWatchDog->doStop();
#ifdef VM_TRACE
@@ -265,7 +192,7 @@ NdbShutdown(NdbShutdownType type,
globalTransporterRegistry.stopReceiving();
globalTransporterRegistry.removeAll();
-
+
#ifdef VM_TRACE
#define UNLOAD (type != NST_ErrorHandler && type != NST_Watchdog)
#else
@@ -274,61 +201,44 @@ NdbShutdown(NdbShutdownType type,
if(UNLOAD){
globalEmulatorData.theSimBlockList->unload();
globalEmulatorData.destroy();
-
}
-
- if(type != NST_Normal &&
- type != NST_Restart){
- if(restart){
- NdbRestart(progName, restartType, connString);
- }
-
+
+ if(type != NST_Normal && type != NST_Restart){
ndbout << "Error handler shutdown completed - " << exitAbort << endl;
#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
+ signal(6, SIG_DFL);
abort();
#else
- exit(1);
+ exit(-1);
#endif
}
/**
- * This is a normal restart
+ * This is a normal restart, depend on angel
*/
if(type == NST_Restart){
- if(restart){
- NdbRestart(progName, restartType, connString);
- }
- /**
- * What to do if in restart mode, but being unable to do it...
- */
-#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
- abort();
-#else
- exit(1);
-#endif
+ exit(restartType);
}
-
- /**
- * This is normal shutdown
- */
+
ndbout << "Shutdown completed - exiting" << endl;
} else {
/**
* Shutdown is already in progress
*/
-
+
/**
* If this is the watchdog, kill system the hard way
*/
if (type== NST_Watchdog){
ndbout << "Watchdog is killing system the hard way" << endl;
#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
+ signal(6, SIG_DFL);
abort();
#else
- exit(1);
+ exit(-1);
#endif
}
-
+
while(true)
NdbSleep_MilliSleep(10);
}
diff --git a/ndb/src/kernel/vm/SignalCounter.hpp b/ndb/src/kernel/vm/SignalCounter.hpp
index b05d0858867..d572551ea92 100644
--- a/ndb/src/kernel/vm/SignalCounter.hpp
+++ b/ndb/src/kernel/vm/SignalCounter.hpp
@@ -148,7 +148,7 @@ inline
const char *
SignalCounter::getText() const {
static char buf[255];
- static char nodes[m_nodes.TextLength+1];
+ static char nodes[NodeBitmask::TextLength+1];
snprintf(buf, sizeof(buf), "[SignalCounter: m_count=%d %s]", m_count, m_nodes.getText(nodes));
return buf;
}
diff --git a/ndb/src/kernel/vm/SimulatedBlock.cpp b/ndb/src/kernel/vm/SimulatedBlock.cpp
index b9bfcfebc7d..f36b3e43d42 100644
--- a/ndb/src/kernel/vm/SimulatedBlock.cpp
+++ b/ndb/src/kernel/vm/SimulatedBlock.cpp
@@ -948,7 +948,6 @@ SimulatedBlock::FragmentInfo::FragmentInfo(Uint32 fragId, Uint32 sender){
m_sectionPtrI[0] = RNIL;
m_sectionPtrI[1] = RNIL;
m_sectionPtrI[2] = RNIL;
- m_sectionPtrI[3] = RNIL;
}
SimulatedBlock::FragmentSendInfo::FragmentSendInfo()