1 | #!/bin/ksh |
---|
2 | # IBM_PROLOG_BEGIN_TAG |
---|
3 | # This is an automatically generated prolog. |
---|
4 | # |
---|
5 | # |
---|
6 | # |
---|
7 | # Licensed Materials - Property of IBM |
---|
8 | # |
---|
9 | # (C) COPYRIGHT International Business Machines Corp. 2000,2007 |
---|
10 | # All Rights Reserved |
---|
11 | # |
---|
12 | # US Government Users Restricted Rights - Use, duplication or |
---|
13 | # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. |
---|
14 | # |
---|
15 | # IBM_PROLOG_END_TAG |
---|
16 | # @(#)99 1.131.1.9 src/avs/fs/mmfs/ts/admin/mmcrcluster.sh, mmfs, avs_rgpfs24, rgpfs24s012a 4/2/07 12:58:08 |
---|
17 | ############################################################################### |
---|
18 | # |
---|
19 | # Usage: |
---|
20 | # mmcrcluster -N {NodeDesc[,NodeDesc...] | NodeFile} |
---|
21 | # -p PrimaryServer [-s SecondaryServer] |
---|
22 | # [-r remoteShellCommand] [-R remoteFileCopyCommand] |
---|
23 | # [-C ClusterName] [-U DomainName] [-A] [-c ConfigFile] |
---|
24 | # |
---|
25 | # where: |
---|
26 | # |
---|
27 | # -N NodeDesc,NodeDesc,... specifies a comma-separated list of node |
---|
28 | # descriptors that detail the node interfaces |
---|
29 | # to be added to the cluster. The nodes must not |
---|
30 | # presently belong to the cluster. |
---|
31 | # |
---|
32 | # -N NodeFile specifies a file of node descriptors that detail |
---|
33 | # the node interfaces to be added to the cluster. |
---|
34 | # The nodes must not presently belong to the cluster. |
---|
35 | # |
---|
36 | # -p PrimaryServer specifies the node to be used as the primary server |
---|
37 | # of the GPFS sdrfs data for this cluster |
---|
38 | # |
---|
39 | # -s SecondaryServer specifies the node to be used as the secondary server |
---|
40 | # of the GPFS sdrfs data for this cluster (optional) |
---|
41 | # |
---|
42 | # -r remoteShellCommand specifies the fully-qualified pathname for |
---|
43 | # the remote shell program to be used by GPFS. |
---|
44 | # The default is /usr/bin/rsh. |
---|
45 | # |
---|
46 | # -R remoteFileCopyCommand specifies the fully-qualified pathname for |
---|
47 | # the remote file copy program to be used by GPFS. |
---|
48 | # The default is /usr/bin/rcp. |
---|
49 | # |
---|
50 | # -C ClusterName user-specified name for the cluster. If the name |
---|
51 | # contains dots it is assumed to be a fully-qualified |
---|
52 | # domain name. Otherwise, the domain will default |
---|
53 | # to the domain of the primary configuration server. |
---|
54 | # If not specified, or if single dot is specified, |
---|
55 | # ClusterName will default to the fully-qualified name |
---|
56 | # of the primary config server (-p parameter). |
---|
57 | # |
---|
58 | # -U DomainName UID domain name |
---|
59 | # |
---|
60 | # -A specifies automatic bringing up of mmfs daemons at |
---|
61 | # boot time. Default is no autoload. |
---|
62 | # |
---|
63 | # -c ConfigFile file with mmfs.cfg parameters; see mmfs.cfg.sample |
---|
64 | # in /usr/lpp/mmfs/samples |
---|
65 | # |
---|
66 | # |
---|
67 | # Obsolete but still supported options: |
---|
68 | # |
---|
69 | # -n NodeFile specifies a file of node descriptors that detail the |
---|
70 | # node interfaces making up the GPFS cluster |
---|
71 | # |
---|
72 | # Each node descriptor has the format: |
---|
73 | # |
---|
74 | # nodeName:nodeRoles:adminNodeName: |
---|
75 | # |
---|
76 | # where: |
---|
77 | # |
---|
78 | # nodeName is either a short or fully-qualified hostname, |
---|
79 | # or an IP address for the primary GPFS network |
---|
80 | # to be used for daemon to daemon communications |
---|
81 | # |
---|
82 | # nodeRoles is a '-' separated list of node roles. Unless changed |
---|
83 | # on the mmconfig or mmaddnode commands, these roles will |
---|
84 | # be associated with the node when it becomes a member of |
---|
85 | # a nodeset. |
---|
86 | # |
---|
87 | # adminNodeName is either a short or fully-qualified hostname, or an IP |
---|
88 | # address to be used by the admin scripts to communicate |
---|
89 | # between nodes. This is an optional parameter; if it |
---|
90 | # is not specified, the nodeName value is used. |
---|
91 | # |
---|
92 | # Undocumented options: |
---|
93 | # |
---|
94 | # -t ClusterType specifies the cluster type for this cluster |
---|
95 | # (supported values are "lc" and "single"). |
---|
96 | # See note below for additional information. |
---|
97 | # |
---|
98 | # The format of the -t parameter is ClusterType[/EnvironmentType] |
---|
99 | # where "ClusterType" is the GPFS cluster type as defined above. |
---|
100 | # The optional "EnvironmentType" designates the environment within |
---|
101 | # which the GPFS cluster is being created. The following table |
---|
102 | # shows the allowed values. |
---|
103 | # |
---|
104 | # ClusterType EnvironmentType Remarks |
---|
105 | # |
---|
106 | # lc lc2 true loose cluster; no RSCT |
---|
107 | # |
---|
108 | # lc lc old style Linux only loose cluster; |
---|
109 | # RSCT subsystem is controlled by GPFS; |
---|
110 | # this combination is no longer allowed |
---|
111 | # |
---|
112 | # single single single node environment |
---|
113 | # |
---|
114 | # Notes: |
---|
115 | # |
---|
116 | # - Nodes are designated as quorum or non-quorum nodes when they |
---|
117 | # are added to the cluster (mmcrcluster, mmaddnode). |
---|
118 | # |
---|
119 | # - The quorum designation can be changed with mmchconfig. |
---|
120 | # |
---|
121 | # - It is not allowed to change (or delete from the cluster) |
---|
122 | # the last quorum node. |
---|
123 | # |
---|
124 | # - If VSD-based disks will be used, all AIX nodes must belong to |
---|
125 | # an RSCT peer domain. VSD disks will not be visible to nodes |
---|
126 | # that do not belong to the RSCT peer domain. This rule cannot |
---|
127 | # be enforced by mmcrcluster or mmaddnode. |
---|
128 | # |
---|
129 | ############################################################################### |
---|
130 | |
---|
131 | # Include global declarations and service routines. |
---|
132 | . /usr/lpp/mmfs/bin/mmglobfuncs |
---|
133 | . /usr/lpp/mmfs/bin/mmsdrfsdef |
---|
134 | |
---|
135 | sourceFile="mmcrcluster.sh" |
---|
136 | [[ -n $DEBUG || -n $DEBUGmmcrcluster ]] && set -x |
---|
137 | $mmTRACE_ENTER "$*" |
---|
138 | |
---|
139 | # Local work files. Names should be of the form: |
---|
140 | # fn=${tmpDir}fn.${mmcmd}.$$ |
---|
141 | inputNodes=${tmpDir}inputNodes.${mmcmd}.$$ |
---|
142 | processedNodes=${tmpDir}processedNodes.${mmcmd}.$$ |
---|
143 | goodnodes=${tmpDir}goodnodes.${mmcmd}.$$ |
---|
144 | singleNode=${tmpDir}singleNode.${mmcmd}.$$ |
---|
145 | |
---|
146 | LOCAL_FILES=" $inputNodes $processedNodes $goodnodes $singleNode " |
---|
147 | |
---|
148 | |
---|
149 | # Local declarations |
---|
150 | usageMsg=343 |
---|
151 | backupServer="" |
---|
152 | rshPath="" |
---|
153 | rcpPath="" |
---|
154 | nodesetId=$HOME_CLUSTER |
---|
155 | integer nodeNumber=0 |
---|
156 | integer nodeCount=0 |
---|
157 | integer totalNodeCount=0 |
---|
158 | integer quorumNodeCount=0 |
---|
159 | rc=0 |
---|
160 | fatalError="" |
---|
161 | primaryInCluster="" |
---|
162 | backupInCluster="" |
---|
163 | lowestVersion=100000 |
---|
164 | highestVersion=0 |
---|
165 | osEnvironment=$osName |
---|
166 | commProtocol=TCP |
---|
167 | tcpPort=$defaultTcpPort |
---|
168 | newKeyGenNumber=0 |
---|
169 | committedKeyGenNumber=0 |
---|
170 | secLevel=0 |
---|
171 | keyfileFormatLevel=0 |
---|
172 | quorumDefault=$nonQuorumNode |
---|
173 | eventsPort="" |
---|
174 | mmsdrservPort="" |
---|
175 | lapiWindow=$noWindow # obsolete |
---|
176 | switchNumber=$noSwitch # obsolete |
---|
177 | |
---|
178 | Aarg=no |
---|
179 | carg="" |
---|
180 | Carg="" |
---|
181 | narg="" |
---|
182 | Narg="" |
---|
183 | parg="" |
---|
184 | rarg="" |
---|
185 | Rarg="" |
---|
186 | sarg="" |
---|
187 | Uarg="" |
---|
188 | typeset -l targ="" |
---|
189 | typeset -l role |
---|
190 | |
---|
191 | |
---|
192 | # Local routines |
---|
193 | |
---|
194 | |
---|
195 | ##################################################################### |
---|
196 | # |
---|
197 | # Function: Verifies that a command executed successfully. If the |
---|
198 | # return code from the command is not zero, the function |
---|
199 | # issues a message and sets a failure flag. It returns |
---|
200 | # with the same return code that was specified on input. |
---|
201 | # |
---|
202 | # Input: $1 - name of the command to check |
---|
203 | # $2 - return code from the execution of the command |
---|
204 | # |
---|
205 | ##################################################################### |
---|
206 | function checkForErrorsAndReturn |
---|
207 | { |
---|
208 | if [ $2 != "0" ] |
---|
209 | then |
---|
210 | fatalError=yes |
---|
211 | # Unexpected error |
---|
212 | printErrorMsg 171 "$mmcmd" "$1" $2 |
---|
213 | fi |
---|
214 | return $2 |
---|
215 | |
---|
216 | } #---------- end of function checkForErrorsAndReturn ----------- |
---|
217 | |
---|
218 | |
---|
219 | ######################################################################## |
---|
220 | # |
---|
221 | # Function: Verifies the user provided file with mmfs.cfg parameters |
---|
222 | # and filters out all blank and comment lines. Lines with |
---|
223 | # configuration parameters that are invalid, or require |
---|
224 | # additional processing, or have already been established |
---|
225 | # by the mmcrcluster processing, are filtered out as well. |
---|
226 | # |
---|
227 | # Input: $1 - name of file with the user-specified mmfs.cfg values. |
---|
228 | # $2 - name of output file with verified mmfs.cfg values. |
---|
229 | # |
---|
230 | # Output: None explicit. |
---|
231 | # |
---|
232 | # Returns: Always zero. |
---|
233 | # |
---|
234 | ######################################################################## |
---|
235 | function processUserConfigFile # <cfgFile> <verifiedFile> |
---|
236 | { |
---|
237 | typeset sourceFile="mmcrcluster.sh" |
---|
238 | [[ -n $DEBUG || -n $DEBUGprocessUserConfigFile ]] && set -x |
---|
239 | $mmTRACE_ENTER "$*" |
---|
240 | typeset cfgFile=$1 |
---|
241 | typeset verifiedCfgFile=$2 |
---|
242 | |
---|
243 | typeset -l cfgParm_lc |
---|
244 | typeset cfgLine cfgParm errCode parmOut |
---|
245 | typeset nodeOverrideInEffect=false |
---|
246 | |
---|
247 | # Issue a progress message (processing user config data . . . ). |
---|
248 | printInfoMsg 143 "$(date)" $mmcmd $cfgFile |
---|
249 | |
---|
250 | $rm -f $verifiedCfgFile |
---|
251 | exec 4<&- |
---|
252 | exec 4< $cfgFile |
---|
253 | while read -u4 cfgLine |
---|
254 | do |
---|
255 | # Skip empty and comment lines. |
---|
256 | [[ $cfgLine = *([$BLANKchar$TABchar]) ]] && continue |
---|
257 | [[ $cfgLine = *([$BLANKchar$TABchar])#* ]] && continue |
---|
258 | |
---|
259 | # Parse the input line. |
---|
260 | # |
---|
261 | # Each line is expected to consist of a config parameter and |
---|
262 | # a corresponding configuration value. If a line contains a |
---|
263 | # node name, or a list of comma separated names, enclosed in |
---|
264 | # square brackets, the line introduces a node-override section. |
---|
265 | # A node-override section is terminated by a "[common]" line. |
---|
266 | |
---|
267 | set -f ; set -- $cfgLine ; set +f |
---|
268 | cfgParm=$1 |
---|
269 | |
---|
270 | # Convert the parameter to lower case characters only. |
---|
271 | cfgParm_lc="$cfgParm" |
---|
272 | |
---|
273 | # See if this is a node-override delimiter line. |
---|
274 | if [[ $cfgParm = "[common]" ]] |
---|
275 | then |
---|
276 | # This is the terminating line of a node-override section. |
---|
277 | nodeOverrideInEffect=false |
---|
278 | errCode=0 |
---|
279 | |
---|
280 | elif [[ $cfgParm = \[* ]] |
---|
281 | then |
---|
282 | # This is the begining of a node-override section. |
---|
283 | nodeOverrideInEffect=true |
---|
284 | errCode=0 |
---|
285 | |
---|
286 | else |
---|
287 | # This is a line with a config paramter/value pair. |
---|
288 | # Examine the parameter to see if it should be suppressed. |
---|
289 | |
---|
290 | case $cfgParm_lc in |
---|
291 | |
---|
292 | # The following parameters are always set by mmcrcluster. |
---|
293 | autoload ) errCode=1 ;; |
---|
294 | clusterid ) errCode=1 ;; |
---|
295 | clustername ) errCode=1 ;; |
---|
296 | clustertype ) errCode=1 ;; |
---|
297 | maxfeaturelevelallowed ) errCode=1 ;; |
---|
298 | usedisklease ) errCode=1 ;; |
---|
299 | uiddomain ) [[ -n $Uarg ]] && errCode=1 ;; |
---|
300 | |
---|
301 | # The following parameters must always be set with mmchconfig. |
---|
302 | cipherlist ) errCode=2 ;; |
---|
303 | eventsexportertcpport ) errCode=2 ;; |
---|
304 | gpfseventsport ) errCode=2 ;; |
---|
305 | mmsdrservport ) errCode=2 ;; |
---|
306 | mmsdrservtcpport ) errCode=2 ;; |
---|
307 | tcpport ) errCode=2 ;; |
---|
308 | tiebreakerdisk ) errCode=2 ;; |
---|
309 | tsctcpport ) errCode=2 ;; |
---|
310 | |
---|
311 | # The following parameters are obsolete. |
---|
312 | comm_protocol ) errCode=3 ;; |
---|
313 | corequorum ) errCode=3 ;; |
---|
314 | diskquorum ) errCode=3 ;; |
---|
315 | dynmemsize ) errCode=3 ;; |
---|
316 | gpfsobjectport ) errCode=3 ;; |
---|
317 | group ) errCode=3 ;; |
---|
318 | importancefactor ) errCode=3 ;; |
---|
319 | locktableversion ) errCode=3 ;; |
---|
320 | logdir ) errCode=3 ;; |
---|
321 | mallocsize ) errCode=3 ;; |
---|
322 | maxpagepool ) errCode=3 ;; |
---|
323 | memrebalanceinterval ) errCode=3 ;; |
---|
324 | mmgetobjdport ) errCode=3 ;; |
---|
325 | minpagepool ) errCode=3 ;; |
---|
326 | multinode ) errCode=3 ;; |
---|
327 | nodelist ) errCode=3 ;; |
---|
328 | nodeprefs ) errCode=3 ;; |
---|
329 | recgroup ) errCode=3 ;; |
---|
330 | singlenodequorum ) errCode=3 ;; |
---|
331 | spsecworkerthreads ) errCode=3 ;; |
---|
332 | useauthentication ) errCode=3 ;; |
---|
333 | usesinglenodequorum ) errCode=3 ;; |
---|
334 | usespsecurity ) errCode=3 ;; |
---|
335 | worker2threads ) errCode=3 ;; |
---|
336 | |
---|
337 | # Everything else looks acceptable for now. |
---|
338 | * ) errCode=0 ;; |
---|
339 | |
---|
340 | esac # end of case $cfgParm_lc in |
---|
341 | |
---|
342 | |
---|
343 | # If no error was detected so far, see if the parameter |
---|
344 | # is allowed to appear in a node-override section. |
---|
345 | if [[ $errCode -eq 0 && $nodeOverrideInEffect = true ]] |
---|
346 | then |
---|
347 | |
---|
348 | case $cfgParm_lc in |
---|
349 | # The following parameters cannot appear in a node-override section. |
---|
350 | allowdummyconnections ) errCode=4 ;; |
---|
351 | allowremoteconnections ) errCode=4 ;; |
---|
352 | automountdir ) errCode=4 ;; |
---|
353 | distributedtokenserver ) errCode=4 ;; |
---|
354 | leasedmstimeout ) errCode=4 ;; |
---|
355 | leaseduration ) errCode=4 ;; |
---|
356 | leaserecoverywait ) errCode=4 ;; |
---|
357 | listenonallinterfaces ) errCode=4 ;; |
---|
358 | maxmissedpingtimeout ) errCode=4 ;; |
---|
359 | maxtokenservers ) errCode=4 ;; |
---|
360 | minmissedpingtimeout ) errCode=4 ;; |
---|
361 | minquorumnodes ) errCode=4 ;; |
---|
362 | multitmmountthreshold ) errCode=4 ;; |
---|
363 | pindaemon ) errCode=4 ;; |
---|
364 | pingperiod ) errCode=4 ;; |
---|
365 | res ) errCode=4 ;; |
---|
366 | setctimeonattrchange ) errCode=4 ;; |
---|
367 | totalpingtimeout ) errCode=4 ;; |
---|
368 | tscprimary ) errCode=4 ;; |
---|
369 | uiddomain ) errCode=4 ;; |
---|
370 | writealldescreplicas ) errCode=4 ;; |
---|
371 | |
---|
372 | # Everything else is acceptable. |
---|
373 | * ) errCode=0 ;; |
---|
374 | |
---|
375 | esac # end of case $cfgParm_lc in |
---|
376 | |
---|
377 | fi # end of if [[ -z $errCode && -n $nodeOverrideInEffect ]] |
---|
378 | |
---|
379 | fi # end of if [[ $cfgParm = "[common]" ]] |
---|
380 | |
---|
381 | |
---|
382 | # If an error was detected, issue an appropriate message and |
---|
383 | # skip the line. Otherwise, add the line to the verified file. |
---|
384 | if [[ $errCode -eq 1 ]] |
---|
385 | then |
---|
386 | # Parameter is set by mmcrcluster. |
---|
387 | printErrorMsg 144 $mmcmd $cfgParm "$cfgLine" |
---|
388 | |
---|
389 | elif [[ $errCode -eq 2 ]] |
---|
390 | then |
---|
391 | # Parameter must be set using mmchconfig. |
---|
392 | printErrorMsg 145 $mmcmd $cfgParm mmchconfig "$cfgLine" |
---|
393 | |
---|
394 | elif [[ $errCode -eq 3 ]] |
---|
395 | then |
---|
396 | # Parameter is obsolete. |
---|
397 | printErrorMsg 146 $mmcmd $cfgParm "$cfgLine" |
---|
398 | |
---|
399 | elif [[ $errCode -eq 4 ]] |
---|
400 | then |
---|
401 | # Parameter cannot appear in a node-override section. |
---|
402 | printErrorMsg 147 $mmcmd $cfgParm "$cfgLine" |
---|
403 | |
---|
404 | else |
---|
405 | # The line looks OK. Ensure the parameter is spelled correctly. |
---|
406 | # Print the line to the verified file. |
---|
407 | case $cfgParm_lc in |
---|
408 | |
---|
409 | allowdeleteaclonchmod ) parmOut=allowDeleteAclOnChmod ;; |
---|
410 | allowdummyconnections ) parmOut=allowDummyConnections ;; |
---|
411 | allowremoteconnections ) parmOut=allowRemoteConnections ;; |
---|
412 | allowsynchronousfcntlretries ) parmOut=allowSynchronousFcntlRetries ;; |
---|
413 | assertonstructureerror ) parmOut=assertOnStructureError ;; |
---|
414 | asyncsocketnotify ) parmOut=asyncSocketNotify ;; |
---|
415 | automountdir ) parmOut=automountDir ;; |
---|
416 | autosgloadbalance ) parmOut=autoSgLoadBalance ;; |
---|
417 | crashdump ) parmOut=crashdump ;; |
---|
418 | datastructuredump ) parmOut=dataStructureDump ;; |
---|
419 | datastructuredumponsgpanic ) parmOut=dataStructureDumpOnSGPanic ;; |
---|
420 | distributedtokenserver ) parmOut=distributedTokenServer ;; |
---|
421 | dmapienable ) parmOut=dmapiEnable ;; |
---|
422 | dmapieventbuffers ) parmOut=dmapiEventBuffers ;; |
---|
423 | dmapieventtimeout ) parmOut=dmapiEventTimeout ;; |
---|
424 | dmapimounttimeout ) parmOut=dmapiMountTimeout ;; |
---|
425 | dmapisessionfailuretimeout ) parmOut=dmapiSessionFailureTimeout ;; |
---|
426 | dmapiworkerthreads ) parmOut=dmapiWorkerThreads ;; |
---|
427 | eewatchdoghungthreadcutoff ) parmOut=eeWatchDogHungThreadCutoff ;; |
---|
428 | eewatchdoginterval ) parmOut=eeWatchDogInterval ;; |
---|
429 | enablenfscluster ) parmOut=enableNFSCluster ;; |
---|
430 | enableuidremap ) parmOut=enableUIDremap ;; |
---|
431 | enablestatuidremap ) parmOut=enableStatUIDremap ;; |
---|
432 | enabletreebasedquotas ) parmOut=enableTreeBasedQuotas ;; |
---|
433 | envvar ) parmOut=envVar ;; |
---|
434 | flusheddatatarget ) parmOut=flushedDataTarget ;; |
---|
435 | flushedinodetarget ) parmOut=flushedInodeTarget ;; |
---|
436 | healthcheckinterval ) parmOut=healthCheckInterval ;; |
---|
437 | hotlistpct ) parmOut=hotlistPct ;; |
---|
438 | ignorereplicaspaceonstat ) parmOut=IgnoreReplicaSpaceOnStat ;; |
---|
439 | iohistorysize ) parmOut=ioHistorySize ;; |
---|
440 | leasedmstimeout ) parmOut=leaseDMSTimeout ;; |
---|
441 | leaseduration ) parmOut=leaseDuration ;; |
---|
442 | leaserecoverywait ) parmOut=leaseRecoveryWait ;; |
---|
443 | license ) parmOut=LICENSE ;; |
---|
444 | listenonallinterfaces ) parmOut=listenOnAllInterfaces ;; |
---|
445 | mmapkprocs ) parmOut=mmapKprocs ;; |
---|
446 | maxallocpcttocache ) parmOut=maxAllocPctToCache ;; |
---|
447 | maxbackgrounddeletionthreads ) parmOut=maxBackgroundDeletionThreads ;; |
---|
448 | maxblocksize ) parmOut=maxblocksize ;; |
---|
449 | maxbufferdescs ) parmOut=maxBufferDescs ;; |
---|
450 | maxdatashippoolsize ) parmOut=maxDataShipPoolSize ;; |
---|
451 | maxdiskaddrbuffs ) parmOut=maxDiskAddrBuffs ;; |
---|
452 | maxfcntlrangesperfile ) parmOut=maxFcntlRangesPerFile ;; |
---|
453 | maxfilecleaners ) parmOut=maxFileCleaners ;; |
---|
454 | maxfilestocache ) parmOut=maxFilesToCache ;; |
---|
455 | maxinodedeallochistory ) parmOut=maxInodeDeallocHistory ;; |
---|
456 | maxinodedeallocprefetch ) parmOut=maxInodeDeallocPrefetch ;; |
---|
457 | maxmbps ) parmOut=maxMBpS ;; |
---|
458 | maxmissedpingtimeout ) parmOut=maxMissedPingTimeout ;; |
---|
459 | maxnfsdelegationtimeout ) parmOut=maxNFSDelegationTimeout ;; |
---|
460 | maxreceiverthreads ) parmOut=maxReceiverThreads ;; |
---|
461 | maxsgdesciobufsize ) parmOut=maxSGDescIOBufSize ;; |
---|
462 | maxstatcache ) parmOut=maxStatCache ;; |
---|
463 | maxtokenservers ) parmOut=maxTokenServers ;; |
---|
464 | minmissedpingtimeout ) parmOut=minMissedPingTimeout ;; |
---|
465 | minquorumnodes ) parmOut=minQuorumNodes ;; |
---|
466 | mmsdrservtimeout ) parmOut=mmsdrservTimeout ;; |
---|
467 | mmsdrservworkerpool ) parmOut=mmsdrservWorkerPool ;; |
---|
468 | multitmmountthreshold ) parmOut=multiTMMountThreshold ;; |
---|
469 | nfsprefetchstrategy ) parmOut=nfsPrefetchStrategy ;; |
---|
470 | nsdbufspace ) parmOut=nsdbufspace ;; |
---|
471 | nsdmaxworkerthreads ) parmOut=nsdMaxWorkerThreads ;; |
---|
472 | nsdminworkerthreads ) parmOut=nsdMinWorkerThreads ;; |
---|
473 | nsdservercheckingintervalformount ) parmOut=nsdServerCheckingIntervalForMount ;; |
---|
474 | nsdserverwaitconfig ) parmOut=nsdServerWaitConfig ;; |
---|
475 | nsdserverwaittimeformount ) parmOut=nsdServerWaitTimeForMount ;; |
---|
476 | nsdserverwaittimewindowonmount ) parmOut=nsdServerWaitTimeWindowOnMount ;; |
---|
477 | nsdthreadsperdisk ) parmOut=nsdThreadsPerDisk ;; |
---|
478 | openssllibname ) parmOut=openssllibname ;; |
---|
479 | pagepool ) parmOut=pagepool ;; |
---|
480 | panicondiskfail ) parmOut=unmountOnDiskFail ;; |
---|
481 | pcttokenmgrstorageuse ) parmOut=pctTokenMgrStorageUse ;; |
---|
482 | pindaemon ) parmOut=pindaemon ;; |
---|
483 | pingperiod ) parmOut=pingPeriod ;; |
---|
484 | pinmaster ) parmOut=pinmaster ;; |
---|
485 | prefetchpct ) parmOut=prefetchPct ;; |
---|
486 | prefetchthreads ) parmOut=prefetchThreads ;; |
---|
487 | prefetchtimeout ) parmOut=prefetchTimeout ;; |
---|
488 | priority ) parmOut=priority ;; |
---|
489 | readreplicapolicy ) parmOut=readReplicaPolicy ;; |
---|
490 | res ) parmOut=res ;; |
---|
491 | retryfcntltokenthreshold ) parmOut=retryFcntlTokenThreshold ;; |
---|
492 | seqdiscardthreshhold ) parmOut=seqDiscardThreshhold ;; |
---|
493 | setctimeonattrchange ) parmOut=setCtimeOnAttrChange ;; |
---|
494 | sharedmemlimit ) parmOut=sharedMemLimit ;; |
---|
495 | socketrcvbuffersize ) parmOut=socketRcvBufferSize ;; |
---|
496 | socketsndbuffersize ) parmOut=socketSndBufferSize ;; |
---|
497 | statcachedirpct ) parmOut=statCacheDirPct ;; |
---|
498 | subnets ) parmOut=subnets ;; |
---|
499 | syncinterval ) parmOut=syncInterval ;; |
---|
500 | takeovertimeout ) parmOut=takeovertimeout ;; |
---|
501 | tokenmemlimit ) parmOut=tokenMemLimit ;; |
---|
502 | totalpingtimeout ) parmOut=totalPingTimeout ;; |
---|
503 | trace ) parmOut=trace ;; |
---|
504 | tscprimary ) parmOut=tscPrimary ;; |
---|
505 | tscworkerpool ) parmOut=tscWorkerPool ;; |
---|
506 | uiddomain ) parmOut=uidDomain ;; |
---|
507 | uidexpiration ) parmOut=uidExpiration ;; |
---|
508 | unmountondiskfail ) parmOut=unmountOnDiskFail ;; |
---|
509 | wait4rvsd ) parmOut=wait4RVSD ;; |
---|
510 | waitforvsd ) parmOut=wait4RVSD ;; |
---|
511 | watchdogtimeout ) parmOut=watchdogtimeout ;; |
---|
512 | worker1threads ) parmOut=worker1Threads ;; |
---|
513 | worker3threads ) parmOut=worker3Threads ;; |
---|
514 | writealldescreplicas ) parmOut=writeAllDescReplicas ;; |
---|
515 | writebehindthreshhold ) parmOut=writebehindThreshhold ;; |
---|
516 | \[* ) parmOut="" ;; |
---|
517 | * ) parmOut="$cfgParm" ;; |
---|
518 | esac # end of case $cfgParm_lc in |
---|
519 | |
---|
520 | # Print the line to the verified file. |
---|
521 | print -- "$parmOut${cfgLine#$cfgParm}" >> $verifiedCfgFile |
---|
522 | checkForErrors "writing to file $verifiedCfgFile" $? |
---|
523 | fi |
---|
524 | |
---|
525 | done # end of while read -u4 cfgLine |
---|
526 | |
---|
527 | return 0 |
---|
528 | |
---|
529 | } #---------- end of function processUserConfigFile ----------- |
---|
530 | |
---|
531 | |
---|
532 | |
---|
533 | ###################### |
---|
534 | # Mainline processing |
---|
535 | ###################### |
---|
536 | |
---|
537 | |
---|
538 | ################################# |
---|
539 | # Process the command arguments. |
---|
540 | ################################# |
---|
541 | [[ $arg1 = '-?' || $arg1 = '-h' || $arg1 = '--help' || $arg1 = '--' ]] && \ |
---|
542 | syntaxError "help" $usageMsg |
---|
543 | |
---|
544 | while getopts :Ac:C:n:N:p:r:R:s:t:U: OPT |
---|
545 | do |
---|
546 | case $OPT in |
---|
547 | |
---|
548 | A) # autoload option |
---|
549 | [[ $Aarg = yes ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
550 | Aarg=yes |
---|
551 | ;; |
---|
552 | |
---|
553 | c) # config file name |
---|
554 | [[ -n $carg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
555 | carg=$OPTARG |
---|
556 | ;; |
---|
557 | |
---|
558 | C) # cluster name |
---|
559 | [[ -n $Carg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
560 | Carg=$OPTARG |
---|
561 | checkName clusterName 255 "$Carg" |
---|
562 | [[ $? -ne 0 ]] && cleanupAndExit |
---|
563 | ;; |
---|
564 | |
---|
565 | n) # node descriptors file |
---|
566 | [[ -n $narg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
567 | narg=$OPTARG |
---|
568 | ;; |
---|
569 | |
---|
570 | N) # node descriptors list or file |
---|
571 | [[ -n $Narg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
572 | Narg=$OPTARG |
---|
573 | ;; |
---|
574 | |
---|
575 | p) # primary server |
---|
576 | [[ -n $parg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
577 | parg=$OPTARG |
---|
578 | ;; |
---|
579 | |
---|
580 | r) # remote shell command |
---|
581 | [[ -n $rarg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
582 | rarg=$OPTARG |
---|
583 | [[ $rarg = ${rarg#/} ]] && \ |
---|
584 | syntaxError "absolutePath_2" $noUsageMsg "-$OPT" "$rarg" |
---|
585 | ;; |
---|
586 | |
---|
587 | R) # remote file copy command |
---|
588 | [[ -n $Rarg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
589 | Rarg=$OPTARG |
---|
590 | [[ $Rarg = ${Rarg#/} ]] && \ |
---|
591 | syntaxError "absolutePath_2" $noUsageMsg "-$OPT" "$Rarg" |
---|
592 | ;; |
---|
593 | |
---|
594 | s) # secondary server |
---|
595 | [[ -n $sarg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
596 | sarg=$OPTARG |
---|
597 | ;; |
---|
598 | |
---|
599 | t) # cluster type |
---|
600 | [[ -n $targ ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
601 | targ=$OPTARG |
---|
602 | ;; |
---|
603 | |
---|
604 | U) # UID domain name |
---|
605 | [[ -n $Uarg ]] && syntaxError "multiple" $noUsageMsg "-$OPT" |
---|
606 | Uarg=$OPTARG |
---|
607 | ;; |
---|
608 | |
---|
609 | +[AcCnNprRstU]) # Invalid option |
---|
610 | syntaxError "invalidOption" $usageMsg $OPT |
---|
611 | ;; |
---|
612 | |
---|
613 | :) # Missing argument |
---|
614 | syntaxError "missingValue" $usageMsg $OPTARG |
---|
615 | ;; |
---|
616 | |
---|
617 | *) # Invalid option |
---|
618 | syntaxError "invalidOption" $usageMsg $OPTARG |
---|
619 | ;; |
---|
620 | esac |
---|
621 | |
---|
622 | done # end of while getopts :Ac:C:n:N:p:r:R:s:t:U: OPT do |
---|
623 | |
---|
624 | shift OPTIND-1 |
---|
625 | [[ $# -ne 0 ]] && syntaxError "extraArg" $usageMsg $1 |
---|
626 | |
---|
627 | [[ -z $targ ]] && targ="lc/lc2" |
---|
628 | |
---|
629 | [[ $targ != single* && ( -z $parg || ( -z $Narg && -z $narg ) ) ]] && \ |
---|
630 | syntaxError "missingArgs" $usageMsg |
---|
631 | |
---|
632 | [[ -n $narg && -n $Narg ]] && \ |
---|
633 | syntaxError "invalidCombination" $usageMsg "-n" "-N" |
---|
634 | |
---|
635 | |
---|
636 | ############################################################## |
---|
637 | # If the cluster type is single, simulate missing parameters. |
---|
638 | ############################################################## |
---|
639 | if [[ $targ = single* ]] |
---|
640 | then |
---|
641 | if [[ -z $Narg && -z $narg ]] |
---|
642 | then |
---|
643 | print -- "$($hostname)" > $singleNode |
---|
644 | Narg=$singleNode |
---|
645 | fi |
---|
646 | |
---|
647 | [[ -z $parg ]] && \ |
---|
648 | parg=$($hostname) |
---|
649 | |
---|
650 | quorumDefault=$quorumNode |
---|
651 | mmsdrservPort=0 |
---|
652 | fi |
---|
653 | |
---|
654 | |
---|
655 | ########################################################### |
---|
656 | # Check the value of the mandatory cluster type parameter. |
---|
657 | ########################################################### |
---|
658 | IFS='/' |
---|
659 | set -f ; set -- $targ ; set +f |
---|
660 | clusterType=$1 |
---|
661 | environmentType=$2 |
---|
662 | IFS="$IFS_sv" |
---|
663 | |
---|
664 | case $clusterType in |
---|
665 | lc ) |
---|
666 | [[ -z $environmentType ]] && \ |
---|
667 | environmentType=lc2 |
---|
668 | [[ $environmentType != lc2 ]] && \ |
---|
669 | invalidClusterType=yes |
---|
670 | ;; |
---|
671 | |
---|
672 | single ) |
---|
673 | [[ -z $environmentType ]] && \ |
---|
674 | environmentType=single |
---|
675 | [[ $environmentType != single ]] && \ |
---|
676 | invalidClusterType=yes |
---|
677 | ;; |
---|
678 | |
---|
679 | * ) |
---|
680 | invalidClusterType=yes |
---|
681 | ;; |
---|
682 | esac |
---|
683 | |
---|
684 | if [[ $invalidClusterType = yes ]] |
---|
685 | then |
---|
686 | # Invalid value for cluster type. |
---|
687 | printErrorMsg 153 $mmcmd "-t" |
---|
688 | cleanupAndExit |
---|
689 | fi |
---|
690 | |
---|
691 | clusterSubtype=$environmentType |
---|
692 | |
---|
693 | |
---|
694 | ######################################################## |
---|
695 | # Check whether the prerequisite software is installed. |
---|
696 | ######################################################## |
---|
697 | checkPrereqs $environmentType |
---|
698 | if [[ $? -ne 0 ]] |
---|
699 | then |
---|
700 | # The prerequisite software is not installed. |
---|
701 | printErrorMsg 349 $mmcmd $($hostname) |
---|
702 | cleanupAndExit |
---|
703 | fi |
---|
704 | |
---|
705 | |
---|
706 | ########################################################################## |
---|
707 | # Set global variables. These are normally determined automatically, |
---|
708 | # but since a cluster does not exist yet, they need to be set explicitly. |
---|
709 | ########################################################################## |
---|
710 | export MMMODE=$clusterType |
---|
711 | export environmentType=$environmentType |
---|
712 | ourNodeName=$(hostname) |
---|
713 | |
---|
714 | |
---|
715 | ################################################## |
---|
716 | # Check the mandatory node descriptors parameter. |
---|
717 | ################################################## |
---|
718 | if [[ -n $Narg ]] |
---|
719 | then |
---|
720 | # The -N parameter may be either a list or a file. Which is it? |
---|
721 | if [[ -f $Narg ]] |
---|
722 | then |
---|
723 | # It is a file; verify its existence and create our own copy. |
---|
724 | checkUserFile $Narg $inputNodes |
---|
725 | [[ $? -ne 0 ]] && cleanupAndExit |
---|
726 | else |
---|
727 | # It is not a file, so it must be a list. |
---|
728 | # Convert the input node list into a file. |
---|
729 | $rm -f $inputNodes |
---|
730 | IFS=',' |
---|
731 | for nodeDesc in $Narg |
---|
732 | do |
---|
733 | print -- "$nodeDesc" >> $inputNodes |
---|
734 | checkForErrors "writing to $inputNodes" $? |
---|
735 | done |
---|
736 | IFS="$IFS_sv" # Restore the default IFS setting. |
---|
737 | fi # end of if [[ -f $Narg ]] |
---|
738 | |
---|
739 | else |
---|
740 | # Since -N was not specified, -n must have been. |
---|
741 | # Check the node names file parameter and create our own copy. |
---|
742 | checkUserFile $narg $inputNodes |
---|
743 | [[ $? -ne 0 ]] && cleanupAndExit |
---|
744 | fi # end of if [[ -n $Narg ]] |
---|
745 | |
---|
746 | # Make sure that at least one node is designated as quorum, |
---|
747 | # and count the number of quorum nodes. |
---|
748 | # If there are more than 7 quorum nodes, issue a warning; |
---|
749 | # If there are more than 128 quorum nodes, issue an error and quit. |
---|
750 | if [[ $clusterType = lc ]] |
---|
751 | then |
---|
752 | quorumNodeCount=$($awk -F: ' \ |
---|
753 | BEGIN { nqnodes = 0 } \ |
---|
754 | $1 ~ /^#/ || NF <= 1 { next } \ |
---|
755 | $2 ~ "quorum" && $2 !~ "nonquorum" { \ |
---|
756 | { nqnodes += 1 } \ |
---|
757 | } \ |
---|
758 | END { print nqnodes } \ |
---|
759 | ' $inputNodes) |
---|
760 | |
---|
761 | if [[ $quorumNodeCount -eq 0 ]] |
---|
762 | then |
---|
763 | # At least one quorum node must be defined. |
---|
764 | printErrorMsg 53 $mmcmd |
---|
765 | cleanupAndExit |
---|
766 | fi |
---|
767 | |
---|
768 | if [[ $quorumNodeCount -gt $maxQuorumNodes ]] |
---|
769 | then |
---|
770 | # Error: The number of quorum nodes exceeds the maximum allowed. |
---|
771 | printErrorMsg 393 $mmcmd $maxQuorumNodes |
---|
772 | cleanupAndExit |
---|
773 | fi |
---|
774 | |
---|
775 | if [[ $quorumNodeCount -gt $maxRecQuorumNodes ]] |
---|
776 | then |
---|
777 | # Warning: The number of quorum nodes exceeds the recommended maximum. |
---|
778 | printErrorMsg 394 $mmcmd $maxRecQuorumNodes |
---|
779 | fi |
---|
780 | fi # end of if [[ $clusterType = lc ]] |
---|
781 | |
---|
782 | |
---|
783 | ################################################### |
---|
784 | # Process the optional remote commands parameters. |
---|
785 | ################################################### |
---|
786 | if [[ -n $rarg ]] |
---|
787 | then |
---|
788 | if [[ ! -x $rarg ]] |
---|
789 | then |
---|
790 | # Path is not an executable. |
---|
791 | printErrorMsg 422 $mmcmd ${rarg%% *} |
---|
792 | cleanupAndExit |
---|
793 | fi |
---|
794 | rshPath="$rarg" |
---|
795 | rsh="$rshPath" |
---|
796 | export GPFS_rshPath="$rshPath" |
---|
797 | else |
---|
798 | rshPath="_DEFAULT_" |
---|
799 | fi |
---|
800 | |
---|
801 | if [[ -n $Rarg ]] |
---|
802 | then |
---|
803 | if [[ ! -x $Rarg ]] |
---|
804 | then |
---|
805 | # Path is not an executable. |
---|
806 | printErrorMsg 423 $mmcmd ${Rarg%% *} |
---|
807 | cleanupAndExit |
---|
808 | fi |
---|
809 | rcpPath="$Rarg" |
---|
810 | rcp="$rcpPath" |
---|
811 | export GPFS_rcpPath="$rcpPath" |
---|
812 | else |
---|
813 | rcpPath="_DEFAULT_" |
---|
814 | fi |
---|
815 | |
---|
816 | |
---|
817 | ################################################# |
---|
818 | # Check the optional -c ConfigFile parameter. |
---|
819 | ################################################# |
---|
820 | if [[ -n $carg && ( ! -f $carg || ! -r $carg ) ]] |
---|
821 | then |
---|
822 | # Can't read the file. |
---|
823 | printErrorMsg 43 $mmcmd $carg |
---|
824 | cleanupAndExit |
---|
825 | fi |
---|
826 | |
---|
827 | |
---|
828 | #################################################### |
---|
829 | # Fail the command if an sdrfs file already exists. |
---|
830 | # This should never happen, as mmcrcluster should |
---|
831 | # only be run once before the sdrfs file exists. |
---|
832 | #################################################### |
---|
833 | if [[ -f $mmsdrfsFile ]] |
---|
834 | then |
---|
835 | printErrorMsg 348 $mmcmd $($hostname) |
---|
836 | cleanupAndExit |
---|
837 | fi |
---|
838 | |
---|
839 | |
---|
840 | ################################## |
---|
841 | # Set up trap exception handling. |
---|
842 | ################################## |
---|
843 | trap pretrap2 HUP INT QUIT KILL |
---|
844 | |
---|
845 | |
---|
846 | ####################################################### |
---|
847 | # Determine the lookup order for resolving host names. |
---|
848 | ####################################################### |
---|
849 | [[ $osName != AIX ]] && resolveOrder=$(setHostResolveOrder) |
---|
850 | |
---|
851 | |
---|
852 | ######################################## |
---|
853 | # Process the primary server parameter. |
---|
854 | ######################################## |
---|
855 | # Find the name and IP address of the primary server. |
---|
856 | hostResult=$($host $parg) |
---|
857 | set -f ; set -- $hostResult ; set +f |
---|
858 | primaryServer=$1 |
---|
859 | primaryIPaddr=${3%%,*} # Exclude everything after the first comma. |
---|
860 | if [[ -z $primaryIPaddr ]] |
---|
861 | then |
---|
862 | # Invalid node name specified. |
---|
863 | printErrorMsg 54 $mmcmd $parg |
---|
864 | cleanupAndExit |
---|
865 | fi |
---|
866 | |
---|
867 | |
---|
868 | ##################################################### |
---|
869 | # Process the backup server parameter, if specified. |
---|
870 | ##################################################### |
---|
871 | if [[ -n $sarg ]] |
---|
872 | then |
---|
873 | # Find the name and IP address of the secondary server. |
---|
874 | hostResult=$($host $sarg) |
---|
875 | set -f ; set -- $hostResult ; set +f |
---|
876 | backupServer=$1 |
---|
877 | backupIPaddr=${3%%,*} # Exclude everything after the first comma. |
---|
878 | if [[ -z $backupIPaddr ]] |
---|
879 | then |
---|
880 | # An invalid node name was specified. |
---|
881 | printErrorMsg 54 $mmcmd $sarg |
---|
882 | cleanupAndExit |
---|
883 | fi |
---|
884 | |
---|
885 | # Verify that the two servers are different. |
---|
886 | if [[ $primaryServer = $backupServer ]] |
---|
887 | then |
---|
888 | printErrorMsg 346 $mmcmd $primaryServer |
---|
889 | cleanupAndExit |
---|
890 | fi |
---|
891 | else |
---|
892 | backupServer="_NOSECONDARY_" |
---|
893 | fi # end of if [[ -n $sarg ]] |
---|
894 | |
---|
895 | |
---|
896 | ###################################### |
---|
897 | # Process the cluster name parameter. |
---|
898 | ###################################### |
---|
899 | if [[ -z $Carg || $Carg = "." ]] |
---|
900 | then |
---|
901 | clusterName=$primaryServer |
---|
902 | else |
---|
903 | if [[ $Carg = *.* ]] |
---|
904 | then |
---|
905 | clusterName=$Carg |
---|
906 | else |
---|
907 | clusterName=${Carg}.${primaryServer#*.} |
---|
908 | fi |
---|
909 | fi |
---|
910 | |
---|
911 | |
---|
912 | ########################################## |
---|
913 | # Generate a unique cluster identifier. |
---|
914 | ########################################## |
---|
915 | clusterId=$($mmcrclusterid $primaryIPaddr) |
---|
916 | |
---|
917 | # Create the overloaded clType and clusterIdAndSt parameters |
---|
918 | # that will be passed to the checkNewClusterNode routine. |
---|
919 | if [[ $clusterType = $environmentType ]] |
---|
920 | then |
---|
921 | clType=$clusterType |
---|
922 | else |
---|
923 | clType="${clusterType}/${environmentType}" |
---|
924 | fi |
---|
925 | clusterIdAndSt="${clusterId}:${clusterSubtype}" |
---|
926 | |
---|
927 | |
---|
928 | ###################################################################### |
---|
929 | # Generate the node information for the mmsdrfs file. |
---|
930 | # |
---|
931 | # Loop through the nodes to be added to the sdrfs file, checking |
---|
932 | # as we go. When the loop is done we know which nodes can be added |
---|
933 | # to the sdrfs file, which ones can't, and whether the primary and |
---|
934 | # backup servers belong to the cluster. A MEMBER_NODE line will be |
---|
935 | # generated for each node that can be added to the new GPFS cluster. |
---|
936 | ###################################################################### |
---|
937 | $rm -f $tmpsdrfs $goodnodes $processedNodes |
---|
938 | $touch $tmpsdrfs $goodnodes $processedNodes |
---|
939 | exec 3<&- |
---|
940 | exec 3< $inputNodes |
---|
941 | while read -u3 nodeDesc |
---|
942 | do |
---|
943 | # Skip empty and comment lines. |
---|
944 | [[ $nodeDesc = *([$BLANKchar$TABchar]) ]] && continue |
---|
945 | [[ $nodeDesc = *([$BLANKchar$TABchar])#* ]] && continue |
---|
946 | |
---|
947 | # Keep track of the total number of nodes specified by the user. |
---|
948 | totalNodeCount=$totalNodeCount+1 |
---|
949 | |
---|
950 | # Parse the node descriptor. |
---|
951 | IFS=':' |
---|
952 | set -f ; set -- $nodeDesc ; set +f |
---|
953 | nodeName=$1 |
---|
954 | nodeRoles=$2 |
---|
955 | nodeName2=$3 |
---|
956 | IFS="$IFS_sv" |
---|
957 | |
---|
958 | # Assume default values for the node role fields. |
---|
959 | designation=$CLIENT |
---|
960 | quorumField=$quorumDefault |
---|
961 | |
---|
962 | # Process the node roles list. |
---|
963 | if [[ -n $nodeRoles ]] |
---|
964 | then |
---|
965 | IFS="-" |
---|
966 | set -f ; set -- $nodeRoles ; set +f |
---|
967 | IFS="$IFS_sv" |
---|
968 | while [[ -n $1 ]] |
---|
969 | do |
---|
970 | role=$1 # Convert the node's role to lower case only. |
---|
971 | case $role in |
---|
972 | |
---|
973 | $CLIENT ) |
---|
974 | designation=$CLIENT |
---|
975 | ;; |
---|
976 | |
---|
977 | $MANAGER ) |
---|
978 | designation=$MANAGER |
---|
979 | ;; |
---|
980 | |
---|
981 | $QUORUM ) |
---|
982 | quorumField=$quorumNode |
---|
983 | ;; |
---|
984 | |
---|
985 | $NONQUORUM ) |
---|
986 | quorumField=$nonQuorumNode |
---|
987 | ;; |
---|
988 | |
---|
989 | * ) # Invalid node designations specified. |
---|
990 | printErrorMsg 293 $mmcmd "$nodeDesc" |
---|
991 | fatalError=yes |
---|
992 | break 2 |
---|
993 | ;; |
---|
994 | esac |
---|
995 | |
---|
996 | # Move to the next field. |
---|
997 | shift |
---|
998 | done # end while [[ -n $1 ]] |
---|
999 | fi # end if [[ -n $nodeRoles ]] |
---|
1000 | |
---|
1001 | # At this point, nodeName can be any one of the following: |
---|
1002 | # a fully-qualified adapter port name, a short name, or an IP address. |
---|
1003 | # Determine the values for all three. We will designate the fully |
---|
1004 | # qualified hostname as the reliable hostname for the node. |
---|
1005 | hostResult=$($host $nodeName) |
---|
1006 | set -f ; set -- $hostResult ; set +f |
---|
1007 | daemonNodeName=$1 |
---|
1008 | shortName=${1%% *|.*} # Exclude everything after the first dot. |
---|
1009 | ipa=${3%%,*} # Exclude everything after the first comma. |
---|
1010 | if [[ -z $ipa ]] |
---|
1011 | then |
---|
1012 | # An invalid node name was specified. |
---|
1013 | printErrorMsg 54 $mmcmd $nodeName |
---|
1014 | fatalError=yes |
---|
1015 | break |
---|
1016 | fi |
---|
1017 | |
---|
1018 | # At this point, if it was specified, nodeName2 could be a |
---|
1019 | # fully-qualified adapter port name, a short name, or an IP address. |
---|
1020 | # Convert it to a fully-qualified node name in case it is not one already. |
---|
1021 | if [[ -n $nodeName2 ]] |
---|
1022 | then |
---|
1023 | hostResult=$($host $nodeName2) |
---|
1024 | set -f ; set -- $hostResult ; set +f |
---|
1025 | adminNodeName=$1 |
---|
1026 | adminShortName=${1%% *|.*} # Exclude everything after the first dot. |
---|
1027 | adminIpa=${3%%,*} # Exclude everything after the first comma. |
---|
1028 | if [[ -z $adminIpa ]] |
---|
1029 | then |
---|
1030 | # An invalid admin node name was specified. |
---|
1031 | printErrorMsg 54 $mmcmd $nodeName2 |
---|
1032 | fatalError=yes |
---|
1033 | break |
---|
1034 | fi |
---|
1035 | else |
---|
1036 | # The user did not set a distinct admin node name, so set the |
---|
1037 | # admin node names to be the same as the daemon node names. |
---|
1038 | adminNodeName=$daemonNodeName |
---|
1039 | adminShortName=$shortName |
---|
1040 | fi |
---|
1041 | |
---|
1042 | # Make sure neither node name (admin or daemon) is specified more than once. |
---|
1043 | $grep -qw $daemonNodeName $processedNodes > /dev/null 2>&1 |
---|
1044 | if [[ $? -eq 0 ]] |
---|
1045 | then |
---|
1046 | # The node is specified twice. |
---|
1047 | printErrorMsg 347 $mmcmd $nodeName |
---|
1048 | fatalError=yes |
---|
1049 | break |
---|
1050 | fi |
---|
1051 | if [[ $adminNodeName != $daemonNodeName ]] |
---|
1052 | then |
---|
1053 | $grep -qw $adminNodeName $processedNodes > /dev/null 2>&1 |
---|
1054 | if [[ $? -eq 0 ]] |
---|
1055 | then |
---|
1056 | # The node is specified twice. |
---|
1057 | printErrorMsg 347 $mmcmd $nodeName2 |
---|
1058 | fatalError=yes |
---|
1059 | break |
---|
1060 | fi |
---|
1061 | fi |
---|
1062 | |
---|
1063 | # Assign a node number to the node. |
---|
1064 | nodeNumber=$nodeNumber+1 |
---|
1065 | gsNodeNumber=$nodeNumber |
---|
1066 | adapterType="" |
---|
1067 | |
---|
1068 | if [[ $environmentType = single ]] |
---|
1069 | then |
---|
1070 | adapterType="lo" |
---|
1071 | if [[ $nodeNumber -gt 1 ]] |
---|
1072 | then |
---|
1073 | # Invalid node name specified. |
---|
1074 | printErrorMsg 54 $mmcmd $nodeName |
---|
1075 | fatalError=yes |
---|
1076 | break |
---|
1077 | fi |
---|
1078 | fi # end of if [[ $environmentType = single ]] |
---|
1079 | |
---|
1080 | # Add the daemon and admin node names to the list of processed nodes. |
---|
1081 | print -- "${daemonNodeName}:${adminNodeName}" >> $processedNodes |
---|
1082 | checkForErrorsAndReturn "writing to file $processedNodes" $? |
---|
1083 | |
---|
1084 | # Build a line with the local node data for the node. The full-blown |
---|
1085 | # MEMBER_NODE line will be created further down when we have all of the |
---|
1086 | # information that we need. |
---|
1087 | sdrfsLine="$nodesetId:$MEMBER_NODE::0:$nodeNumber:$shortName:$ipa" |
---|
1088 | sdrfsLine="$sdrfsLine:$adminNodeName:$designation:$adapterType:$lapiWindow" |
---|
1089 | sdrfsLine="$sdrfsLine:$switchNumber:$OLD_NODE:$adapterType:$daemonNodeName" |
---|
1090 | sdrfsLine="$sdrfsLine:$adminShortName::::$quorumField:$gsNodeNumber:" |
---|
1091 | |
---|
1092 | # Invoke the checkNewClusterNode function to assure that the |
---|
1093 | # node is new and that its level of GPFS supports clusters. |
---|
1094 | # If it passes these tests, a skeleton sdrfs file is stored on the node. |
---|
1095 | printInfoMsg 416 "$(date)" $mmcmd $daemonNodeName |
---|
1096 | runOutput=$(run on1 $adminNodeName checkNewClusterNode \ |
---|
1097 | $clType $primaryServer $backupServer "$sdrfsLine" \ |
---|
1098 | "$rshPath" "$rcpPath" "$clusterIdAndSt" 2> $errMsg) |
---|
1099 | rc=$? |
---|
1100 | IFS=':' |
---|
1101 | set -f ; set -- $runOutput ; set +f |
---|
1102 | IFS="$IFS_sv" |
---|
1103 | keyword=$1 |
---|
1104 | nodeStatus=$2 |
---|
1105 | adapterType=$3 |
---|
1106 | installedDaemonVersion=$4 |
---|
1107 | installedProductVersion=$5 |
---|
1108 | installedOsName=$6 |
---|
1109 | |
---|
1110 | if [[ $rc = 0 && $nodeStatus = success && $keyword = checkNewClusterNode ]] |
---|
1111 | then |
---|
1112 | # The checkNewClusterNode call succeeded. |
---|
1113 | # Build the line that will represent this node in the mmsdrfs file. |
---|
1114 | nodeCount=$nodeCount+1 |
---|
1115 | sdrfsLine="$nodesetId:$MEMBER_NODE::$nodeCount:$nodeNumber:$shortName:$ipa" |
---|
1116 | sdrfsLine="$sdrfsLine:$adminNodeName:$designation:$adapterType:$lapiWindow" |
---|
1117 | sdrfsLine="$sdrfsLine:$switchNumber:$OLD_NODE:$adapterType:$daemonNodeName" |
---|
1118 | sdrfsLine="$sdrfsLine:$adminShortName:$installedDaemonVersion:$installedProductVersion" |
---|
1119 | sdrfsLine="$sdrfsLine:$installedOsName:$quorumField:$gsNodeNumber:" |
---|
1120 | |
---|
1121 | # Add the MEMBER_NODE line to the other lines |
---|
1122 | # that will go in the mmsdrfs file. |
---|
1123 | print -- "$sdrfsLine" >> $tmpsdrfs |
---|
1124 | checkForErrorsAndReturn "Writing to file $tmpsdrfs" $? |
---|
1125 | [[ $? -ne 0 ]] && break |
---|
1126 | |
---|
1127 | # Add the node name to the list of successful nodes. |
---|
1128 | print -- "$adminNodeName" >> $goodnodes |
---|
1129 | checkForErrorsAndReturn "Writing to file $goodnodes" $? |
---|
1130 | [[ $? -ne 0 ]] && break |
---|
1131 | |
---|
1132 | # If this node is one of the server nodes, set a flag to indicate that |
---|
1133 | # the server was found, and set the server name to the admin node name. |
---|
1134 | if [[ $adminNodeName = $primaryServer || |
---|
1135 | $daemonNodeName = $primaryServer ]] |
---|
1136 | then |
---|
1137 | primaryServer=$adminNodeName |
---|
1138 | primaryInCluster=yes |
---|
1139 | fi |
---|
1140 | if [[ $adminNodeName = $backupServer || |
---|
1141 | $daemonNodeName = $backupServer ]] |
---|
1142 | then |
---|
1143 | backupServer=$adminNodeName |
---|
1144 | backupInCluster=yes |
---|
1145 | fi |
---|
1146 | |
---|
1147 | # Is this a quorum node? |
---|
1148 | [[ $quorumField != $nonQuorumNode ]] && \ |
---|
1149 | quorumNodeCount=$quorumNodeCount+1 |
---|
1150 | |
---|
1151 | # Keep track of the daemon version and os installed. |
---|
1152 | [[ $installedDaemonVersion -lt $lowestVersion ]] && \ |
---|
1153 | lowestVersion=$installedDaemonVersion |
---|
1154 | [[ $installedDaemonVersion -gt $highestVersion ]] && \ |
---|
1155 | highestVersion=$installedDaemonVersion |
---|
1156 | [[ -n $installedOsName && $installedOsName != $osEnvironment ]] && \ |
---|
1157 | osEnvironment="mixed" |
---|
1158 | |
---|
1159 | else |
---|
1160 | # The checkNewClusterNode call failed. |
---|
1161 | # Not all errors are considered terminal. |
---|
1162 | # If an individual node fails for a known reason, |
---|
1163 | # we will not include it in the cluster but will |
---|
1164 | # continue with the rest of the nodes. |
---|
1165 | |
---|
1166 | # Tell the world what went wrong. |
---|
1167 | if [[ $nodeStatus = not_new ]] |
---|
1168 | then |
---|
1169 | # The node already belongs to a cluster. |
---|
1170 | printErrorMsg 348 $mmcmd $adminNodeName |
---|
1171 | elif [[ $nodeStatus = not_supported ]] |
---|
1172 | then |
---|
1173 | # Wrong GPFS code level. |
---|
1174 | printErrorMsg 349 $mmcmd $adminNodeName |
---|
1175 | elif [[ $nodeStatus = ipa_alias ]] |
---|
1176 | then |
---|
1177 | # IP address aliasing is not supported. |
---|
1178 | printErrorMsg 476 $mmcmd $nodeName |
---|
1179 | elif [[ $nodeStatus = ipa_missing ]] |
---|
1180 | then |
---|
1181 | # The daemon node adapter was not found on the admin node. |
---|
1182 | printErrorMsg 175 $mmcmd $nodeName $nodeName2 |
---|
1183 | elif [[ $rc = $MM_HostDown || $rc = $MM_ConnectTimeout ]] |
---|
1184 | then |
---|
1185 | # The node cannot be reached. |
---|
1186 | printErrorMsg 340 $mmcmd $adminNodeName |
---|
1187 | else |
---|
1188 | # Unexpected error. Display error messages. |
---|
1189 | [[ -s $errMsg ]] && $cat $errMsg 1>&2 |
---|
1190 | [[ $rc -eq 0 ]] && rc=1 |
---|
1191 | checkForErrorsAndReturn "checkNewClusterNode $adminNodeName" $rc |
---|
1192 | run on1 $adminNodeName removeFromCluster > /dev/null 2>&1 & |
---|
1193 | # break |
---|
1194 | fi |
---|
1195 | |
---|
1196 | # If any of the server nodes fails, give up. |
---|
1197 | if [[ $adminNodeName = $primaryServer || $adminNodeName = $backupServer ]] |
---|
1198 | then |
---|
1199 | fatalError=yes |
---|
1200 | break |
---|
1201 | fi |
---|
1202 | |
---|
1203 | # Append the node name to the list of failed nodes. |
---|
1204 | failedNodes="$failedNodes\n\t\t$adminNodeName" |
---|
1205 | |
---|
1206 | # Adjust the node number for the next iteration. |
---|
1207 | nodeNumber=$nodeNumber-1 |
---|
1208 | |
---|
1209 | fi # end of if [[ $rc = 0 && $nodeStatus = success ]] |
---|
1210 | |
---|
1211 | $rm -f $errMsg |
---|
1212 | |
---|
1213 | done # end of while read -u3 nodeDesc (Loop through the nodes to be added) |
---|
1214 | |
---|
1215 | |
---|
1216 | ##################################################### |
---|
1217 | # There is no point continuing if not even one node |
---|
1218 | # will be added to the cluster. |
---|
1219 | ##################################################### |
---|
1220 | if [[ $totalNodeCount -eq 0 ]] |
---|
1221 | then |
---|
1222 | # The user provided input file appears to be empty. |
---|
1223 | # Note that we can have either -N or -n specified but not both. |
---|
1224 | printErrorMsg 329 $mmcmd $Narg $narg |
---|
1225 | cleanupAndExit |
---|
1226 | fi |
---|
1227 | |
---|
1228 | if [[ ! -s $goodnodes ]] |
---|
1229 | then |
---|
1230 | # The command failed. |
---|
1231 | printErrorMsg 389 $mmcmd |
---|
1232 | cleanupAndExit |
---|
1233 | fi |
---|
1234 | |
---|
1235 | |
---|
1236 | ###################################################### |
---|
1237 | # If no severe errors were detected so far, |
---|
1238 | # ensure certain other requirements are met as well. |
---|
1239 | ###################################################### |
---|
1240 | if [[ -z $fatalError ]] |
---|
1241 | then |
---|
1242 | # Ensure that the server nodes are members of the cluster |
---|
1243 | # and were successfully initialized (checkNewClusterNode). |
---|
1244 | if [[ -z $primaryInCluster ]] |
---|
1245 | then |
---|
1246 | printErrorMsg 352 $mmcmd "$primaryServer" |
---|
1247 | fatalError=yes |
---|
1248 | fi |
---|
1249 | if [[ -z $backupInCluster && $backupServer != "_NOSECONDARY_" ]] |
---|
1250 | then |
---|
1251 | printErrorMsg 352 $mmcmd "$backupServer" |
---|
1252 | fatalError=yes |
---|
1253 | fi |
---|
1254 | |
---|
1255 | # Ensure that there is at least one quorum node in the cluster. |
---|
1256 | if [[ $quorumNodeCount -eq 0 ]] |
---|
1257 | then |
---|
1258 | printErrorMsg 53 $mmcmd |
---|
1259 | fatalError=yes |
---|
1260 | fi |
---|
1261 | |
---|
1262 | # Ensure the node on which mmcrcluster runs (this node) is |
---|
1263 | # going to be a member of the cluster. |
---|
1264 | if [[ ! -f $mmfsNodeData ]] |
---|
1265 | then |
---|
1266 | # Run the command from a node that is part of the cluster. |
---|
1267 | printErrorMsg 322 $mmcmd |
---|
1268 | fatalError=yes |
---|
1269 | fi |
---|
1270 | fi # end of if [[ -z $fatalError ]] |
---|
1271 | |
---|
1272 | |
---|
1273 | ######################################################### |
---|
1274 | # If no severe errors were detected so far, |
---|
1275 | # build the new mmsdrfs file. |
---|
1276 | ######################################################### |
---|
1277 | if [[ -z $fatalError ]] |
---|
1278 | then |
---|
1279 | #------------------------------------------------- |
---|
1280 | # Create a mmsdrfs file with gen number 2 since |
---|
1281 | # the nodes already have files with gen number 1. |
---|
1282 | #------------------------------------------------- |
---|
1283 | # Create the version line. |
---|
1284 | newGenNumber=2 # gen number 2, since the nodes already have gen number 1 |
---|
1285 | [[ $backupServer = "_NOSECONDARY_" ]] && backupServer="" |
---|
1286 | [[ $rshPath = "_DEFAULT_" ]] && rshPath="" |
---|
1287 | [[ $rcpPath = "_DEFAULT_" ]] && rcpPath="" |
---|
1288 | timeStamp=$($perl -e 'print time') |
---|
1289 | sdrfsLine="$GLOBAL_ID:$VERSION_LINE::$CURRENT_SDRFS_FORMAT:$CURRENT_SDRFS_VERSION" |
---|
1290 | sdrfsLine="$sdrfsLine:$newGenNumber::$MMMODE:$primaryServer:$backupServer" |
---|
1291 | sdrfsLine="$sdrfsLine::$rshPath:$rcpPath:$clusterId:$clusterSubtype" |
---|
1292 | sdrfsLine="$sdrfsLine:$timeStamp:$availableField:$clusterName" |
---|
1293 | sdrfsLine="$sdrfsLine:$newKeyGenNumber:$secLevel:$committedKeyGenNumber" |
---|
1294 | sdrfsLine="$sdrfsLine:$keyfileFormatLevel:" |
---|
1295 | print -- "$sdrfsLine" > $newsdrfs |
---|
1296 | |
---|
1297 | # Add threatening comment lines - DO NOT MESS WITH THIS FILE |
---|
1298 | sdrfsLine="$GLOBAL_ID:$COMMENT_LINE::1:" |
---|
1299 | print -- "$sdrfsLine" >> $newsdrfs |
---|
1300 | sdrfsLine="$GLOBAL_ID:$COMMENT_LINE::2:$warningText" |
---|
1301 | print -- "$sdrfsLine" >> $newsdrfs |
---|
1302 | sdrfsLine="$GLOBAL_ID:$COMMENT_LINE::3:" |
---|
1303 | print -- "$sdrfsLine" >> $newsdrfs |
---|
1304 | |
---|
1305 | # Add a header line for the nodeset. |
---|
1306 | sdrfsLine="$nodesetId:$NODESET_HDR:::$nodeCount:$commProtocol:$cipherList" |
---|
1307 | sdrfsLine="$sdrfsLine:$tcpPort:$obsoleteField:$obsoleteField:$availableField" |
---|
1308 | sdrfsLine="$sdrfsLine:$lowestVersion:$highestVersion:$osEnvironment" |
---|
1309 | sdrfsLine="$sdrfsLine:$availableField:$eventsPort:$mmsdrservPort:" |
---|
1310 | print -- "$sdrfsLine" >> $newsdrfs |
---|
1311 | checkForErrors "writing to file $newsdrfs" $? |
---|
1312 | |
---|
1313 | # Copy the lines describing the individual nodes. |
---|
1314 | $cat $tmpsdrfs >> $newsdrfs |
---|
1315 | checkForErrorsAndReturn "Writing to file $newsdrfs" $? |
---|
1316 | |
---|
1317 | #-------------------------- |
---|
1318 | # Build the mmfs.cfg file. |
---|
1319 | #-------------------------- |
---|
1320 | # Start the mmfs.cfg file with the warning text. |
---|
1321 | print -- "# " > $newcfg |
---|
1322 | print -- "# WARNING: This is a machine generated file. Do not edit! " >> $newcfg |
---|
1323 | print -- "# Use the mmchconfig command to change configuration parameters. " >> $newcfg |
---|
1324 | print -- "# " >> $newcfg |
---|
1325 | |
---|
1326 | # The following parameters are always specified |
---|
1327 | # regardless of any value already existing in the config file. |
---|
1328 | print -- "clusterName $clusterName" >> $newcfg |
---|
1329 | print -- "clusterId $clusterId" >> $newcfg |
---|
1330 | print -- "clusterType $MMMODE" >> $newcfg |
---|
1331 | print -- "autoload $Aarg" >> $newcfg |
---|
1332 | [[ $MMMODE = lc ]] && print -- "useDiskLease yes" >> $newcfg |
---|
1333 | [[ -n $Uarg ]] && print -- "uidDomain $Uarg" >> $newcfg |
---|
1334 | [[ -z $lowestVersion ]] && lowestVersion="$initialDaemonVersion" |
---|
1335 | print -- "maxFeatureLevelAllowed $lowestVersion" >> $newcfg |
---|
1336 | checkForErrorsAndReturn "Writing to file $newcfg" $? |
---|
1337 | |
---|
1338 | # If a configuration file is specified (-c option), |
---|
1339 | # verify its correctness and append it to our mmfs.cfg file. |
---|
1340 | if [[ -n $carg ]] |
---|
1341 | then |
---|
1342 | processUserConfigFile $carg $tmpCfg |
---|
1343 | if [[ -s $tmpCfg ]] |
---|
1344 | then |
---|
1345 | $cat $tmpCfg >> $newcfg |
---|
1346 | checkForErrorsAndReturn "cat $tmpCfg >> $newcfg" $? |
---|
1347 | fi |
---|
1348 | fi |
---|
1349 | |
---|
1350 | #-------------------------------------------- |
---|
1351 | # Add the mmfs.cfg data to the mmsdrfs file. |
---|
1352 | #-------------------------------------------- |
---|
1353 | appendCfgFile $nodesetId $newcfg $newsdrfs |
---|
1354 | checkForErrorsAndReturn "appendCfgFile" $? |
---|
1355 | |
---|
1356 | #-------------------------------------------- |
---|
1357 | # Sort the new version of the mmsdrfs file. |
---|
1358 | #-------------------------------------------- |
---|
1359 | LC_ALL=C $SORT_MMSDRFS $newsdrfs -o $newsdrfs |
---|
1360 | checkForErrorsAndReturn "Sorting $newsdrfs" $? |
---|
1361 | |
---|
1362 | fi # end of if [[ -z $fatalError ]] |
---|
1363 | |
---|
1364 | |
---|
1365 | ############################################################ |
---|
1366 | # If anything failed, remove the skeleton sdrfs files from |
---|
1367 | # the non-server nodes, issue an error message, and die. |
---|
1368 | ############################################################ |
---|
1369 | if [[ -n $fatalError ]] |
---|
1370 | then |
---|
1371 | # Remove already-installed system files. |
---|
1372 | printErrorMsg 351 $mmcmd |
---|
1373 | $ln $goodnodes ${goodnodes}async |
---|
1374 | $mmcommon onall_async ${goodnodes}async removeFromClusterCR & |
---|
1375 | |
---|
1376 | # The command failed. |
---|
1377 | printErrorMsg 389 $mmcmd |
---|
1378 | cleanupAndExit |
---|
1379 | fi |
---|
1380 | |
---|
1381 | |
---|
1382 | ################################################################## |
---|
1383 | # Put the new mmsdrfs file on the primary and secondary servers. |
---|
1384 | ################################################################## |
---|
1385 | # Set some values that are expected by commitChanges. |
---|
1386 | getLocalNodeData |
---|
1387 | nsId=0 |
---|
1388 | gpfsObjectInfo="0:1:" |
---|
1389 | |
---|
1390 | # Commit the changes. |
---|
1391 | trap "" HUP INT QUIT KILL |
---|
1392 | gpfsObjectInfo=$(commitChanges \ |
---|
1393 | $nsId $nsId $gpfsObjectInfo $newGenNumber $newsdrfs \ |
---|
1394 | $primaryServer FORCE $backupServer) |
---|
1395 | rc=$? |
---|
1396 | if [[ $rc -ne 0 ]] |
---|
1397 | then |
---|
1398 | # We cannot replace the file in the sdr. |
---|
1399 | printErrorMsg 381 $mmcmd |
---|
1400 | |
---|
1401 | # Remove already-installed system files. |
---|
1402 | printErrorMsg 351 $mmcmd |
---|
1403 | $ln $goodnodes ${goodnodes}async |
---|
1404 | $mmcommon onall_async ${goodnodes}async removeFromClusterCR & |
---|
1405 | cleanupAndExit |
---|
1406 | fi |
---|
1407 | |
---|
1408 | # Restore interrupts. |
---|
1409 | trap posttrap HUP INT QUIT KILL |
---|
1410 | |
---|
1411 | |
---|
1412 | ####################################################################### |
---|
1413 | # At this point, skeleton sdrfs files have been put on the non-server |
---|
1414 | # nodes in the success list and the real sdrfs file containing the |
---|
1415 | # nodes from the cluster has been created and put on the server nodes. |
---|
1416 | # If there are any nodes in the failure list, we issue a message |
---|
1417 | # telling the user to use the mmaddnode command to add them to the |
---|
1418 | # sdrfs file once they become reachable. |
---|
1419 | ####################################################################### |
---|
1420 | # Report any nodes that could not be added. |
---|
1421 | [[ -n $failedNodes ]] && \ |
---|
1422 | printErrorMsg 353 $mmcmd "$failedNodes" |
---|
1423 | |
---|
1424 | # If not all of the nodes were added to the cluster, |
---|
1425 | # tell the user how many made it through. |
---|
1426 | [[ $nodeCount -lt $totalNodeCount ]] && \ |
---|
1427 | printErrorMsg 12 $mmcmd $nodeCount $totalNodeCount |
---|
1428 | |
---|
1429 | # Issue "command was successful" message. |
---|
1430 | printErrorMsg 272 $mmcmd |
---|
1431 | |
---|
1432 | |
---|
1433 | ####################################################################### |
---|
1434 | # Update the mmsdrfs file on all nodes that were successfully added |
---|
1435 | # to the GPFS cluster. This process is asynchronous. |
---|
1436 | ####################################################################### |
---|
1437 | propagateSdrfsFile async $goodnodes $newsdrfs $newGenNumber |
---|
1438 | |
---|
1439 | cleanupAndExit $rc |
---|
1440 | |
---|