Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
536fe1fa
Commit
536fe1fa
authored
Oct 11, 2006
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge perch.ndb.mysql.com:/home/jonas/src/41-work
into perch.ndb.mysql.com:/home/jonas/src/mysql-4.1-ndb
parents
3e260302
311abf10
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
71 deletions
+93
-71
ndb/src/kernel/blocks/dbdih/Dbdih.hpp
ndb/src/kernel/blocks/dbdih/Dbdih.hpp
+2
-0
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
+91
-71
No files found.
ndb/src/kernel/blocks/dbdih/Dbdih.hpp
View file @
536fe1fa
...
...
@@ -1044,6 +1044,8 @@ private:
void
removeStoredReplica
(
FragmentstorePtr
regFragptr
,
ReplicaRecordPtr
replicaPtr
);
void
searchStoredReplicas
(
FragmentstorePtr
regFragptr
);
bool
setup_create_replica
(
FragmentstorePtr
,
CreateReplicaRecord
*
,
ConstPtr
<
ReplicaRecord
>
);
void
updateNodeInfo
(
FragmentstorePtr
regFragptr
);
//------------------------------------
...
...
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
View file @
536fe1fa
...
...
@@ -8344,14 +8344,30 @@ Dbdih::resetReplicaSr(TabRecordPtr tabPtr){
resetReplicaLcp
(
replicaPtr
.
p
,
newestRestorableGCI
);
/* -----------------------------------------------------------------
* LINK THE REPLICA INTO THE STORED REPLICA LIST. WE WILL USE THIS
* NODE AS A STORED REPLICA.
* WE MUST FIRST LINK IT OUT OF THE LIST OF OLD STORED REPLICAS.
* --------------------------------------------------------------- */
removeOldStoredReplica
(
fragPtr
,
replicaPtr
);
linkStoredReplica
(
fragPtr
,
replicaPtr
);
/**
* Make sure we can also find REDO for restoring replica...
*/
{
CreateReplicaRecord
createReplica
;
ConstPtr
<
ReplicaRecord
>
constReplicaPtr
;
constReplicaPtr
.
i
=
replicaPtr
.
i
;
constReplicaPtr
.
p
=
replicaPtr
.
p
;
if
(
setup_create_replica
(
fragPtr
,
&
createReplica
,
constReplicaPtr
))
{
removeOldStoredReplica
(
fragPtr
,
replicaPtr
);
linkStoredReplica
(
fragPtr
,
replicaPtr
);
}
else
{
infoEvent
(
"Forcing take-over of node %d due to unsufficient REDO"
" for table %d fragment: %d"
,
nodePtr
.
i
,
tabPtr
.
i
,
i
);
setNodeActiveStatus
(
nodePtr
.
i
,
Sysfile
::
NS_NotActive_NotTakenOver
);
}
}
}
default:
jam
();
...
...
@@ -9399,6 +9415,7 @@ void Dbdih::calculateKeepGciLab(Signal* signal, Uint32 tableId, Uint32 fragId)
FragmentstorePtr
fragPtr
;
getFragstore
(
tabPtr
.
p
,
fragId
,
fragPtr
);
checkKeepGci
(
tabPtr
,
fragId
,
fragPtr
.
p
,
fragPtr
.
p
->
storedReplicas
);
checkKeepGci
(
tabPtr
,
fragId
,
fragPtr
.
p
,
fragPtr
.
p
->
oldStoredReplicas
);
fragId
++
;
if
(
fragId
>=
tabPtr
.
p
->
totalfragments
)
{
jam
();
...
...
@@ -12281,16 +12298,75 @@ void Dbdih::removeTooNewCrashedReplicas(ReplicaRecordPtr rtnReplicaPtr)
/* CHECKPOINT WITHOUT NEEDING ANY EXTRA LOGGING FACILITIES.*/
/* A MAXIMUM OF FOUR NODES IS RETRIEVED. */
/*************************************************************************/
bool
Dbdih
::
setup_create_replica
(
FragmentstorePtr
fragPtr
,
CreateReplicaRecord
*
createReplicaPtrP
,
ConstPtr
<
ReplicaRecord
>
replicaPtr
)
{
createReplicaPtrP
->
dataNodeId
=
replicaPtr
.
p
->
procNode
;
createReplicaPtrP
->
replicaRec
=
replicaPtr
.
i
;
/* ----------------------------------------------------------------- */
/* WE NEED TO SEARCH FOR A PROPER LOCAL CHECKPOINT TO USE FOR THE */
/* SYSTEM RESTART. */
/* ----------------------------------------------------------------- */
Uint32
startGci
;
Uint32
startLcpNo
;
Uint32
stopGci
=
SYSFILE
->
newestRestorableGCI
;
bool
result
=
findStartGci
(
replicaPtr
,
stopGci
,
startGci
,
startLcpNo
);
if
(
!
result
)
{
jam
();
/* --------------------------------------------------------------- */
/* WE COULD NOT FIND ANY LOCAL CHECKPOINT. THE FRAGMENT THUS DO NOT*/
/* CONTAIN ANY VALID LOCAL CHECKPOINT. IT DOES HOWEVER CONTAIN A */
/* VALID FRAGMENT LOG. THUS BY FIRST CREATING THE FRAGMENT AND THEN*/
/* EXECUTING THE FRAGMENT LOG WE CAN CREATE THE FRAGMENT AS */
/* DESIRED. THIS SHOULD ONLY OCCUR AFTER CREATING A FRAGMENT. */
/* */
/* TO INDICATE THAT NO LOCAL CHECKPOINT IS TO BE USED WE SET THE */
/* LOCAL CHECKPOINT TO ZNIL. */
/* --------------------------------------------------------------- */
createReplicaPtrP
->
lcpNo
=
ZNIL
;
}
else
{
jam
();
/* --------------------------------------------------------------- */
/* WE FOUND A PROPER LOCAL CHECKPOINT TO RESTART FROM. */
/* SET LOCAL CHECKPOINT ID AND LOCAL CHECKPOINT NUMBER. */
/* --------------------------------------------------------------- */
createReplicaPtrP
->
lcpNo
=
startLcpNo
;
arrGuard
(
startLcpNo
,
MAX_LCP_STORED
);
createReplicaPtrP
->
createLcpId
=
replicaPtr
.
p
->
lcpId
[
startLcpNo
];
}
//if
/* ----------------------------------------------------------------- */
/* WE HAVE EITHER FOUND A LOCAL CHECKPOINT OR WE ARE PLANNING TO */
/* EXECUTE THE LOG FROM THE INITIAL CREATION OF THE TABLE. IN BOTH */
/* CASES WE NEED TO FIND A SET OF LOGS THAT CAN EXECUTE SUCH THAT */
/* WE RECOVER TO THE SYSTEM RESTART GLOBAL CHECKPOINT. */
/* -_--------------------------------------------------------------- */
return
findLogNodes
(
createReplicaPtrP
,
fragPtr
,
startGci
,
stopGci
);
}
void
Dbdih
::
searchStoredReplicas
(
FragmentstorePtr
fragPtr
)
{
Uint32
nextReplicaPtrI
;
Const
Ptr
<
ReplicaRecord
>
replicaPtr
;
Ptr
<
ReplicaRecord
>
replicaPtr
;
replicaPtr
.
i
=
fragPtr
.
p
->
storedReplicas
;
while
(
replicaPtr
.
i
!=
RNIL
)
{
jam
();
ptrCheckGuard
(
replicaPtr
,
creplicaFileSize
,
replicaRecord
);
nextReplicaPtrI
=
replicaPtr
.
p
->
nextReplica
;
ConstPtr
<
ReplicaRecord
>
constReplicaPtr
;
constReplicaPtr
.
i
=
replicaPtr
.
i
;
constReplicaPtr
.
p
=
replicaPtr
.
p
;
NodeRecordPtr
nodePtr
;
nodePtr
.
i
=
replicaPtr
.
p
->
procNode
;
ptrCheckGuard
(
nodePtr
,
MAX_NDB_NODES
,
nodeRecord
);
...
...
@@ -12310,69 +12386,13 @@ void Dbdih::searchStoredReplicas(FragmentstorePtr fragPtr)
createReplicaPtr
.
i
=
cnoOfCreateReplicas
;
ptrCheckGuard
(
createReplicaPtr
,
4
,
createReplicaRecord
);
cnoOfCreateReplicas
++
;
createReplicaPtr
.
p
->
dataNodeId
=
replicaPtr
.
p
->
procNode
;
createReplicaPtr
.
p
->
replicaRec
=
replicaPtr
.
i
;
/* ----------------------------------------------------------------- */
/* WE NEED TO SEARCH FOR A PROPER LOCAL CHECKPOINT TO USE FOR THE */
/* SYSTEM RESTART. */
/* ----------------------------------------------------------------- */
Uint32
startGci
;
Uint32
startLcpNo
;
Uint32
stopGci
=
SYSFILE
->
newestRestorableGCI
;
bool
result
=
findStartGci
(
replicaPtr
,
stopGci
,
startGci
,
startLcpNo
);
if
(
!
result
)
{
jam
();
/* --------------------------------------------------------------- */
/* WE COULD NOT FIND ANY LOCAL CHECKPOINT. THE FRAGMENT THUS DO NOT*/
/* CONTAIN ANY VALID LOCAL CHECKPOINT. IT DOES HOWEVER CONTAIN A */
/* VALID FRAGMENT LOG. THUS BY FIRST CREATING THE FRAGMENT AND THEN*/
/* EXECUTING THE FRAGMENT LOG WE CAN CREATE THE FRAGMENT AS */
/* DESIRED. THIS SHOULD ONLY OCCUR AFTER CREATING A FRAGMENT. */
/* */
/* TO INDICATE THAT NO LOCAL CHECKPOINT IS TO BE USED WE SET THE */
/* LOCAL CHECKPOINT TO ZNIL. */
/* --------------------------------------------------------------- */
createReplicaPtr
.
p
->
lcpNo
=
ZNIL
;
}
else
{
jam
();
/* --------------------------------------------------------------- */
/* WE FOUND A PROPER LOCAL CHECKPOINT TO RESTART FROM. */
/* SET LOCAL CHECKPOINT ID AND LOCAL CHECKPOINT NUMBER. */
/* --------------------------------------------------------------- */
createReplicaPtr
.
p
->
lcpNo
=
startLcpNo
;
arrGuard
(
startLcpNo
,
MAX_LCP_STORED
);
createReplicaPtr
.
p
->
createLcpId
=
replicaPtr
.
p
->
lcpId
[
startLcpNo
];
}
//if
if
(
ERROR_INSERTED
(
7073
)
||
ERROR_INSERTED
(
7074
)){
jam
();
nodePtr
.
p
->
nodeStatus
=
NodeRecord
::
DEAD
;
}
/* ----------------------------------------------------------------- */
/* WE HAVE EITHER FOUND A LOCAL CHECKPOINT OR WE ARE PLANNING TO */
/* EXECUTE THE LOG FROM THE INITIAL CREATION OF THE TABLE. IN BOTH */
/* CASES WE NEED TO FIND A SET OF LOGS THAT CAN EXECUTE SUCH THAT */
/* WE RECOVER TO THE SYSTEM RESTART GLOBAL CHECKPOINT. */
/* -_--------------------------------------------------------------- */
if
(
!
findLogNodes
(
createReplicaPtr
.
p
,
fragPtr
,
startGci
,
stopGci
))
{
jam
();
/* --------------------------------------------------------------- */
/* WE WERE NOT ABLE TO FIND ANY WAY OF RESTORING THIS REPLICA. */
/* THIS IS A POTENTIAL SYSTEM ERROR. */
/* --------------------------------------------------------------- */
cnoOfCreateReplicas
--
;
return
;
}
//if
if
(
ERROR_INSERTED
(
7073
)
||
ERROR_INSERTED
(
7074
)){
jam
();
nodePtr
.
p
->
nodeStatus
=
NodeRecord
::
ALIVE
;
}
/**
* Should have been checked in resetReplicaSr
*/
ndbrequire
(
setup_create_replica
(
fragPtr
,
createReplicaPtr
.
p
,
constReplicaPtr
));
break
;
}
default:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment