<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="generator" content="Asciidoctor 2.0.10"> <meta name="author" content="Perforce Professional Services"> <title>SDP Legacy Upgrade Guide (for Unix)</title> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"> <style> /* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ /* Uncomment @import statement to use as custom stylesheet */ /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} audio,video{display:inline-block} audio:not([controls]){display:none;height:0} html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} a{background:none} a:focus{outline:thin dotted} a:active,a:hover{outline:0} h1{font-size:2em;margin:.67em 0} abbr[title]{border-bottom:1px dotted} b,strong{font-weight:bold} dfn{font-style:italic} hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} mark{background:#ff0;color:#000} code,kbd,pre,samp{font-family:monospace;font-size:1em} pre{white-space:pre-wrap} q{quotes:"\201C" "\201D" "\2018" "\2019"} small{font-size:80%} sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} sup{top:-.5em} sub{bottom:-.25em} img{border:0} svg:not(:root){overflow:hidden} figure{margin:0} fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} legend{border:0;padding:0} button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} button,input{line-height:normal} button,select{text-transform:none} button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} button[disabled],html input[disabled]{cursor:default} input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} textarea{overflow:auto;vertical-align:top} table{border-collapse:collapse;border-spacing:0} *,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} html,body{font-size:100%} body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} a:hover{cursor:pointer} img,object,embed{max-width:100%;height:auto} object,embed{height:100%} img{-ms-interpolation-mode:bicubic} .left{float:left!important} .right{float:right!important} .text-left{text-align:left!important} .text-right{text-align:right!important} .text-center{text-align:center!important} .text-justify{text-align:justify!important} .hide{display:none} img,object,svg{display:inline-block;vertical-align:middle} textarea{height:auto;min-height:50px} select{width:100%} .center{margin-left:auto;margin-right:auto} .stretch{width:100%} .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} a{color:#2156a5;text-decoration:underline;line-height:inherit} a:hover,a:focus{color:#1d4b8f} a img{border:0} p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} p aside{font-size:.875em;line-height:1.35;font-style:italic} h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} h1{font-size:2.125em} h2{font-size:1.6875em} h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} h4,h5{font-size:1.125em} h6{font-size:1em} hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} em,i{font-style:italic;line-height:inherit} strong,b{font-weight:bold;line-height:inherit} small{font-size:60%;line-height:inherit} code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} ul,ol{margin-left:1.5em} ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} ul.square{list-style-type:square} ul.circle{list-style-type:circle} ul.disc{list-style-type:disc} ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} dl dt{margin-bottom:.3125em;font-weight:bold} dl dd{margin-bottom:1.25em} abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} abbr{text-transform:none} blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} blockquote cite::before{content:"\2014 \0020"} blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} @media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} h1{font-size:2.75em} h2{font-size:2.3125em} h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} h4{font-size:1.4375em}} table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} table thead,table tfoot{background:#f7f8f7} table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} table tr.even,table tr.alt{background:#f8f8f7} table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} .clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} .clearfix::after,.float-group::after{clear:both} :not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} :not(pre)>code.nobreak{word-wrap:normal} :not(pre)>code.nowrap{white-space:nowrap} pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} pre>code{display:block} pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} em em{font-style:normal} strong strong{font-weight:400} .keyseq{color:rgba(51,51,51,.8)} kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} .keyseq kbd:first-child{margin-left:0} .keyseq kbd:last-child{margin-right:0} .menuseq,.menuref{color:#000} .menuseq b:not(.caret),.menuref{font-weight:inherit} .menuseq{word-spacing:-.02em} .menuseq b.caret{font-size:1.25em;line-height:.8} .menuseq i.caret{font-weight:bold;text-align:center;width:.45em} b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} b.button::before{content:"[";padding:0 3px 0 2px} b.button::after{content:"]";padding:0 2px 0 3px} p a>code:hover{color:rgba(0,0,0,.9)} #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} #header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} #header::after,#content::after,#footnotes::after,#footer::after{clear:both} #content{margin-top:1.25em} #content::before{content:none} #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} #header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} #header .details span:first-child{margin-left:-.125em} #header .details span.email a{color:rgba(0,0,0,.85)} #header .details br{display:none} #header .details br+span::before{content:"\00a0\2013\00a0"} #header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} #header .details br+span#revremark::before{content:"\00a0|\00a0"} #header #revnumber{text-transform:capitalize} #header #revnumber::after{content:"\00a0"} #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} #toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} #toc>ul{margin-left:.125em} #toc ul.sectlevel0>li>a{font-style:italic} #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} #toc li{line-height:1.3334;margin-top:.3334em} #toc a{text-decoration:none} #toc a:active{text-decoration:underline} #toctitle{color:#7a2518;font-size:1.2em} @media screen and (min-width:768px){#toctitle{font-size:1.375em} body.toc2{padding-left:15em;padding-right:0} #toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} #toc.toc2>ul{font-size:.9em;margin-bottom:0} #toc.toc2 ul ul{margin-left:0;padding-left:1em} #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} body.toc2.toc-right{padding-left:0;padding-right:15em} body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} @media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} #toc.toc2{width:20em} #toc.toc2 #toctitle{font-size:1.375em} #toc.toc2>ul{font-size:.95em} #toc.toc2 ul ul{padding-left:1.25em} body.toc2.toc-right{padding-left:0;padding-right:20em}} #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} #content #toc>:first-child{margin-top:0} #content #toc>:last-child{margin-bottom:0} #footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} #footer-text{color:rgba(255,255,255,.8);line-height:1.44} #content{margin-bottom:.625em} .sect1{padding-bottom:.625em} @media screen and (min-width:768px){#content{margin-bottom:1.25em} .sect1{padding-bottom:1.25em}} .sect1:last-child{padding-bottom:0} .sect1+.sect1{border-top:1px solid #e7e7e9} #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} #content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} .paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} .admonitionblock>table td.icon{text-align:center;width:80px} .admonitionblock>table td.icon img{max-width:none} .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} .exampleblock>.content>:first-child{margin-top:0} .exampleblock>.content>:last-child{margin-bottom:0} .sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} .sidebarblock>:first-child{margin-top:0} .sidebarblock>:last-child{margin-bottom:0} .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} .literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} @media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} @media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} .literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} .literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} .listingblock>.content{position:relative} .listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} .listingblock:hover code[data-lang]::before{display:block} .listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} .listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} .listingblock pre.highlightjs{padding:0} .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} .listingblock pre.prettyprint{border-width:0} .prettyprint{background:#f7f7f8} pre.prettyprint .linenums{line-height:1.45;margin-left:2em} pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} pre.prettyprint li code[data-lang]::before{opacity:1} pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} table.linenotable td.code{padding-left:.75em} table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} pre.pygments .lineno::before{content:"";margin-right:-.125em} .quoteblock{margin:0 1em 1.25em 1.5em;display:table} .quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} .quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} .quoteblock blockquote{margin:0;padding:0;border:0} .quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} .quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} .verseblock{margin:0 1em 1.25em} .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} .verseblock pre strong{font-weight:400} .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} .quoteblock .attribution br,.verseblock .attribution br{display:none} .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} .quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} .quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} .quoteblock.abstract{margin:0 1em 1.25em;display:block} .quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} .quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} .quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} .quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} .quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} table.tableblock{max-width:100%;border-collapse:separate} p.tableblock:last-child{margin-bottom:0} td.tableblock>.content>:last-child{margin-bottom:-1.25em} td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0} table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} table.frame-all{border-width:1px} table.frame-sides{border-width:0 1px} table.frame-topbot,table.frame-ends{border-width:1px 0} table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} th.halign-left,td.halign-left{text-align:left} th.halign-right,td.halign-right{text-align:right} th.halign-center,td.halign-center{text-align:center} th.valign-top,td.valign-top{vertical-align:top} th.valign-bottom,td.valign-bottom{vertical-align:bottom} th.valign-middle,td.valign-middle{vertical-align:middle} table thead th,table tfoot th{font-weight:bold} tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} p.tableblock>code:only-child{background:none;padding:0} p.tableblock{font-size:1em} ol{margin-left:1.75em} ul li ol{margin-left:1.5em} dl dd{margin-left:1.125em} dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} ul.unstyled,ol.unstyled{margin-left:0} ul.checklist{margin-left:.625em} ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} ul.inline>li{margin-left:1.25em} .unstyled dl dt{font-weight:400;font-style:normal} ol.arabic{list-style-type:decimal} ol.decimal{list-style-type:decimal-leading-zero} ol.loweralpha{list-style-type:lower-alpha} ol.upperalpha{list-style-type:upper-alpha} ol.lowerroman{list-style-type:lower-roman} ol.upperroman{list-style-type:upper-roman} ol.lowergreek{list-style-type:lower-greek} .hdlist>table,.colist>table{border:0;background:none} .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} td.hdlist1{font-weight:bold;padding-bottom:1.25em} .literalblock+.colist,.listingblock+.colist{margin-top:-.5em} .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} .colist td:not([class]):first-child img{max-width:none} .colist td:not([class]):last-child{padding:.25em 0} .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} .imageblock.left{margin:.25em .625em 1.25em 0} .imageblock.right{margin:.25em 0 1.25em .625em} .imageblock>.title{margin-bottom:0} .imageblock.thumb,.imageblock.th{border-width:6px} .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} .image.left{margin-right:.625em} .image.right{margin-left:.625em} a.image{text-decoration:none;display:inline-block} a.image object{pointer-events:none} sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} sup.footnote a,sup.footnoteref a{text-decoration:none} sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} #footnotes .footnote:last-of-type{margin-bottom:0} #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} .gist .file-data>table td.line-data{width:99%} div.unbreakable{page-break-inside:avoid} .big{font-size:larger} .small{font-size:smaller} .underline{text-decoration:underline} .overline{text-decoration:overline} .line-through{text-decoration:line-through} .aqua{color:#00bfbf} .aqua-background{background:#00fafa} .black{color:#000} .black-background{background:#000} .blue{color:#0000bf} .blue-background{background:#0000fa} .fuchsia{color:#bf00bf} .fuchsia-background{background:#fa00fa} .gray{color:#606060} .gray-background{background:#7d7d7d} .green{color:#006000} .green-background{background:#007d00} .lime{color:#00bf00} .lime-background{background:#00fa00} .maroon{color:#600000} .maroon-background{background:#7d0000} .navy{color:#000060} .navy-background{background:#00007d} .olive{color:#606000} .olive-background{background:#7d7d00} .purple{color:#600060} .purple-background{background:#7d007d} .red{color:#bf0000} .red-background{background:#fa0000} .silver{color:#909090} .silver-background{background:#bcbcbc} .teal{color:#006060} .teal-background{background:#007d7d} .white{color:#bfbfbf} .white-background{background:#fafafa} .yellow{color:#bfbf00} .yellow-background{background:#fafa00} span.icon>.fa{cursor:default} a span.icon>.fa{cursor:inherit} .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} .admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} .admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} .admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} .admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} .admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} .conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} .conum[data-value] *{color:#fff!important} .conum[data-value]+b{display:none} .conum[data-value]::after{content:attr(data-value)} pre .conum[data-value]{position:relative;top:-.125em} b.conum *{color:inherit!important} .conum:not([data-value]):empty{display:none} dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} h1,h2,p,td.content,span.alt{letter-spacing:-.01em} p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} p{margin-bottom:1.25rem} .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} .exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} .print-only{display:none!important} @page{margin:1.25cm .75cm} @media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} html{font-size:80%} a{color:inherit!important;text-decoration:underline!important} a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} abbr[title]::after{content:" (" attr(title) ")"} pre,blockquote,tr,img,object,svg{page-break-inside:avoid} thead{display:table-header-group} svg{max-width:100%} p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} #toc,.sidebarblock,.exampleblock>.content{background:none!important} #toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} body.book #header{text-align:center} body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} body.book #header .details{border:0!important;display:block;padding:0!important} body.book #header .details span:first-child{margin-left:0!important} body.book #header .details br{display:block} body.book #header .details br+span::before{content:none!important} body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} .listingblock code[data-lang]::before{display:block} #footer{padding:0 .9375em} .hide-on-print{display:none!important} .print-only{display:block!important} .hide-for-print{display:none!important} .show-for-print{display:inherit!important}} @media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} .sect1{padding:0!important} .sect1+.sect1{border:0} #footer{background:none} #footer-text{color:rgba(0,0,0,.6);font-size:.9em}} @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} </style> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> </head> <body class="book"> <div id="header"> <h1>SDP Legacy Upgrade Guide (for Unix)</h1> <div class="details"> <span id="author" class="author">Perforce Professional Services</span><br> <span id="email" class="email"><a href="mailto:consulting@perforce.com">consulting@perforce.com</a></span><br> <span id="revnumber">version v2020.1,</span> <span id="revdate">2021-01-20</span> </div> <div id="toc" class="toc"> <div id="toctitle">Table of Contents</div> <ul class="sectlevel1"> <li><a href="#_preface">Preface</a></li> <li><a href="#_upgrading_the_sdp">1. Upgrading the SDP</a> <ul class="sectlevel2"> <li><a href="#_upgrade_order_sdp_first_then_helix_p4d">1.1. Upgrade Order: SDP first, then Helix P4D</a></li> <li><a href="#_upgrading_other_helix_software">1.2. Upgrading other Helix Software</a></li> <li><a href="#_sdp_and_p4d_version_compatibility">1.3. SDP and P4D Version Compatibility</a></li> <li><a href="#_sdp_upgrade_methods">1.4. SDP Upgrade Methods</a></li> </ul> </li> <li><a href="#_planning">2. Planning</a> <ul class="sectlevel2"> <li><a href="#_mount_point_names">2.1. Mount Point Names</a></li> <li><a href="#_operating_system_user">2.2. Operating System User</a></li> </ul> </li> <li><a href="#_upgrade_procedure">3. Upgrade Procedure</a> <ul class="sectlevel2"> <li><a href="#_preparation">3.1. Preparation</a> <ul class="sectlevel3"> <li><a href="#_acquire_downloads">3.1.1. Acquire Downloads</a></li> <li><a href="#_deploy_new_sdp_common_files">3.1.2. Deploy new SDP common files</a></li> <li><a href="#_generate_new_sdp_config_files">3.1.3. Generate new SDP config files</a></li> <li><a href="#_configure_new_sdp_instance_bin_files_and_symlinks">3.1.4. Configure new SDP instance bin files and symlinks.</a></li> <li><a href="#_determine_your_metadata_symlink_type_fixed_or_variable">3.1.5. Determine Your Metadata Symlink Type (Fixed or Variable)</a></li> <li><a href="#_upgrade_init_scripts">3.1.6. Upgrade *_init scripts</a></li> <li><a href="#_review_systemd_service_files">3.1.7. Review systemd service files</a></li> <li><a href="#_account_for_customization_if_any">3.1.8. Account for customization (if any)</a></li> </ul> </li> <li><a href="#_execution">3.2. Execution</a> <ul class="sectlevel3"> <li><a href="#_stop_services">3.2.1. Stop Services</a></li> <li><a href="#_move_old_sdp_aside">3.2.2. Move old SDP Aside</a></li> <li><a href="#_upgrade_physical_structure">3.2.3. Upgrade Physical Structure</a></li> <li><a href="#_replace_instance_symlink_with_directory">3.2.4. Replace Instance Symlink with Directory</a></li> <li><a href="#_convert_fixed_to_variable_metadata_symlinks">3.2.5. Convert Fixed to Variable Metadata Symlinks</a></li> <li><a href="#_replace_instance_symlink_with_directory_2">3.2.6. Replace Instance Symlink with Directory</a></li> <li><a href="#_put_new_sdp_common_files_in_place">3.2.7. Put new SDP common files in place.</a></li> <li><a href="#_put_new_sdp_instance_bin_files_in_place">3.2.8. Put new SDP instance bin files in place.</a></li> <li><a href="#_upgrade_systemd_service_files">3.2.9. Upgrade systemd service files</a></li> </ul> </li> <li><a href="#_post_operation_steps">3.3. Post Operation Steps</a> <ul class="sectlevel3"> <li><a href="#_cleanup">3.3.1. Cleanup</a></li> </ul> </li> <li><a href="#_custom_hms_managed_installations">Appendix A: Custom HMS Managed Installations</a></li> </ul> </li> </ul> </div> </div> <div id="content"> <div class="sect1"> <h2 id="_preface">Preface</h2> <div class="sectionbody"> <div class="paragraph"> <p>This document provides an overview of the process to upgrade the SDP from any older version (dating back to 2007) to the SDP 2020.1 (aka "r20.1") release.</p> </div> <div class="paragraph"> <p>If your SDP version is 2020.1 or newer, refer to the <a href="SDP_Guide.Unix.html">SDP Guide (Unix)</a> for instructions on how to upgrade from SDP 2020.1 to later version. Starting from SDP 2020.1, the upgrade procedure for the SDP is aided by automated and incremental upgrade mechanism similar to p4d itself, capable of upgrade SDP from the current release to any future version so long as the current release is SDP 2020.1 or newer.</p> </div> <div class="paragraph"> <p>This document describes the process of upgrading to SDP r20.1.</p> </div> </div> </div> <div class="sect1"> <h2 id="_upgrading_the_sdp">1. Upgrading the SDP</h2> <div class="sectionbody"> <div class="paragraph"> <p>This section defines the procedure for ugprading the SDP itself.</p> </div> <div class="sect2"> <h3 id="_upgrade_order_sdp_first_then_helix_p4d">1.1. Upgrade Order: SDP first, then Helix P4D</h3> <div class="paragraph"> <p>The SDP should be upgraded prior to the upgrade of Helix Core (P4D). If you are upgrading P4D to or beyond P4D 2019.1 from a prior version of P4D, you <em>must</em> upgrade the SDP first. If you run multiple instances of P4D on a given machine (potentially each running different versions of P4D), upgrade the SDP first before upgrading any of the instances.</p> </div> <div class="paragraph"> <p>The SDP should also be upgraded before upgrading other Helix software on machines using the SDP, including p4d, p4p, p4broker, and p4 (the command line client).</p> </div> </div> <div class="sect2"> <h3 id="_upgrading_other_helix_software">1.2. Upgrading other Helix Software</h3> <div class="paragraph"> <p>See the <a href="SDP_Guide.Unix.html">SDP Guide (Unix)</a> for instructions on how to upgrade Helix binaries in the SDP structure after the SDP has been upgraded to 2020.1.</p> </div> </div> <div class="sect2"> <h3 id="_sdp_and_p4d_version_compatibility">1.3. SDP and P4D Version Compatibility</h3> <div class="paragraph"> <p>The SDP is often forward- and backward-compatible with P4D versions, but for best results they should be kept in sync by upgrading SDP before P4D. This is partly becuase the SDP contains logic that helps upgrade P4D, which can change as P4D evolves.</p> </div> <div class="paragraph"> <p>The SDP is aware of the P4D version, and has backward-compatibility logic to support older versions of P4D. This is guaranteed for supported versions of P4D. Backward compatiblity of SDP with older versions of P4D may extend farther back, though without the "offically supported" guarantee.</p> </div> </div> <div class="sect2"> <h3 id="_sdp_upgrade_methods">1.4. SDP Upgrade Methods</h3> <div class="paragraph"> <p>There are several methods for upgrading to a new version of the SDP, summarized here:</p> </div> <div class="ulist"> <ul> <li> <p><strong>In-Place, Manual</strong>: Manual upgrades of the SDP must be peformed to upgrade from versions older than r20.1 in-place on existing machines. This document provides details on how to do this.</p> </li> <li> <p><strong>In-Place, Automated</strong>: Automated in-place upgrades can be done if your current SDP version is r20.1 or later. Refer to documentation in <a href="SDP_Guide.Unix.html">SDP Guide (Unix)</a> for upgrading from SDP r20.1 onward.</p> </li> <li> <p><strong>Migration-Style</strong>: A migration-style upgrade is one in which the existing server machines (virtual or physical) are left in place, and brand new "green field" machines are installed fresh using the <a href="https://swarm.workshop.perforce.com/projects/perforce_software-helix-installer">Helix Installer</a> (which installs the latest SDP on a "green field" baseline operating system). Then the Helix Core data is migrated from the existing hardware to the new hardware. This approach is especially appealing when upgrading other aspects of the infrastructure, such as the hardware and/or operating system.</p> </li> <li> <p><strong>Custom with HMS</strong>: The <a href="https://swarm.workshop.perforce.com/projects/perforce_software-hms">Helix Management System</a> is used by some customers.</p> </li> </ul> </div> </div> </div> </div> <div class="sect1"> <h2 id="_planning">2. Planning</h2> <div class="sectionbody"> <div class="paragraph"> <p>Legacy SDP upgrades require some familiarization that should be done prior to scheduling an upgrade.</p> </div> <div class="sect2"> <h3 id="_mount_point_names">2.1. Mount Point Names</h3> <div class="paragraph"> <p>You will need to be aware of your moint point names. While referred to as mount point names in this document, in any given installation any or all of the three SDP "mount points" may be simple directories on the root volume or some other volume. In some installations, creative liberties were taken to use fewer than three volumes, and in some cases the operating system root volume was used as one of the volumes. Investiage and be aware of how your installation was configured.</p> </div> <div class="paragraph"> <p>In the examples below, the modern SDP mount point names are used:</p> </div> <div class="ulist"> <ul> <li> <p><code>/hxdepots</code> - Volume for versioned files and rotated/numbered metadata journals.</p> </li> <li> <p><code>/hxmetadata</code>- Volume for active and offline metadata</p> </li> <li> <p><code>/hxlogs</code> - Volume for active journal and various logs.</p> </li> </ul> </div> <div class="paragraph"> <p>Depending on the version of the SDP, the above values may be used, or earlier defaults such as, <code>/depotdata</code>, <code>/metadata</code>, and <code>logs</code>. However, often customer sites changed from the defaults to custom values, such as <code>/depots</code>, <code>/p4db</code>, <code>/p4journal</code>, and others.</p> </div> <div class="paragraph"> <p>In the sample steps in this document, adapt the steps to use your local values for mount point names to the new values.</p> </div> <div class="paragraph"> <p>If your site uses two volumes for metadata, <code>/hxmetadata1</code> and <code>/hxmetadata2</code>, continue using the same names below.</p> </div> </div> <div class="sect2"> <h3 id="_operating_system_user">2.2. Operating System User</h3> <div class="paragraph"> <p>You will need to be aware of your operating system user that <code>p4d</code> runs as in your environment.</p> </div> <div class="paragraph"> <p>The sample steps below assume that Perforce runs as the <code>peforce</code> operating system user, which is typical. Adapt if your user is something else, such as <code>p4admin</code>.</p> </div> <div class="paragraph"> <p>In modern installations, the default home directory is <code>/home/perforce</code>, though in some installations the home directory is <code>/p4</code>. In either case, this does not need to be changed during the upgrade process.</p> </div> </div> </div> </div> <div class="sect1"> <h2 id="_upgrade_procedure">3. Upgrade Procedure</h2> <div class="sectionbody"> <div class="paragraph"> <p>After <a href="#_planning">Chapter 2, <em>Planning</em></a>, the SDP procedure can be planned in detail.</p> </div> <div class="paragraph"> <p>The procedure is broken into 3 phases, Preparation, Execution, and PostOp. Preparation steps can be done in a non-disruptive manner on a production server ahead of the Execution. Execution steps are generally performed in a scheduled maintenance window. PostOp steps are done some time after the upgrade is complete, perhaps days or weeks later.</p> </div> <div class="sect2"> <h3 id="_preparation">3.1. Preparation</h3> <div class="paragraph"> <p>Preparation steps are:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>Acquire Downloads.</p> </li> <li> <p>Deploy new SDP common files.</p> </li> <li> <p>Generate new SDP config files.</p> </li> <li> <p>Configure new SDP instance bin files and symlinks.</p> </li> <li> <p>Determine Metadata Symlink Type (Fixed or Variable)</p> </li> <li> <p>Account for customization (if any)</p> </li> </ol> </div> <div class="sect3"> <h4 id="_acquire_downloads">3.1.1. Acquire Downloads</h4> <div class="paragraph"> <p>Download the latest SDP tarball release from this link: <a href="https://swarm.workshop.perforce.com/projects/perforce-software-sdp/download/downloads/sdp.Unix.tgz" class="bare">https://swarm.workshop.perforce.com/projects/perforce-software-sdp/download/downloads/sdp.Unix.tgz</a>.</p> </div> <div class="paragraph"> <p>Copy the downloaded tarball to the machine and put it in <code>/hxdepots/sdp.Unix.tgz</code>. (If a file with the same name exists from a previous upgrade, move it aside first.)</p> </div> </div> <div class="sect3"> <h4 id="_deploy_new_sdp_common_files">3.1.2. Deploy new SDP common files</h4> <div class="literalblock"> <div class="content"> <pre>mkdir /hxdepots/new cd /hxdepots/new tar -xzf /hxdepots/sdp.Unix.tgz cat sdp/Version</pre> </div> </div> <div class="paragraph"> <p>Verify that the contents of the <code>Version</code> file are as expected.</p> </div> </div> <div class="sect3"> <h4 id="_generate_new_sdp_config_files">3.1.3. Generate new SDP config files</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> <div class="admonitionblock warning"> <table> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> The SDP config files sometimes contain local custom modifications made by administrators. Often the need for customization goes away with new SDP versions. However, when generating new config files, be sure to review old files for any custom values. </td> </tr> </table> </div> </div> <div class="sect3"> <h4 id="_configure_new_sdp_instance_bin_files_and_symlinks">3.1.4. Configure new SDP instance bin files and symlinks.</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> </div> <div class="sect3"> <h4 id="_determine_your_metadata_symlink_type_fixed_or_variable">3.1.5. Determine Your Metadata Symlink Type (Fixed or Variable)</h4> <div class="paragraph"> <p>Login as the <code>perforce</code> operating system user, and run this command:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">ls -l /p4/1/root /p4/1/offline_db</code></pre> </div> </div> <div class="paragraph"> <p>The <code>root</code> and <code>offline_db</code> will be symlinks.</p> </div> <div class="paragraph"> <p>Depending on how old the SDP is, the structure will either be <em>fixed</em> or <em>variable</em> metadata symlinks. Determine which you have.</p> </div> <div class="paragraph"> <p><strong>Variable Metadata Symlink References</strong></p> </div> <div class="paragraph"> <p>If one of the symlinks points to a directory ending in <code>db1</code>, and the other in <code>db2</code> (it doesn’t matter which is pointing to which), you have <strong>variable metadata symlinks</strong>.</p> </div> <div class="paragraph"> <p><strong>Fixed Metadata Symlink References</strong></p> </div> <div class="paragraph"> <p>If the target of the <code>root</code> and <code>offline_db</code> symlinks points to directories ending in the same names, i.e. <code>root</code> and <code>offline_db</code>, then you have <strong>fixed metadata symlinks.</strong></p> </div> </div> <div class="sect3"> <h4 id="_upgrade_init_scripts">3.1.6. Upgrade *_init scripts</h4> <div class="paragraph"> <p>The format of SDP init scripts may have changed since your legacy version. Check them to see if they need to be modified.</p> </div> <div class="paragraph"> <p>For each instance, look in the <code>/p4/N/bin</code> folder, and review the scripts. Compare them to templates in <code>/p4/common/etc/init.d</code>. For example, compare <code>/p4/1/bin/p4d_1_init</code> with <code>/p4/common/etc/init.d/p4d_instance_init.template</code>.</p> </div> <div class="paragraph"> <p>If your current init scripts look <em>exactly</em> like the templates, except for subsitutions of any <code>REPL_*</code> strings from the template, then they do not need to be updated. Older SDP versions had more complex <code>*_init</code> scripts.</p> </div> <div class="paragraph"> <p>If they need to be replaced, plan to do so during your upgrade with steps like these samples:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>cd /p4/N/bin mkdir OLD_DELETE_ME_LATER mv p4d_N_bin OLD_DELETE_ME_LATER/. sed s:REPL_SDP_INSTANCE:N:g /p4/common/etc/init.d/p4d_instance_init.template > p4d_N_init chmod +x p4d_N_init</code></pre> </div> </div> <div class="paragraph"> <p>If there are <code>p4broker_N_init</code>, <code>p4d_N_init</code>, and/or <code>p4dtg_N_init</code> scripts, follow the same procedure for those, generating new init scripts from the templates.</p> </div> <div class="paragraph"> <p>These steps can only be executed after the <code>/p4/common</code> folder has been updated.</p> </div> </div> <div class="sect3"> <h4 id="_review_systemd_service_files">3.1.7. Review systemd service files</h4> <div class="paragraph"> <p>The format of Systemd service files (sometimes referred to as 'unit' files) changed with the SDP 2020.1 release. As part of planning, it is helpful to identify if systemd is already in use, and which Perforce Helix services are managing with systemd.</p> </div> <div class="paragraph"> <p>You can get a list of such services with:</p> </div> <div class="literalblock"> <div class="content"> <pre>ls -ld /etc/systemd/system ls -lrt /etc/systemd/system/p4*.service</pre> </div> </div> <div class="paragraph"> <p>If the <code>/etc/systemd/system</code> directory exists, then your system is using the Systemd init mechanism. On systems that use the Systemd init mechanism, we require using the systemd mechanism to manage Perfore Helix services (for safety and consistency of management). Depending on your SDP version and how it was installed, there may or may not already be <code>p4*.service</code> files.</p> </div> <div class="paragraph"> <p>In any case, in the Execution phase below, new systemd <code>p4*.service</code> files will be put in place, which may be new or replace exisitng files.</p> </div> </div> <div class="sect3"> <h4 id="_account_for_customization_if_any">3.1.8. Account for customization (if any)</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> </div> </div> <div class="sect2"> <h3 id="_execution">3.2. Execution</h3> <div class="paragraph"> <p>This section outlines sample steps for executing an actual upgrade after <a href="#_planning">Chapter 2, <em>Planning</em></a> and <a href="#_preparation">Section 3.1, “Preparation”</a> have been completed. The following is typically performed in a scheduled maintenance window.</p> </div> <div class="paragraph"> <p>Execution steps are:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>Stop Services</p> </li> <li> <p>Move Old SDP aside.</p> </li> <li> <p>Upgrade Physical Structure</p> </li> <li> <p>Put new SDP common files in place.</p> </li> <li> <p>Put new SDP config files in place.</p> </li> <li> <p>Put new SDP instance bin files in place.</p> </li> </ol> </div> <div class="sect3"> <h4 id="_stop_services">3.2.1. Stop Services</h4> <div class="paragraph"> <p>Stop the <code>p4d</code> service for all instances on this machine. Also stop all p4broker services running on this machine (if any).</p> </div> <div class="paragraph"> <p>For this short maintenance, the broker cannot be left running (e.g. to broadcast a "Down For Maintenance (DFM)" message) because the structure change cannot be started until <em>all</em> processes launched from the SDP directory structure have stopped.</p> </div> <div class="paragraph"> <p>Sample commands:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">p4d_1_init status p4d_1_init stop p4d_1_init status p4broker_1_init status p4broker_1_init stop p4broker_1_init status</code></pre> </div> </div> <div class="paragraph"> <p>The extra <code>status</code> are for situational awareness; and are not strictly necessary.</p> </div> </div> <div class="sect3"> <h4 id="_move_old_sdp_aside">3.2.2. Move old SDP Aside</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> </div> <div class="sect3"> <h4 id="_upgrade_physical_structure">3.2.3. Upgrade Physical Structure</h4> <div class="paragraph"> <p>In this step, the physical structure of the upgrade is done for pre-2019.1 SDP.</p> </div> <div class="paragraph"> <p>The structure of the SDP changed in the 2019.1 release, to increase performance and reduce complexit in post-failover operations. The following notes describe how to do an in-place conversion to the new structure.</p> </div> <div class="paragraph"> <p>First, become familar with the Pre-2019.1 and 2019.1+ structures.</p> </div> <div class="paragraph"> <p><strong>SDP Pre-2019.1 Structure:</strong></p> </div> <div class="ulist"> <ul> <li> <p><code>/p4</code> is a directory on the operating system root voume, <code>/</code>.</p> </li> <li> <p><code>/p4/<em>N</em></code> is a symlink to a directory is typically the mount point for a storage volume (<code>/hxdepots</code> by default).</p> </li> <li> <p><code>/p4/<em>N</em></code> contains symlinks for <code>/hxdepots</code>, <code>/hxmetadata</code>, and <code>hxlogs</code>, as well as tickets and trust files.</p> </li> </ul> </div> <div class="paragraph"> <p><strong>SDP 2019.1+ Structure:</strong></p> </div> <div class="ulist"> <ul> <li> <p><code>/p4</code> is a directory on the operating system root volume, <code>/</code>, (same as Pre-2019.1 Structure).</p> </li> <li> <p><code>/p4/<em>N</em></code> is local directory on the operating system root volume,</p> </li> <li> <p><code>/p4/<em>N</em></code> contains symlinks for <code>/hxdepots</code>, <code>/hxmetadata</code>, and <code>hxlogs</code>, as well as tickets and trust files (same as the Pre-2019.1 structure)</p> </li> <li> <p><code>/p4/<em>N</em>/bin</code> is local directory on the operating system root volume. The <code>bin</code> directory is the only actual directory in <code>/p4/<em>N</em></code>; other items are files or symlinks to directories.</p> </li> </ul> </div> <div class="paragraph"> <p>The <code>verify_sdp.sh</code> script (included in the SDP starting with SDP 2019.1) give errors if the 2019.1+ SDP structure is not in place.</p> </div> <div class="paragraph"> <p>Converting the SDP structure in-place to the new style requires downtime on the edge/replica of interest. While the downtime can be brief if only the SDP structure is changed, commonly the P4D is upgraded in the same maintenance window. If the P4D is pre-2019.1, a longer maintenance window will be required, depending on duration of checkpoints.</p> </div> <div class="paragraph"> <p>Following is the procedure to upgrade the structure in-place on a machine.</p> </div> <div class="admonitionblock warning"> <table> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> In the following sample procedure, the default SDP instance name of <code>1</code> is used, and default mount point names are used. Adapt this to your environment by applying this procedure to each instance on any given machine. If you have multiple instances, apply this procedure for each instance, one at a time. </td> </tr> </table> </div> </div> <div class="sect3"> <h4 id="_replace_instance_symlink_with_directory">3.2.4. Replace Instance Symlink with Directory</h4> <div class="paragraph"> <p>Move the instance symlink aside, and replace it with a regular directory. Then copy the <code>.p4*</code> files (e.g. <code>.p4tickets</code> and <code>.p4trust</code>) into the new directory. Sample commands:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">cd /p4 mv 1 1.old_symlink mkdir 1 cd 1 cp -p /p4/1.old_symlink/.p4t* .</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_convert_fixed_to_variable_metadata_symlinks">3.2.5. Convert Fixed to Variable Metadata Symlinks</h4> <div class="paragraph"> <p>If you have Fixed Metadata Symlinks, first convert them to to Variable Metadata Symlinks. If you already have Varialbe Metadata Symlinks, proceed to <a href="#_replace_instance_symlink_with_directory">Section 3.2.4, “Replace Instance Symlink with Directory”</a></p> </div> <div class="paragraph"> <p>In this step, move the underlying directories that will be pointed to by the <code>root</code> and <code>offline_db</code> sylmink names, and move them to their <code>db1</code> and <code>db2</code> names.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">mv /hxmetadata/p4/1/root /hxmetadata/p4/1/db1 mv /hxmetadata/p4/1/offline_db /hxmetadata/p4/1/db2</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_replace_instance_symlink_with_directory_2">3.2.6. Replace Instance Symlink with Directory</h4> <div class="paragraph"> <p>Next, recreate the same symlinks you see reported by the <code>ls</code> command:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">ls -l /p4/1.old_symlink/* cd /p4/1 ln -s /hxmetadata/p4/1/db1 root ln -s /hxmetadata/p4/1/db2 offline_db</code></pre> </div> </div> <div class="admonitionblock warning"> <table> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> Do not just copy the sample commands above. Pay close attention to the <code>ls</code> output, and make sure the <code>root</code> points to whatever it was pointing to before, either a directory ending in <code>db1</code> or <code>db2</code> (unless you just converted from Fixed Metadata Symlinks in STEP 4). Also confirm that <code>offline_db</code> and <code>root</code> aren’t both pointing to the same directory; one should be pointing to <code>db1</code> and the other to <code>db2</code>. </td> </tr> </table> </div> <div class="paragraph"> <p>Then, create additional symlinks akin to whatever else is in <code>/p4/1.old_symlink</code></p> </div> <div class="paragraph"> <p>That should look something like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">cd /p4/1 ln -s /hxdepots/p4/1/depots ln -s /hxdepots/p4/1/checkpoints ln -s /hxdepots/p4/1/checkpoints.YourEdgeServerID ln -s /hxlogs/p4/1/logs ln -s /hxlogs/p4/1/tmp ls -l</code></pre> </div> </div> <div class="paragraph"> <p>Next, create the <code>bin</code> directory, as a local directory and copy files to it:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">mkdir bin cd bin cp /p4/1.old_symlink/bin/p4d_1_init . cp /p4/1.old_symlink/bin/p4broker_1_init . ln -s /p4/common/bin/p4broker_1_bin p4broker_1 ln -s /p4/common/bin/p4_bin p4_1</code></pre> </div> </div> <div class="paragraph"> <p>Last, take a look at <code>/p4/1.old_symlink/bin/p4d_1</code> - that <code>p4d_1</code> will be either a tiny script or a symlink (depending on whether your p4d is case sensitive or not). If you server is case sensitive, it will be a symlink. If your server is case-insensitive, it will be a tiny script.</p> </div> <div class="paragraph"> <p>If your server is case sensitive, create the symlink like this:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">ln -s /p4/common/bin/p4d_1_bin p4d_1</code></pre> </div> </div> <div class="paragraph"> <p>OR, if your server is case-sensitive, that p4d_1 will be a tiny script, so just copy it:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-bash" data-lang="bash">cp /p4/1.old_symlink/bin/p4d_1 .</code></pre> </div> </div> <div class="paragraph"> <p>Then, start your server again, and run the <code>verify_sdp.sh</code> script and confirm that it’s happy now.</p> </div> </div> <div class="sect3"> <h4 id="_put_new_sdp_common_files_in_place">3.2.7. Put new SDP common files in place.</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> </div> <div class="sect3"> <h4 id="_put_new_sdp_instance_bin_files_in_place">3.2.8. Put new SDP instance bin files in place.</h4> <div class="paragraph"> <p><em>EDITME</em></p> </div> </div> <div class="sect3"> <h4 id="_upgrade_systemd_service_files">3.2.9. Upgrade systemd service files</h4> <div class="paragraph"> <p>The format of systemd unit files changed with the SDP 2020.1 release.</p> </div> </div> </div> <div class="sect2"> <h3 id="_post_operation_steps">3.3. Post Operation Steps</h3> <div class="paragraph"> <p>Cleanup steps can occur after the upgrade. In some cases cleanup is done immediately following the upgrade; in other cases it may be deferred by days or weeks.</p> </div> <div class="sect3"> <h4 id="_cleanup">3.3.1. Cleanup</h4> <div class="paragraph"> <p>Temporary directories with DELETE_ME created durnig the upgrade procedure can now be deleted.</p> </div> </div> </div> <div class="sect2"> <h3 id="_custom_hms_managed_installations">Appendix A: Custom HMS Managed Installations</h3> <div class="paragraph"> <p>If the Helix Management System (HMS) is used to manage this installation, you should have custom site-specific documentation for upgrading the SDP that supercedes this documentation. If the file <code>/p4/common/bin/hms</code> exists at your site, you have an HMS-managed site. Conact <a href="mailto:consulting@perforce.com">Perforce Consulting</a> for more information.</p> </div> <div class="paragraph"> <p>Note that HMS solutions are inherently custom and not officially supported, but can be fully automated for global Helix Core topologies.</p> </div> </div> </div> </div> </div> <div id="footer"> <div id="footer-text"> Version v2020.1<br> Last updated 2021-01-20 10:55:49 -0500 </div> </div> </body> </html>
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#33 | 30913 | C. Thomas Tyler | Regnerated docs for release. | ||
#32 | 30835 | C. Thomas Tyler |
Adapted Server Spec Naming Standard section detailing the ServerID of the commit server to the defacto standard already used in HRA. Changed from: {commit|master}[.<SDPInstance>[.<OrgName>]] to: {commit|master}[.<OrgName>[.<SDPInstance>]] Various typo fixes and minor changes in SDP Guide. Updated consulting email address (now consulting-helix-core@perforce.com) in various files. |
||
#31 | 30531 | C. Thomas Tyler |
Merge down from main to dev with: p4 merge -b perforce_software-sdp-dev |
||
#30 | 30385 | C. Thomas Tyler | Regnerated docs for release. | ||
#29 | 30294 | C. Thomas Tyler | Updated docs for release. | ||
#28 | 30095 | Mark Zinthefer | Fixing typo regarding case-sensitivity in SDP Legacy_Upgrade doc | ||
#27 | 30000 | C. Thomas Tyler |
Refined Release Notes and top-level README.md file in preparation for coming 2023.2 release. Adjusted Makefile in doc directory to also generate top-level README.html from top-level README.md file so that the HTML file is reliably updated in the SDP release process. Updated :revnumber: and :revdate: docs in AsciiDoc files to indicate that the are still current. Avoiding regen of ReleaseNotes.pdf binary file since that will need at least one more update before shipping SDP 2023.2. |
||
#26 | 29700 | C. Thomas Tyler |
Updated Version to release SDP 2023.1.29699. Re-generated docs. |
||
#25 | 29611 | C. Thomas Tyler |
Updated Version to release SDP 2023.1.29610. Re-generated docs. |
||
#24 | 29251 | C. Thomas Tyler |
Updated Version to release SDP 2022.2.29250. Re-generated docs. |
||
#23 | 28988 | C. Thomas Tyler |
Updated Version to release SDP 2022.1.28987. Re-generated docs. |
||
#22 | 28840 | C. Thomas Tyler |
Updated Version to release SDP 2022.1.28839. Re-generated docs. |
||
#21 | 28411 | C. Thomas Tyler |
Updated Version to release SDP 2021.2.28410. Re-generated docs. |
||
#20 | 28239 | C. Thomas Tyler |
Updated Version to release SDP 2021.1.28238. Re-generated docs. |
||
#19 | 27920 | C. Thomas Tyler |
Updated Version to release SDP 2020.1.27919. Re-generated docs. |
||
#18 | 27821 | C. Thomas Tyler |
Updated Version to release SDP 2020.1.27820. Re-generated docs. |
||
#17 | 27763 | C. Thomas Tyler | Fix typo in SDP Legacy Upgrade Guide. | ||
#16 | 27760 | C. Thomas Tyler |
Updated Version to release SDP 2020.1.27759. Re-generated docs. |
||
#15 | 27725 | C. Thomas Tyler | Re-generated HTML and PDF from adoc files. | ||
#14 | 27722 | C. Thomas Tyler |
Refinements to @27712: * Resolved one out-of-date file (verify_sdp.sh). * Added missing adoc file for which HTML file had a change (WorkflowEnforcementTriggers.adoc). * Updated revdate/revnumber in *.adoc files. * Additional content updates in Server/Unix/p4/common/etc/cron.d/ReadMe.md. * Bumped version numbers on scripts with Version= def'n. * Generated HTML, PDF, and doc/gen files: - Most HTML and all PDF are generated using Makefiles that call an AsciiDoc utility. - HTML for Perl scripts is generated with pod2html. - doc/gen/*.man.txt files are generated with .../tools/gen_script_man_pages.sh. #review-27712 |
||
#13 | 27687 | C. Thomas Tyler |
SDP Legacy Upgrade Guide doc updates: * Customer feedback incorporated. THANK YOU! * Added new 'Upgrade systemd service files' section. * Cleaned up some incomplete text. * Fixed typo 'MAILLOST' -> 'MAILLIST'. * Added notes to crontab handling to deal with change from daily_backup.sh to daily_checkpoint.sh and removal of recreate_db_*.sh scripts. |
||
#12 | 27686 | C. Thomas Tyler |
Updated SDP Legacy Upgrade Doc: * Retitled 'Broker Config Files - Nothing to do' to drop the 'Nothing to do', since broker config files need to be moved from /p4/N/bin for really old SDP installs. Added doc on what to do with them. * Fixed section numbering/indention level for sections 'Instance P4Review Scripts' and 'Broker Config Files'. |
||
#11 | 27682 | C. Thomas Tyler |
Updated SDP Legacy Upgrade Doc: * Incorporated customer feedback and corrections. THANK YOU! |
||
#10 | 27681 | C. Thomas Tyler |
Updated SDP Legacy Upgrade Doc: * Incorporated customer feedback and corrections. THANK YOU! * Added Appendix B on using DFM brokers during the legacy upgrade process. |
||
#9 | 27677 | C. Thomas Tyler |
Updated SDP Legacy Upgrade Doc: * Incorporated customer feedback and corrections. THANK YOU! * Added section for moving password files from legacy location. * Added section for dealing with configurables. |
||
#8 | 27676 | C. Thomas Tyler | Generated HTML only for legacy upgrade doc. | ||
#7 | 27536 | C. Thomas Tyler |
Legacy Upgrade Guide doc updates: * Added 'Put New SDP in Place' section. * Added 'Set SDP Counters' section to set SDP_VERSION and SDP_DATE counters. * Covered updating depot spec Map fields. * Covered adding server.id files. * Added missing content on putting new SDP directory in place. SDP_Guide.Unix doc updates: * Added Legacy Upgrade Scripts section w/clear_depot_Map_fields.sh. Updated Makefile with new doc build dependencies. Regenerated docs. |
||
#6 | 27526 | C. Thomas Tyler |
Updated Version to release SDP 2020.1.27524. Re-generated docs. |
||
#5 | 27498 | C. Thomas Tyler | Legacy upgrade doc updates. | ||
#4 | 27486 | C. Thomas Tyler | Doc updates, WIP. | ||
#3 | 27322 | C. Thomas Tyler | Updated AsciiDoc-generated files. | ||
#2 | 27253 | C. Thomas Tyler | Updated generated docs. | ||
#1 | 27096 | C. Thomas Tyler |
Refactored SDP Legacy Upgrade content into a separate doc. The SDP Guide will be remain comprehensive and cover how to upgrade the SDP itself forwardm from the current version (2020.1) using the new, p4d-like incremental upgrade mechanism. The content for manual upgrade procedures needed to get older SDP installations to 2020.1 is only useful until sites are on 2020.1. This content is extensive, narrowly focused, and of value only once per installation, and thus the legacy upgrade content is separated into its own document. Regenerated work-in-progress HTML files for easier review. |