Skip to content

Commit 9d2f523

Browse files
committed
Merge branch 'mysql-5.7-cluster-7.5' into mysql-5.7-cluster-7.6
Change-Id: I9d3fc231282124d9e09d20dbd28c9f2a3a984bab
2 parents 632d064 + 8eab5f5 commit 9d2f523

File tree

4 files changed

+162
-41
lines changed

4 files changed

+162
-41
lines changed

storage/ndb/include/kernel/signaldata/BackupSignalData.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2003, 2021, Oracle and/or its affiliates.
2+
Copyright (c) 2003, 2023, Oracle and/or its affiliates.
33
44
This program is free software; you can redistribute it and/or modify
55
it under the terms of the GNU General Public License, version 2.0,
@@ -50,6 +50,7 @@ class BackupReq {
5050
STATIC_CONST( SignalLength = 4 );
5151
STATIC_CONST( WAITCOMPLETED = 0x3 );
5252
STATIC_CONST( USE_UNDO_LOG = 0x4 );
53+
STATIC_CONST( NOWAIT_REPLY = 0x20 );
5354

5455
private:
5556
Uint32 senderData;

storage/ndb/include/ndb_version.h.in

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2004, 2021, Oracle and/or its affiliates.
2+
Copyright (c) 2004, 2023, Oracle and/or its affiliates.
33
44
This program is free software; you can redistribute it and/or modify
55
it under the terms of the GNU General Public License, version 2.0,
@@ -1242,4 +1242,56 @@ ndbd_support_waitgcp_shutdownsync(Uint32 x)
12421242
return 1;
12431243
}
12441244

1245+
/*
1246+
* Data nodes reply to MGMD START BACKUP NOWAIT REQ from
1247+
* MGMD with BACKUP_REF/CONF.
1248+
*/
1249+
#define NDBD_START_BACKUP_NOWAIT_REPLY_75 NDB_MAKE_VERSION(7,5,31)
1250+
#define NDBD_START_BACKUP_NOWAIT_REPLY_76 NDB_MAKE_VERSION(7,6,27)
1251+
#define NDBD_START_BACKUP_NOWAIT_REPLY_80 NDB_MAKE_VERSION(8,0,35)
1252+
#define NDBD_START_BACKUP_NOWAIT_REPLY_82 NDB_MAKE_VERSION(8,2,0)
1253+
static
1254+
inline
1255+
int
1256+
ndbd_start_backup_nowait_reply(Uint32 x)
1257+
{
1258+
const Uint32 major = (x >> 16) & 0xFF;
1259+
const Uint32 minor = (x >> 8) & 0xFF;
1260+
if (major < 7)
1261+
{
1262+
return 0;
1263+
}
1264+
else if (major == 7)
1265+
{
1266+
if (minor < 5)
1267+
{
1268+
return 0;
1269+
}
1270+
else if (minor == 5)
1271+
{
1272+
return x >= NDBD_START_BACKUP_NOWAIT_REPLY_75;
1273+
}
1274+
else if (minor == 6)
1275+
{
1276+
return x >= NDBD_START_BACKUP_NOWAIT_REPLY_76;
1277+
}
1278+
}
1279+
else if (major == 8)
1280+
{
1281+
if (minor == 0)
1282+
{
1283+
return x >= NDBD_START_BACKUP_NOWAIT_REPLY_80;
1284+
}
1285+
else if (minor == 1)
1286+
{
1287+
return 0;
1288+
}
1289+
else
1290+
{
1291+
return x >= NDBD_START_BACKUP_NOWAIT_REPLY_82;
1292+
}
1293+
}
1294+
return 1;
1295+
}
1296+
12451297
#endif

storage/ndb/src/kernel/blocks/backup/Backup.cpp

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2003, 2021, Oracle and/or its affiliates.
2+
Copyright (c) 2003, 2023, Oracle and/or its affiliates.
33

44
This program is free software; you can redistribute it and/or modify
55
it under the terms of the GNU General Public License, version 2.0,
@@ -4119,7 +4119,19 @@ Backup::execBACKUP_REQ(Signal* signal)
41194119
BackupRef::IAmNotMaster);
41204120
return;
41214121
}//if
4122-
4122+
else if(flags & BackupReq::NOWAIT_REPLY)
4123+
{
4124+
/*
4125+
* Inform MgmtSrvr that I am the master node, this way MgmtSrvr can stop
4126+
* waiting for feedback from Backup when NOWAIT option is specified in the
4127+
* start backup command
4128+
*/
4129+
BackupConf * conf = (BackupConf*)signal->getDataPtrSend();
4130+
conf->backupId = 0;
4131+
conf->senderData = req->senderData;
4132+
sendSignal(senderRef, GSN_BACKUP_CONF, signal,
4133+
BackupConf::SignalLength, JBB);
4134+
}
41234135
if (c_defaults.m_diskless)
41244136
{
41254137
jam();
@@ -4260,17 +4272,25 @@ Backup::sendBackupRef(BlockReference senderRef, Uint32 flags, Signal *signal,
42604272
Uint32 senderData, Uint32 errorCode)
42614273
{
42624274
jam();
4263-
if (SEND_BACKUP_STARTED_FLAG(flags))
4275+
if (SEND_BACKUP_STARTED_FLAG(flags) ||
4276+
(flags & BackupReq::NOWAIT_REPLY && errorCode == BackupRef::IAmNotMaster))
42644277
{
42654278
jam();
4266-
BackupRef* ref = (BackupRef*)signal->getDataPtrSend();
4279+
BackupRef *ref = (BackupRef *)signal->getDataPtrSend();
42674280
ref->senderData = senderData;
42684281
ref->errorCode = errorCode;
42694282
ref->masterRef = numberToRef(BACKUP, getMasterNodeId());
42704283
sendSignal(senderRef, GSN_BACKUP_REF, signal, BackupRef::SignalLength, JBB);
42714284
}
4272-
4273-
if (errorCode != BackupRef::IAmNotMaster)
4285+
/*
4286+
* Log event if the error is other than IAmNotMaster,
4287+
* or, if error is IAmNotMaster, the NOWAIT option is set and data node
4288+
* version is >= 7.5.31 or >= 7.6.27 or >= 8.0.34 or >= 8.2.0
4289+
* (see NDBD_START_BACKUP_NOWAIT_REPLY)
4290+
*/
4291+
if ((errorCode != BackupRef::IAmNotMaster) ||
4292+
(errorCode == BackupRef::IAmNotMaster &&
4293+
!SEND_BACKUP_STARTED_FLAG(flags) && !(flags & BackupReq::NOWAIT_REPLY)))
42744294
{
42754295
jam();
42764296
signal->theData[0] = NDB_LE_BackupFailedToStart;

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

Lines changed: 81 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2003, 2022, Oracle and/or its affiliates.
2+
Copyright (c) 2003, 2023, Oracle and/or its affiliates.
33
44
This program is free software; you can redistribute it and/or modify
55
it under the terms of the GNU General Public License, version 2.0,
@@ -1428,10 +1428,10 @@ MgmtSrvr::sendall_STOP_REQ(NodeBitmask &stoppedNodes,
14281428
int
14291429
MgmtSrvr::guess_master_node(SignalSender& ss)
14301430
{
1431+
NodeId guess = m_master_node;
14311432
/**
14321433
* First check if m_master_node is started
14331434
*/
1434-
NodeId guess = m_master_node;
14351435
if (guess != 0)
14361436
{
14371437
trp_node node = ss.getNodeInfo(guess);
@@ -1440,43 +1440,65 @@ MgmtSrvr::guess_master_node(SignalSender& ss)
14401440
}
14411441

14421442
/**
1443-
* Check for any started node
1443+
* Check started nodes based on dynamicId
14441444
*/
1445-
guess = 0;
1446-
while(getNextNodeId(&guess, NDB_MGM_NODE_TYPE_NDB))
1445+
Uint32 min = UINT32_MAX;
1446+
NodeId node_id = 0;
1447+
while(getNextNodeId(&node_id, NDB_MGM_NODE_TYPE_NDB))
14471448
{
1448-
trp_node node = ss.getNodeInfo(guess);
1449-
if (node.m_state.startLevel == NodeState::SL_STARTED)
1449+
trp_node node = ss.getNodeInfo(node_id);
1450+
if(node.m_state.dynamicId < min)
14501451
{
1451-
return guess;
1452+
if(node.m_state.startLevel == NodeState::SL_STARTED)
1453+
{
1454+
min = node.m_state.dynamicId;
1455+
guess = node_id;
1456+
}
14521457
}
14531458
}
1459+
//found
1460+
if(min < UINT32_MAX)
1461+
return guess;
14541462

14551463
/**
1456-
* Check any confirmed node
1464+
* Check confirmed nodes based on dynamicId
14571465
*/
1458-
guess = 0;
1459-
while(getNextNodeId(&guess, NDB_MGM_NODE_TYPE_NDB))
1466+
node_id = 0;
1467+
while(getNextNodeId(&node_id, NDB_MGM_NODE_TYPE_NDB))
14601468
{
1461-
trp_node node = ss.getNodeInfo(guess);
1462-
if (node.is_confirmed())
1469+
trp_node node = ss.getNodeInfo(node_id);
1470+
if(node.m_state.dynamicId < min)
14631471
{
1464-
return guess;
1472+
if(node.is_confirmed())
1473+
{
1474+
min = node.m_state.dynamicId;
1475+
guess = node_id;
1476+
}
14651477
}
14661478
}
1479+
//found
1480+
if(min < UINT32_MAX)
1481+
return guess;
14671482

14681483
/**
1469-
* Check any connected node
1484+
* Check connected nodes based on dynamicId
14701485
*/
1471-
guess = 0;
1472-
while(getNextNodeId(&guess, NDB_MGM_NODE_TYPE_NDB))
1486+
node_id = 0;
1487+
while(getNextNodeId(&node_id, NDB_MGM_NODE_TYPE_NDB))
14731488
{
1474-
trp_node node = ss.getNodeInfo(guess);
1475-
if (node.is_connected())
1489+
trp_node node = ss.getNodeInfo(node_id);
1490+
if(node.m_state.dynamicId < min)
14761491
{
1477-
return guess;
1492+
if(node.is_connected())
1493+
{
1494+
min = node.m_state.dynamicId;
1495+
guess = node_id;
1496+
}
14781497
}
14791498
}
1499+
//found
1500+
if(min < UINT32_MAX)
1501+
return guess;
14801502

14811503
return 0; // give up
14821504
}
@@ -3477,8 +3499,13 @@ MgmtSrvr::trp_deliver_signal(const NdbApiSignal* signal,
34773499

34783500
/* Clear local nodeid reservation(if any) */
34793501
release_local_nodeid_reservation(i);
3480-
34813502
clear_connect_address_cache(i);
3503+
3504+
/* Clear m_master_node when master disconnects */
3505+
if(i == m_master_node)
3506+
{
3507+
m_master_node = 0;
3508+
}
34823509
}
34833510
return;
34843511
}
@@ -4388,16 +4415,7 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted, Uint32 input_backupId
43884415
SignalSender ss(theFacade);
43894416
ss.lock(); // lock will be released on exit
43904417

4391-
NodeId nodeId = m_master_node;
4392-
if (okToSendTo(nodeId, false) != 0)
4393-
{
4394-
bool next;
4395-
nodeId = m_master_node = 0;
4396-
while((next = getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) == true &&
4397-
okToSendTo(nodeId, false) != 0);
4398-
if(!next)
4399-
return NO_CONTACT_WITH_DB_NODES;
4400-
}
4418+
NodeId nodeId = guess_master_node(ss);
44014419

44024420
SimpleSignal ssig;
44034421
BackupReq* req = CAST_PTR(BackupReq, ssig.getDataPtrSend());
@@ -4427,18 +4445,48 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted, Uint32 input_backupId
44274445
while (1) {
44284446
if (do_send)
44294447
{
4448+
nodeId = guess_master_node(ss);
4449+
4450+
if(waitCompleted == 0 &&
4451+
ndbd_start_backup_nowait_reply(getNodeInfo(nodeId).m_info.m_version))
4452+
{
4453+
req->flags |= BackupReq::NOWAIT_REPLY;
4454+
}
4455+
else
4456+
{
4457+
req->flags &= ~((Uint32)BackupReq::NOWAIT_REPLY);
4458+
}
4459+
44304460
if (ss.sendSignal(nodeId, &ssig) != SEND_OK) {
44314461
return SEND_OR_RECEIVE_FAILED;
44324462
}
4433-
if (waitCompleted == 0)
4434-
return 0;
4463+
if (waitCompleted == 0 &&
4464+
!ndbd_start_backup_nowait_reply(getNodeInfo(nodeId).m_info.m_version))
4465+
{
4466+
return 0;
4467+
}
44354468
do_send = 0;
44364469
}
44374470
SimpleSignal *signal = ss.waitFor();
44384471

44394472
int gsn = signal->readSignalNumber();
44404473
switch (gsn) {
44414474
case GSN_BACKUP_CONF:{
4475+
4476+
/*
4477+
* BACKUP NOWAIT case.
4478+
* BACKUP_CONF received from Backup. It is only used to confirm that
4479+
* the node is the master node and the backup can proceed.
4480+
* No more feedback expected from data node in this case.
4481+
*/
4482+
if(waitCompleted == 0)
4483+
{
4484+
return 0;
4485+
}
4486+
4487+
/*
4488+
* BACKUP WAIT case.
4489+
*/
44424490
const BackupConf * const conf =
44434491
CAST_CONSTPTR(BackupConf, signal->getDataPtr());
44444492
#ifdef VM_TRACE

0 commit comments

Comments
 (0)