Merge ts3-168.ts.cn.tlan:/home/ngb/mysql/mysql-5.1/mysql-5.1-new-ndb-bj

into  ts3-168.ts.cn.tlan:/home/ngb/mysql/mysql-5.1/mysql-5.1-new-ndb


sql/ha_ndbcluster.cc:
  Auto merged
sql/log.cc:
  Auto merged
sql/log.h:
  Auto merged
sql/sql_repl.cc:
  Auto merged
sql/table.cc:
  Auto merged
storage/ndb/include/mgmapi/mgmapi.h:
  Auto merged
storage/ndb/src/common/transporter/TCP_Transporter.cpp:
  Auto merged
BitKeeper/deleted/.del-OSE_Receiver.cpp:
  Auto merged
storage/ndb/src/common/transporter/TransporterRegistry.cpp:
  Auto merged
storage/ndb/src/common/util/File.cpp:
  Auto merged
storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp:
  Auto merged
storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp:
  Auto merged
storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp:
  Auto merged
storage/ndb/src/kernel/vm/SimulatedBlock.cpp:
  Auto merged
storage/ndb/src/mgmsrv/ConfigInfo.cpp:
  Auto merged
storage/ndb/tools/restore/consumer_restore.cpp:
  Auto merged
storage/ndb/tools/restore/restore_main.cpp:
  Auto merged
sql/share/errmsg.txt:
  Auto merged
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp:
  Auto merged
storage/ndb/src/mgmsrv/Services.cpp:
  Auto merged
This commit is contained in:
unknown 2006-12-01 11:35:05 +08:00
commit 02818a0020
29 changed files with 2452 additions and 68 deletions

View File

@ -167,9 +167,17 @@ File my_register_filename(File fd, const char *FileName, enum file_type
else else
my_errno=errno; my_errno=errno;
DBUG_PRINT("error",("Got error %d on open",my_errno)); DBUG_PRINT("error",("Got error %d on open",my_errno));
if (MyFlags & (MY_FFNF | MY_FAE | MY_WME)) if (MyFlags & (MY_FFNF | MY_FAE | MY_WME)) {
if (my_errno == EMFILE) {
DBUG_PRINT("error",("print err: %d",EE_OUT_OF_FILERESOURCES));
my_error(EE_OUT_OF_FILERESOURCES, MYF(ME_BELL+ME_WAITTANG),
FileName, my_errno);
} else {
DBUG_PRINT("error",("print err: %d",error_message_number));
my_error(error_message_number, MYF(ME_BELL+ME_WAITTANG), my_error(error_message_number, MYF(ME_BELL+ME_WAITTANG),
FileName, my_errno); FileName, my_errno);
}
}
return(fd); return(fd);
} }

View File

@ -4825,10 +4825,18 @@ int ha_ndbcluster::create(const char *name,
} }
if (info->store_on_disk) if (info->store_on_disk)
{
if (info->tablespace) if (info->tablespace)
tab.setTablespace(info->tablespace); tab.setTablespace(info->tablespace);
else else
tab.setTablespace("DEFAULT-TS"); tab.setTablespace("DEFAULT-TS");
}
else if (info->tablespace)
{
tab.setTablespace(info->tablespace);
info->store_on_disk = true; //if use tablespace, that also means store on disk
}
// No primary key, create shadow key as 64 bit, auto increment // No primary key, create shadow key as 64 bit, auto increment
if (form->s->primary_key == MAX_KEY) if (form->s->primary_key == MAX_KEY)
{ {
@ -6537,6 +6545,23 @@ int ndbcluster_find_files(handlerton *hton, THD *thd,
hash_free(&ok_tables); hash_free(&ok_tables);
hash_free(&ndb_tables); hash_free(&ndb_tables);
// Delete schema file from files
if (!strcmp(db, NDB_REP_DB))
{
uint count = 0;
while (count++ < files->elements)
{
file_name = (char *)files->pop();
if (!strcmp(file_name, NDB_SCHEMA_TABLE))
{
DBUG_PRINT("info", ("skip %s.%s table, it should be hidden to user",
NDB_REP_DB, NDB_SCHEMA_TABLE));
continue;
}
files->push_back(file_name);
}
}
} // extra bracket to avoid gcc 2.95.3 warning } // extra bracket to avoid gcc 2.95.3 warning
DBUG_RETURN(0); DBUG_RETURN(0);
} }

View File

@ -2973,6 +2973,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
ulonglong *decrease_log_space) ulonglong *decrease_log_space)
{ {
int error; int error;
int ret = 0;
bool exit_loop= 0; bool exit_loop= 0;
LOG_INFO log_info; LOG_INFO log_info;
DBUG_ENTER("purge_logs"); DBUG_ENTER("purge_logs");
@ -3017,6 +3018,14 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
*decrease_log_space-= file_size; *decrease_log_space-= file_size;
ha_binlog_index_purge_file(current_thd, log_info.log_file_name); ha_binlog_index_purge_file(current_thd, log_info.log_file_name);
if (current_thd->query_error) {
DBUG_PRINT("info",("query error: %d", current_thd->query_error));
if (my_errno == EMFILE) {
DBUG_PRINT("info",("my_errno: %d, set ret = LOG_INFO_EMFILE", my_errno));
ret = LOG_INFO_EMFILE;
break;
}
}
if (find_next_log(&log_info, 0) || exit_loop) if (find_next_log(&log_info, 0) || exit_loop)
break; break;
@ -3027,6 +3036,9 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
the log index file after restart - otherwise, this should be safe the log index file after restart - otherwise, this should be safe
*/ */
error= update_log_index(&log_info, need_update_threads); error= update_log_index(&log_info, need_update_threads);
if (error == 0) {
error = ret;
}
err: err:
if (need_mutex) if (need_mutex)

View File

@ -114,6 +114,8 @@ extern TC_LOG_DUMMY tc_log_dummy;
#define LOG_INFO_MEM -6 #define LOG_INFO_MEM -6
#define LOG_INFO_FATAL -7 #define LOG_INFO_FATAL -7
#define LOG_INFO_IN_USE -8 #define LOG_INFO_IN_USE -8
#define LOG_INFO_EMFILE -9
/* bitmap to SQL_LOG::close() */ /* bitmap to SQL_LOG::close() */
#define LOG_CLOSE_INDEX 1 #define LOG_CLOSE_INDEX 1

View File

@ -6012,4 +6012,5 @@ ER_WRONG_PARAMETERS_TO_NATIVE_FCT 42000
eng "Incorrect parameters in the call to native function '%-.64s'" eng "Incorrect parameters in the call to native function '%-.64s'"
ER_NATIVE_FCT_NAME_COLLISION ER_NATIVE_FCT_NAME_COLLISION
eng "This function '%-.64s' has the same name as a native function." eng "This function '%-.64s' has the same name as a native function."
ER_BINLOG_PURGE_EMFILE
eng "Too many files opened, please execute the command again"

View File

@ -239,6 +239,7 @@ bool purge_error_message(THD* thd, int res)
case LOG_INFO_MEM: errmsg= ER_OUT_OF_RESOURCES; break; case LOG_INFO_MEM: errmsg= ER_OUT_OF_RESOURCES; break;
case LOG_INFO_FATAL: errmsg= ER_BINLOG_PURGE_FATAL_ERR; break; case LOG_INFO_FATAL: errmsg= ER_BINLOG_PURGE_FATAL_ERR; break;
case LOG_INFO_IN_USE: errmsg= ER_LOG_IN_USE; break; case LOG_INFO_IN_USE: errmsg= ER_LOG_IN_USE; break;
case LOG_INFO_EMFILE: errmsg= ER_BINLOG_PURGE_EMFILE; break;
default: errmsg= ER_LOG_PURGE_UNKNOWN_ERR; break; default: errmsg= ER_LOG_PURGE_UNKNOWN_ERR; break;
} }

View File

@ -1562,21 +1562,32 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
outparam->file->auto_repair() && outparam->file->auto_repair() &&
!(ha_open_flags & HA_OPEN_FOR_REPAIR)); !(ha_open_flags & HA_OPEN_FOR_REPAIR));
if (ha_err == HA_ERR_NO_SUCH_TABLE) switch (ha_err)
{ {
case HA_ERR_NO_SUCH_TABLE:
/* /*
The table did not exists in storage engine, use same error message The table did not exists in storage engine, use same error message
as if the .frm file didn't exist as if the .frm file didn't exist
*/ */
error= 1; error= 1;
my_errno= ENOENT; my_errno= ENOENT;
} break;
else case EMFILE:
{ /*
Too many files opened, use same error message as if the .frm
file can't open
*/
DBUG_PRINT("error", ("open file: %s failed, too many files opened (errno: %d)",
share->normalized_path.str, ha_err));
error= 1;
my_errno= EMFILE;
break;
default:
outparam->file->print_error(ha_err, MYF(0)); outparam->file->print_error(ha_err, MYF(0));
error_reported= TRUE; error_reported= TRUE;
if (ha_err == HA_ERR_TABLE_DEF_CHANGED) if (ha_err == HA_ERR_TABLE_DEF_CHANGED)
error= 7; error= 7;
break;
} }
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
} }

View File

@ -1182,6 +1182,14 @@ extern "C" {
int ndb_mgm_check_connection(NdbMgmHandle handle); int ndb_mgm_check_connection(NdbMgmHandle handle);
int ndb_mgm_report_event(NdbMgmHandle handle, Uint32 *data, Uint32 length); int ndb_mgm_report_event(NdbMgmHandle handle, Uint32 *data, Uint32 length);
struct ndb_mgm_param_info
{
Uint32 m_id;
const char * m_name;
};
int ndb_mgm_get_db_parameter_info(Uint32 paramId, struct ndb_mgm_param_info * info,
size_t * size);
#endif #endif
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED #ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED

View File

@ -99,7 +99,7 @@ typedef ndberror_classification_enum ndberror_classification;
const char *ndberror_status_message(ndberror_status); const char *ndberror_status_message(ndberror_status);
const char *ndberror_classification_message(ndberror_classification); const char *ndberror_classification_message(ndberror_classification);
void ndberror_update(ndberror_struct *); void ndberror_update(ndberror_struct *);
int ndb_error_string(int err_no, char *str, unsigned int size); int ndb_error_string(int err_no, char *str, int size);
#endif /* doxygen skip internal*/ #endif /* doxygen skip internal*/

View File

@ -20,6 +20,9 @@
#include "TCP_Transporter.hpp" #include "TCP_Transporter.hpp"
#include <NdbOut.hpp> #include <NdbOut.hpp>
#include <NdbSleep.h> #include <NdbSleep.h>
#include <EventLogger.hpp>
extern EventLogger g_eventLogger;
// End of stuff to be moved // End of stuff to be moved
#ifdef NDB_WIN32 #ifdef NDB_WIN32
@ -153,14 +156,14 @@ TCP_Transporter::setSocketOptions(){
if (setsockopt(theSocket, SOL_SOCKET, SO_RCVBUF, if (setsockopt(theSocket, SOL_SOCKET, SO_RCVBUF,
(char*)&sockOptRcvBufSize, sizeof(sockOptRcvBufSize)) < 0) { (char*)&sockOptRcvBufSize, sizeof(sockOptRcvBufSize)) < 0) {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("The setsockopt SO_RCVBUF error code = %d", InetErrno); g_eventLogger.error("The setsockopt SO_RCVBUF error code = %d", InetErrno);
#endif #endif
}//if }//if
if (setsockopt(theSocket, SOL_SOCKET, SO_SNDBUF, if (setsockopt(theSocket, SOL_SOCKET, SO_SNDBUF,
(char*)&sockOptSndBufSize, sizeof(sockOptSndBufSize)) < 0) { (char*)&sockOptSndBufSize, sizeof(sockOptSndBufSize)) < 0) {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("The setsockopt SO_SNDBUF error code = %d", InetErrno); g_eventLogger.error("The setsockopt SO_SNDBUF error code = %d", InetErrno);
#endif #endif
}//if }//if
@ -171,7 +174,7 @@ TCP_Transporter::setSocketOptions(){
if (setsockopt(theSocket, IPPROTO_TCP, TCP_NODELAY, if (setsockopt(theSocket, IPPROTO_TCP, TCP_NODELAY,
(char*)&sockOptNodelay, sizeof(sockOptNodelay)) < 0) { (char*)&sockOptNodelay, sizeof(sockOptNodelay)) < 0) {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("The setsockopt TCP_NODELAY error code = %d", InetErrno); g_eventLogger.error("The setsockopt TCP_NODELAY error code = %d", InetErrno);
#endif #endif
}//if }//if
} }
@ -185,7 +188,7 @@ TCP_Transporter::setSocketNonBlocking(NDB_SOCKET_TYPE socket){
if(ioctlsocket(socket, FIONBIO, &ul)) if(ioctlsocket(socket, FIONBIO, &ul))
{ {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("Set non-blocking server error3: %d", InetErrno); g_eventLogger.error("Set non-blocking server error3: %d", InetErrno);
#endif #endif
}//if }//if
return true; return true;
@ -199,13 +202,13 @@ TCP_Transporter::setSocketNonBlocking(NDB_SOCKET_TYPE socket){
flags = fcntl(socket, F_GETFL, 0); flags = fcntl(socket, F_GETFL, 0);
if (flags < 0) { if (flags < 0) {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("Set non-blocking server error1: %s", strerror(InetErrno)); g_eventLogger.error("Set non-blocking server error1: %s", strerror(InetErrno));
#endif #endif
}//if }//if
flags |= NDB_NONBLOCK; flags |= NDB_NONBLOCK;
if (fcntl(socket, F_SETFL, flags) == -1) { if (fcntl(socket, F_SETFL, flags) == -1) {
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("Set non-blocking server error2: %s", strerror(InetErrno)); g_eventLogger.error("Set non-blocking server error2: %s", strerror(InetErrno));
#endif #endif
}//if }//if
return true; return true;
@ -326,7 +329,7 @@ TCP_Transporter::doSend() {
} else { } else {
// Send failed // Send failed
#if defined DEBUG_TRANSPORTER #if defined DEBUG_TRANSPORTER
ndbout_c("Send Failure(disconnect==%d) to node = %d nBytesSent = %d " g_eventLogger.error("Send Failure(disconnect==%d) to node = %d nBytesSent = %d "
"errno = %d strerror = %s", "errno = %d strerror = %s",
DISCONNECT_ERRNO(InetErrno, nBytesSent), DISCONNECT_ERRNO(InetErrno, nBytesSent),
remoteNodeId, nBytesSent, InetErrno, remoteNodeId, nBytesSent, InetErrno,
@ -361,11 +364,11 @@ TCP_Transporter::doReceive() {
if(receiveBuffer.sizeOfData > receiveBuffer.sizeOfBuffer){ if(receiveBuffer.sizeOfData > receiveBuffer.sizeOfBuffer){
#ifdef DEBUG_TRANSPORTER #ifdef DEBUG_TRANSPORTER
ndbout_c("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", g_eventLogger.error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)",
receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer);
ndbout_c("nBytesRead = %d", nBytesRead); g_eventLogger.error("nBytesRead = %d", nBytesRead);
#endif #endif
ndbout_c("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)", g_eventLogger.error("receiveBuffer.sizeOfData(%d) > receiveBuffer.sizeOfBuffer(%d)",
receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer); receiveBuffer.sizeOfData, receiveBuffer.sizeOfBuffer);
report_error(TE_INVALID_MESSAGE_LENGTH); report_error(TE_INVALID_MESSAGE_LENGTH);
return 0; return 0;
@ -382,7 +385,7 @@ TCP_Transporter::doReceive() {
return nBytesRead; return nBytesRead;
} else { } else {
#if defined DEBUG_TRANSPORTER #if defined DEBUG_TRANSPORTER
ndbout_c("Receive Failure(disconnect==%d) to node = %d nBytesSent = %d " g_eventLogger.error("Receive Failure(disconnect==%d) to node = %d nBytesSent = %d "
"errno = %d strerror = %s", "errno = %d strerror = %s",
DISCONNECT_ERRNO(InetErrno, nBytesRead), DISCONNECT_ERRNO(InetErrno, nBytesRead),
remoteNodeId, nBytesRead, InetErrno, remoteNodeId, nBytesRead, InetErrno,

View File

@ -778,7 +778,7 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis)
tcpReadSelectReply = select(maxSocketValue, &tcpReadset, 0, 0, &timeout); tcpReadSelectReply = select(maxSocketValue, &tcpReadset, 0, 0, &timeout);
if(false && tcpReadSelectReply == -1 && errno == EINTR) if(false && tcpReadSelectReply == -1 && errno == EINTR)
ndbout_c("woke-up by signal"); g_eventLogger.info("woke-up by signal");
#ifdef NDB_WIN32 #ifdef NDB_WIN32
if(tcpReadSelectReply == SOCKET_ERROR) if(tcpReadSelectReply == SOCKET_ERROR)
@ -1112,12 +1112,12 @@ TransporterRegistry::start_clients_thread()
} }
else if(ndb_mgm_is_connected(m_mgm_handle)) else if(ndb_mgm_is_connected(m_mgm_handle))
{ {
ndbout_c("Failed to get dynamic port to connect to: %d", res); g_eventLogger.info("Failed to get dynamic port to connect to: %d", res);
ndb_mgm_disconnect(m_mgm_handle); ndb_mgm_disconnect(m_mgm_handle);
} }
else else
{ {
ndbout_c("Management server closed connection early. " g_eventLogger.info("Management server closed connection early. "
"It is probably being shut down (or has problems). " "It is probably being shut down (or has problems). "
"We will retry the connection."); "We will retry the connection.");
} }
@ -1215,7 +1215,7 @@ TransporterRegistry::start_service(SocketServer& socket_server)
DBUG_ENTER("TransporterRegistry::start_service"); DBUG_ENTER("TransporterRegistry::start_service");
if (m_transporter_interface.size() > 0 && !nodeIdSpecified) if (m_transporter_interface.size() > 0 && !nodeIdSpecified)
{ {
ndbout_c("TransporterRegistry::startReceiving: localNodeId not specified"); g_eventLogger.error("TransporterRegistry::startReceiving: localNodeId not specified");
DBUG_RETURN(false); DBUG_RETURN(false);
} }
@ -1241,7 +1241,7 @@ TransporterRegistry::start_service(SocketServer& socket_server)
* If it wasn't a dynamically allocated port, or * If it wasn't a dynamically allocated port, or
* our attempts at getting a new dynamic port failed * our attempts at getting a new dynamic port failed
*/ */
ndbout_c("Unable to setup transporter service port: %s:%d!\n" g_eventLogger.error("Unable to setup transporter service port: %s:%d!\n"
"Please check if the port is already used,\n" "Please check if the port is already used,\n"
"(perhaps the node is already running)", "(perhaps the node is already running)",
t.m_interface ? t.m_interface : "*", t.m_s_service_port); t.m_interface ? t.m_interface : "*", t.m_s_service_port);
@ -1338,13 +1338,13 @@ bool TransporterRegistry::connect_client(NdbMgmHandle *h)
if(!mgm_nodeid) if(!mgm_nodeid)
{ {
ndbout_c("%s: %d", __FILE__, __LINE__); g_eventLogger.error("%s: %d", __FILE__, __LINE__);
return false; return false;
} }
Transporter * t = theTransporters[mgm_nodeid]; Transporter * t = theTransporters[mgm_nodeid];
if (!t) if (!t)
{ {
ndbout_c("%s: %d", __FILE__, __LINE__); g_eventLogger.error("%s: %d", __FILE__, __LINE__);
return false; return false;
} }
DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h))); DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h)));
@ -1360,7 +1360,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
if ( h==NULL || *h == NULL ) if ( h==NULL || *h == NULL )
{ {
ndbout_c("%s: %d", __FILE__, __LINE__); g_eventLogger.error("%s: %d", __FILE__, __LINE__);
return NDB_INVALID_SOCKET; return NDB_INVALID_SOCKET;
} }
@ -1373,10 +1373,10 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
m_transporter_interface[i].m_s_service_port, m_transporter_interface[i].m_s_service_port,
&mgm_reply) < 0) &mgm_reply) < 0)
{ {
ndbout_c("Error: %s: %d", g_eventLogger.error("Error: %s: %d",
ndb_mgm_get_latest_error_desc(*h), ndb_mgm_get_latest_error_desc(*h),
ndb_mgm_get_latest_error(*h)); ndb_mgm_get_latest_error(*h));
ndbout_c("%s: %d", __FILE__, __LINE__); g_eventLogger.error("%s: %d", __FILE__, __LINE__);
ndb_mgm_destroy_handle(h); ndb_mgm_destroy_handle(h);
return NDB_INVALID_SOCKET; return NDB_INVALID_SOCKET;
} }
@ -1388,10 +1388,10 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h); NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h);
if ( sockfd == NDB_INVALID_SOCKET) if ( sockfd == NDB_INVALID_SOCKET)
{ {
ndbout_c("Error: %s: %d", g_eventLogger.error("Error: %s: %d",
ndb_mgm_get_latest_error_desc(*h), ndb_mgm_get_latest_error_desc(*h),
ndb_mgm_get_latest_error(*h)); ndb_mgm_get_latest_error(*h));
ndbout_c("%s: %d", __FILE__, __LINE__); g_eventLogger.error("%s: %d", __FILE__, __LINE__);
ndb_mgm_destroy_handle(h); ndb_mgm_destroy_handle(h);
} }
return sockfd; return sockfd;

View File

@ -122,12 +122,24 @@ bool
File_class::close() File_class::close()
{ {
bool rc = true; bool rc = true;
int retval = 0;
if (m_file != NULL) if (m_file != NULL)
{ {
::fflush(m_file); ::fflush(m_file);
rc = (::fclose(m_file) == 0 ? true : false); retval = ::fclose(m_file);
m_file = NULL; // Try again? while ( (retval != 0) && (errno == EINTR) ){
retval = ::fclose(m_file);
} }
if( retval == 0){
rc = true;
}
else {
rc = false;
ndbout_c("ERROR: Close file error in File.cpp for %s",strerror(errno));
}
}
m_file = NULL;
return rc; return rc;
} }

View File

@ -62,7 +62,8 @@ Cmvmi::Cmvmi(Block_context& ctx) :
&long_sig_buffer_size); &long_sig_buffer_size);
long_sig_buffer_size= long_sig_buffer_size / 256; long_sig_buffer_size= long_sig_buffer_size / 256;
g_sectionSegmentPool.setSize(long_sig_buffer_size); g_sectionSegmentPool.setSize(long_sig_buffer_size,
false,true,true,CFG_DB_LONG_SIGNAL_BUFFER);
// Add received signals // Add received signals
addRecSignal(GSN_CONNECT_REP, &Cmvmi::execCONNECT_REP); addRecSignal(GSN_CONNECT_REP, &Cmvmi::execCONNECT_REP);

View File

@ -52,7 +52,8 @@ void Dbacc::initRecords()
page8 = (Page8*)allocRecord("Page8", page8 = (Page8*)allocRecord("Page8",
sizeof(Page8), sizeof(Page8),
cpagesize, cpagesize,
false); false,
CFG_DB_INDEX_MEM);
operationrec = (Operationrec*)allocRecord("Operationrec", operationrec = (Operationrec*)allocRecord("Operationrec",
sizeof(Operationrec), sizeof(Operationrec),

View File

@ -311,7 +311,7 @@ void Dbtup::execREAD_CONFIG_REQ(Signal* signal)
c_storedProcPool.setSize(noOfStoredProc); c_storedProcPool.setSize(noOfStoredProc);
c_buildIndexPool.setSize(c_noOfBuildIndexRec); c_buildIndexPool.setSize(c_noOfBuildIndexRec);
c_triggerPool.setSize(noOfTriggers); c_triggerPool.setSize(noOfTriggers, false, true, true, CFG_DB_NO_TRIGGERS);
c_extent_hash.setSize(1024); // 4k c_extent_hash.setSize(1024); // 4k
@ -343,6 +343,7 @@ void Dbtup::initRecords()
{ {
unsigned i; unsigned i;
Uint32 tmp; Uint32 tmp;
Uint32 tmp1 = 0;
const ndb_mgm_configuration_iterator * p = const ndb_mgm_configuration_iterator * p =
m_ctx.m_config.getOwnConfigIterator(); m_ctx.m_config.getOwnConfigIterator();
ndbrequire(p != 0); ndbrequire(p != 0);
@ -350,7 +351,7 @@ void Dbtup::initRecords()
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE, &tmp)); ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE, &tmp));
// Records with dynamic sizes // Records with dynamic sizes
Page* ptr =(Page*)allocRecord("Page", sizeof(Page), tmp, false); Page* ptr =(Page*)allocRecord("Page", sizeof(Page), tmp, false, CFG_DB_DATA_MEM);
c_page_pool.set(ptr, tmp); c_page_pool.set(ptr, tmp);
attrbufrec = (Attrbufrec*)allocRecord("Attrbufrec", attrbufrec = (Attrbufrec*)allocRecord("Attrbufrec",
@ -374,7 +375,9 @@ void Dbtup::initRecords()
cnoOfTabDescrRec); cnoOfTabDescrRec);
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_OP_RECS, &tmp)); ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_OP_RECS, &tmp));
c_operation_pool.setSize(tmp); ndb_mgm_get_int_parameter(p, CFG_DB_NO_LOCAL_OPS, &tmp1);
c_operation_pool.setSize(tmp, false, true, true,
tmp1 == 0 ? CFG_DB_NO_OPS : CFG_DB_NO_LOCAL_OPS);
pageRange = (PageRange*)allocRecord("PageRange", pageRange = (PageRange*)allocRecord("PageRange",
sizeof(PageRange), sizeof(PageRange),

View File

@ -25,6 +25,7 @@
#include <ErrorReporter.hpp> #include <ErrorReporter.hpp>
#include <NdbMem.h> #include <NdbMem.h>
#include <Bitmask.hpp> #include <Bitmask.hpp>
#include <mgmapi.h>
template <class T> class Array; template <class T> class Array;
@ -43,7 +44,8 @@ public:
* *
* Note, can currently only be called once * Note, can currently only be called once
*/ */
bool setSize(Uint32 noOfElements, bool align = false, bool exit_on_error = true, bool guard = true); bool setSize(Uint32 noOfElements, bool align = false, bool exit_on_error = true,
bool guard = true, Uint32 paramId = 0);
bool set(T*, Uint32 cnt, bool align = false); bool set(T*, Uint32 cnt, bool align = false);
void clear() { theArray = 0; } void clear() { theArray = 0; }
@ -221,13 +223,19 @@ template <class T>
inline inline
bool bool
ArrayPool<T>::setSize(Uint32 noOfElements, ArrayPool<T>::setSize(Uint32 noOfElements,
bool align, bool exit_on_error, bool guard){ bool align, bool exit_on_error, bool guard, Uint32 paramId){
if(size == 0){ if(size == 0){
if(noOfElements == 0) if(noOfElements == 0)
return true; return true;
Uint64 real_size = (Uint64)noOfElements * sizeof(T);
size_t req_size = (size_t)real_size;
Uint64 real_size_align = real_size + sizeof(T);
size_t req_size_align = (size_t)real_size_align;
if(align) if(align)
{ {
alloc_ptr = ndbd_malloc((noOfElements+1) * sizeof(T)); if((Uint64)req_size_align == real_size_align && req_size_align > 0)
alloc_ptr = ndbd_malloc(req_size_align);
UintPtr p = (UintPtr)alloc_ptr; UintPtr p = (UintPtr)alloc_ptr;
UintPtr mod = p % sizeof(T); UintPtr mod = p % sizeof(T);
if (mod) if (mod)
@ -236,14 +244,23 @@ ArrayPool<T>::setSize(Uint32 noOfElements,
} }
theArray = (T *)p; theArray = (T *)p;
} }
else else if((Uint64)req_size == real_size && req_size > 0)
theArray = (T *)(alloc_ptr = ndbd_malloc(noOfElements * sizeof(T))); theArray = (T *)(alloc_ptr = ndbd_malloc(req_size));
if(theArray == 0) if(theArray == 0)
{ {
char errmsg[255] = "ArrayPool<T>::setSize malloc failed";
struct ndb_mgm_param_info param_info;
size_t size = sizeof(ndb_mgm_param_info);
if (!exit_on_error) if (!exit_on_error)
return false; return false;
ErrorReporter::handleAssert("ArrayPool<T>::setSize malloc failed",
if(0 != paramId && 0 == ndb_mgm_get_db_parameter_info(paramId, &param_info, &size)) {
BaseString::snprintf(errmsg, sizeof(errmsg),
"Malloc memory for %s failed", param_info.m_name);
}
ErrorReporter::handleAssert(errmsg,
__FILE__, __LINE__, NDBD_EXIT_MEMALLOC); __FILE__, __LINE__, NDBD_EXIT_MEMALLOC);
return false; // not reached return false; // not reached
} }

View File

@ -657,29 +657,39 @@ SimulatedBlock::getBatSize(Uint16 blockNo){
} }
void* void*
SimulatedBlock::allocRecord(const char * type, size_t s, size_t n, bool clear) SimulatedBlock::allocRecord(const char * type, size_t s, size_t n, bool clear, Uint32 paramId)
{ {
void * p = NULL; void * p = NULL;
size_t size = n*s; size_t size = n*s;
Uint64 real_size = (Uint64)((Uint64)n)*((Uint64)s);
refresh_watch_dog(); refresh_watch_dog();
if (size > 0){ if (real_size > 0){
#ifdef VM_TRACE_MEM #ifdef VM_TRACE_MEM
ndbout_c("%s::allocRecord(%s, %u, %u) = %u bytes", ndbout_c("%s::allocRecord(%s, %u, %u) = %llu bytes",
getBlockName(number()), getBlockName(number()),
type, type,
s, s,
n, n,
size); real_size);
#endif #endif
if( real_size == (Uint64)size )
p = ndbd_malloc(size); p = ndbd_malloc(size);
if (p == NULL){ if (p == NULL){
char buf1[255]; char buf1[255];
char buf2[255]; char buf2[255];
struct ndb_mgm_param_info param_info;
size_t size = sizeof(ndb_mgm_param_info);
if(0 != paramId && 0 == ndb_mgm_get_db_parameter_info(paramId, &param_info, &size)) {
BaseString::snprintf(buf1, sizeof(buf1), "%s could not allocate memory for parameter %s",
getBlockName(number()), param_info.m_name);
} else {
BaseString::snprintf(buf1, sizeof(buf1), "%s could not allocate memory for %s", BaseString::snprintf(buf1, sizeof(buf1), "%s could not allocate memory for %s",
getBlockName(number()), type); getBlockName(number()), type);
BaseString::snprintf(buf2, sizeof(buf2), "Requested: %ux%u = %u bytes", }
(Uint32)s, (Uint32)n, (Uint32)size); BaseString::snprintf(buf2, sizeof(buf2), "Requested: %ux%u = %llu bytes",
(Uint32)s, (Uint32)n, (Uint64)real_size);
ERROR_SET(fatal, NDBD_EXIT_MEMALLOC, buf1, buf2); ERROR_SET(fatal, NDBD_EXIT_MEMALLOC, buf1, buf2);
} }

View File

@ -377,7 +377,7 @@ protected:
* Allocates memory for the datastructures where ndb keeps the data * Allocates memory for the datastructures where ndb keeps the data
* *
*/ */
void* allocRecord(const char * type, size_t s, size_t n, bool clear = true); void* allocRecord(const char * type, size_t s, size_t n, bool clear = true, Uint32 paramId = 0);
/** /**
* Deallocate record * Deallocate record

View File

@ -1,7 +1,7 @@
noinst_LTLIBRARIES = libmgmapi.la noinst_LTLIBRARIES = libmgmapi.la
libmgmapi_la_SOURCES = mgmapi.cpp ndb_logevent.cpp mgmapi_configuration.cpp LocalConfig.cpp ../kernel/error/ndbd_exit_codes.c libmgmapi_la_SOURCES = mgmapi.cpp ndb_logevent.cpp mgmapi_configuration.cpp LocalConfig.cpp ../kernel/error/ndbd_exit_codes.c ../mgmsrv/ParamInfo.cpp
INCLUDES_LOC = -I$(top_srcdir)/storage/ndb/include/mgmapi INCLUDES_LOC = -I$(top_srcdir)/storage/ndb/include/mgmapi

View File

@ -1,6 +1,10 @@
#include <ndb_types.h> #include <ndb_types.h>
#include <mgmapi.h> #include <mgmapi.h>
#include "mgmapi_configuration.hpp" #include "mgmapi_configuration.hpp"
#include "../mgmsrv/ParamInfo.hpp"
extern const ParamInfo ParamInfoArray[];
extern const int ParamInfoNum;
ndb_mgm_configuration_iterator::ndb_mgm_configuration_iterator ndb_mgm_configuration_iterator::ndb_mgm_configuration_iterator
(const ndb_mgm_configuration & conf, unsigned type_of_section) (const ndb_mgm_configuration & conf, unsigned type_of_section)
@ -155,3 +159,37 @@ ndb_mgm_find(ndb_mgm_configuration_iterator* iter,
int param, unsigned search){ int param, unsigned search){
return iter->find(param, search); return iter->find(param, search);
} }
/**
* Retrieve information about parameter
* @param info : in - pointer to structure allocated by caller
* @param size : in/out : pointer to int initialized to sizeof(ndb_mgm_param_info)...will be set to bytes set by function on return
*/
extern "C"
int
ndb_mgm_get_db_parameter_info(Uint32 paramId, struct ndb_mgm_param_info * info, size_t * size) {
if ( paramId == 0 ) {
return -1;
}
for (int i = 0; i < ParamInfoNum; i++) {
if (paramId == ParamInfoArray[i]._paramId && strcmp(DB_TOKEN, ParamInfoArray[i]._section) == 0) {
size_t tmp = 0;
if (tmp + sizeof(info->m_id) <= *size)
{
info->m_id = ParamInfoArray[i]._paramId;
tmp += sizeof(info->m_id);
}
if (tmp + sizeof(info->m_name) <= *size)
{
info->m_name = ParamInfoArray[i]._fname;
tmp += sizeof(info->m_name);
}
*size = tmp;
return 0;
}
}
return -1;
}

View File

@ -3151,6 +3151,30 @@ checkDbConstraints(InitConfigFileParser::Context & ctx, const char *){
ctx.m_userProperties.put("NoOfReplicas", replicas); ctx.m_userProperties.put("NoOfReplicas", replicas);
} }
/**
* In kernel, will calculate the MaxNoOfMeataTables use the following sum:
* Uint32 noOfMetaTables = noOfTables + noOfOrderedIndexes +
* noOfUniqueHashIndexes + 2
* 2 is the number of the SysTables.
* So must check that the sum does't exceed the max value of Uint32.
*/
Uint32 noOfTables = 0,
noOfOrderedIndexes = 0,
noOfUniqueHashIndexes = 0;
ctx.m_currentSection->get("MaxNoOfTables", &noOfTables);
ctx.m_currentSection->get("MaxNoOfOrderedIndexes", &noOfOrderedIndexes);
ctx.m_currentSection->get("MaxNoOfUniqueHashIndexes", &noOfUniqueHashIndexes);
Uint64 sum= (Uint64)noOfTables + noOfOrderedIndexes + noOfUniqueHashIndexes;
if (sum > ((Uint32)~0 - 2)) {
ctx.reportError("The sum of MaxNoOfTables, MaxNoOfOrderedIndexes and"
" MaxNoOfUniqueHashIndexes must not exceed %u - [%s]"
" starting at line: %d",
((Uint32)~0 - 2), ctx.fname, ctx.m_sectionLineno);
return false;
}
return true; return true;
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
#ifndef PARAMINFO_H
#define PARAMINFO_H
#define DB_TOKEN "DB"
#define MGM_TOKEN "MGM"
#define API_TOKEN "API"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* The Configuration parameter type and status
*/
enum ParameterType { CI_BOOL, CI_INT, CI_INT64, CI_STRING, CI_SECTION };
enum ParameterStatus { CI_USED, ///< Active
CI_DEPRICATED, ///< Can be, but shouldn't
CI_NOTIMPLEMENTED, ///< Is ignored.
CI_INTERNAL ///< Not configurable by the user
};
/**
* Entry for one configuration parameter
*/
typedef struct m_ParamInfo {
Uint32 _paramId;
const char* _fname;
const char* _section;
const char* _description;
ParameterStatus _status;
bool _updateable;
ParameterType _type;
const char* _default;
const char* _min;
const char* _max;
}ParamInfo;
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1352,7 +1352,7 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId)
if (EventLoggerBase::event_lookup(eventType,cat,threshold,severity,textF)) if (EventLoggerBase::event_lookup(eventType,cat,threshold,severity,textF))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
char m_text[256]; char m_text[512];
EventLogger::getText(m_text, sizeof(m_text), EventLogger::getText(m_text, sizeof(m_text),
textF, theData, nodeId); textF, theData, nodeId);
@ -1368,6 +1368,15 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId)
if (ndb_logevent_body[i].index_fn) if (ndb_logevent_body[i].index_fn)
val= (*(ndb_logevent_body[i].index_fn))(val); val= (*(ndb_logevent_body[i].index_fn))(val);
str.appfmt("%s=%d\n",ndb_logevent_body[i].token, val); str.appfmt("%s=%d\n",ndb_logevent_body[i].token, val);
if(strcmp(ndb_logevent_body[i].token,"error") == 0)
{
int m_text_len= strlen(m_text);
if(sizeof(m_text)-m_text_len-3 > 0)
{
BaseString::snprintf(m_text+m_text_len, 4 , " - ");
ndb_error_string(val, m_text+(m_text_len+3), sizeof(m_text)-m_text_len-3);
}
}
} }
Vector<NDB_SOCKET_TYPE> copy; Vector<NDB_SOCKET_TYPE> copy;

View File

@ -774,11 +774,14 @@ const char *ndberror_classification_message(ndberror_classification classificati
return empty_string; return empty_string;
} }
int ndb_error_string(int err_no, char *str, unsigned int size) int ndb_error_string(int err_no, char *str, int size)
{ {
ndberror_struct error; ndberror_struct error;
unsigned int len; int len;
assert(size > 1);
if(size <= 1)
return 0;
error.code = err_no; error.code = err_no;
ndberror_update(&error); ndberror_update(&error);

View File

@ -36,6 +36,7 @@ public:
virtual void logEntry(const LogEntry &){} virtual void logEntry(const LogEntry &){}
virtual void endOfLogEntrys(){} virtual void endOfLogEntrys(){}
virtual bool finalize_table(const TableS &){return true;} virtual bool finalize_table(const TableS &){return true;}
virtual bool createSystable(const TableS &){ return true;}
virtual bool update_apply_status(const RestoreMetaData &metaData){return true;} virtual bool update_apply_status(const RestoreMetaData &metaData){return true;}
NODE_GROUP_MAP *m_nodegroup_map; NODE_GROUP_MAP *m_nodegroup_map;
uint m_nodegroup_map_len; uint m_nodegroup_map_len;

View File

@ -666,6 +666,33 @@ err:
return result; return result;
} }
bool
BackupRestore::createSystable(const TableS & tables){
const char *tablename = tables.getTableName();
if( strcmp(tablename, NDB_REP_DB "/def/" NDB_APPLY_TABLE) != 0 &&
strcmp(tablename, NDB_REP_DB "/def/" NDB_SCHEMA_TABLE) != 0 )
{
return true;
}
BaseString tmp(tablename);
Vector<BaseString> split;
if(tmp.split(split, "/") != 3){
err << "Invalid table name format " << tablename << endl;
return false;
}
m_ndb->setDatabaseName(split[0].c_str());
m_ndb->setSchemaName(split[1].c_str());
NdbDictionary::Dictionary* dict = m_ndb->getDictionary();
if( dict->getTable(split[2].c_str()) != NULL ){
return true;
}
return table(tables);
}
bool bool
BackupRestore::table(const TableS & table){ BackupRestore::table(const TableS & table){
if (!m_restore && !m_restore_meta) if (!m_restore && !m_restore_meta)

View File

@ -73,6 +73,7 @@ public:
virtual void endOfLogEntrys(); virtual void endOfLogEntrys();
virtual bool finalize_table(const TableS &); virtual bool finalize_table(const TableS &);
virtual bool has_temp_error(); virtual bool has_temp_error();
virtual bool createSystable(const TableS & table);
virtual bool update_apply_status(const RestoreMetaData &metaData); virtual bool update_apply_status(const RestoreMetaData &metaData);
void connectToMysql(); void connectToMysql();
bool map_in_frm(char *new_data, const char *data, bool map_in_frm(char *new_data, const char *data,

View File

@ -567,6 +567,15 @@ main(int argc, char** argv)
err << metaData[i]->getTableName() << " ... Exiting " << endl; err << metaData[i]->getTableName() << " ... Exiting " << endl;
exitHandler(NDBT_FAILED); exitHandler(NDBT_FAILED);
} }
} else {
for(Uint32 j= 0; j < g_consumers.size(); j++)
if (!g_consumers[j]->createSystable(* metaData[i]))
{
err << "Restore: Failed to restore system table: ";
err << metaData[i]->getTableName() << " ... Exiting " << endl;
exitHandler(NDBT_FAILED);
}
} }
} }
debug << "Close tables" << endl; debug << "Close tables" << endl;