::----------------------------------------------------------------------------- :: Copyright (c) Perforce Software, Inc., 2007-2014. All rights reserved :: :: Redistribution and use in source and binary forms, with or without :: modification, are permitted provided that the following conditions are met: :: :: 1 Redistributions of source code must retain the above copyright :: notice, this list of conditions and the following disclaimer. :: :: 2. Redistributions in binary form must reproduce the above copyright :: notice, this list of conditions and the following disclaimer in the :: documentation and/or other materials provided with the distribution. :: :: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS :: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT :: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS :: FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE :: SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, :: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT :: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, :: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON :: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR :: TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF :: THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH :: DAMAGE. ::----------------------------------------------------------------------------- :: Place the new p4.exe and p4d.exe binaries into the c:\p4\common\bin :: folder prior to running this script. :: :: Run this script with a single parameter which is the instance. @echo off setlocal enableextensions set current_script_dir=%~p0 call %current_script_dir%p4env.bat %1 if errorlevel 1 ( echo Upgrade aborted - invalid config file found. echo . exit /B 1 ) if x%SDP_INSTANCE% == x ( echo Upgrade aborted - no instance parameter specified. echo . exit /B 1 ) if not exist %current_script_dir%p4d.exe ( echo Can't find new P4D: %current_script_dir%p4d.exe echo . exit /b 1 ) if not exist %current_script_dir%p4.exe ( echo Can't find new P4: %current_script_dir%p4.exe echo . exit /b 1 ) set LOG=%LOGS_DIR%\upgrade.log echo Starting upgrade.> %LOG% :: Check if we are in admin mode - things won't work otherwise - can't stop the service. net session >:NULL 2>&1 IF not %ERRORLEVEL% EQU 0 ( ECHO You must run upgrade.bat with Administrator privileges.>> %LOG% ECHO You must run upgrade.bat with Administrator privileges. goto ERROR ) echo Determining current journal counter.>> %LOG% echo Determining current journal counter. :: Dump just the db.counters table to stdout and parse for the counter for /F "tokens=5" %%F in ('"%SDP_INSTANCE_BIN_DIR%\p4d -r %P4ROOT% -jd - db.counters | findstr @journal@"') do (set JNL=%%F) if %JNL%x == x ( echo ERROR:>> %LOG% echo ERROR: Could not determine journal counter; JNL not set!>> %LOG% echo ERROR: Could not determine journal counter; JNL not set! echo ERROR:>> %LOG% goto ERROR ) :: Turn "@123@" to "123" set JNL=%JNL:~1,-1% set /A CKP=JNL+1 if %CKP%x == x ( echo ERROR:>> %LOG% echo ERROR: Could not determine next checkpoint number; CKP not set!>> %LOG% echo ERROR: Could not determine next checkpoint number; CKP not set! echo ERROR:>> %LOG% goto ERROR ) echo Live checkpoint/journal numbers are %CKP%/%JNL%.>> %LOG% echo Live checkpoint/journal numbers are %CKP%/%JNL%. :: Find out the current journal counter for our offline database :: Dump just the db.counters table to stdout and parse for the counter for /F "tokens=5" %%F in ('"%SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jd - db.counters | findstr @journal@"') do (set OFF_JNL=%%F) if %OFF_JNL%x == x ( echo ERROR:>>%LOG% echo ERROR: Could not determine offline journal counter; OFF_JNL not set!>>%LOG% echo ERROR: Could not determine offline journal counter; OFF_JNL not set! echo ERROR:>>%LOG% goto ERROR ) :: Turn "@123@" to "123" set OFF_JNL=%OFF_JNL:~1,-1% call :OUTPUT_TIME echo Offline journal number is %OFF_JNL%.>> %LOG% echo Offline journal number is %OFF_JNL%. sc queryex %SDP_INSTANCE_P4SERVICE_NAME% | find /I "PID" > pid.txt for /F "tokens=1,2 delims=: " %%i in (pid.txt) DO (set P4SPID=%%j) echo Stopping the live service echo svcinst stop -n %SDP_INSTANCE_P4SERVICE_NAME% svcinst stop -n %SDP_INSTANCE_P4SERVICE_NAME% >> %LOG% 2>&1 REM Check service has stopped sc query %SDP_INSTANCE_P4SERVICE_NAME% | find /I "stopped" if not %ERRORLEVEL% == 0 goto ERROR call :OUTPUT_TIME echo Cutting off/rotating current journal>> %LOG% echo Cutting off/rotating current journal echo %SDP_INSTANCE_BIN_DIR%\p4d -r %P4ROOT% -jj %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%>> %LOG% echo %SDP_INSTANCE_BIN_DIR%\p4d -r %P4ROOT% -jj %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME% %SDP_INSTANCE_BIN_DIR%\p4d -r %P4ROOT% -jj %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME% >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME echo Applying all outstanding journal files to offline_db>> %LOG% echo Applying all outstanding journal files to offline_db echo .>> %LOG% for /L %%J in (%OFF_JNL%,1,%JNL%) do ( echo %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jr %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%.jnl.%%J>> %LOG% echo %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jr %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%.jnl.%%J %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jr %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%.jnl.%%J >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME ) echo Copy in the new binaries >> %LOG% 2>&1 echo Copy in the new binaries echo copy %SCRIPTS_DIR%\p4.exe %SDP_INSTANCE_BIN_DIR% copy %SCRIPTS_DIR%\p4.exe %SDP_INSTANCE_BIN_DIR% >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR echo copy %SCRIPTS_DIR%\p4d.exe %SDP_INSTANCE_BIN_DIR% copy %SCRIPTS_DIR%\p4d.exe %SDP_INSTANCE_BIN_DIR% >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR echo copy %SCRIPTS_DIR%\p4d.exe %SDP_INSTANCE_BIN_DIR%\p4s.exe copy %SCRIPTS_DIR%\p4d.exe %SDP_INSTANCE_BIN_DIR%\p4s.exe >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME echo Upgrade the server and restart it >> %LOG% 2>&1 echo Upgrade the server and restart it echo %SDP_INSTANCE_BIN_DIR%\p4d -r %METADATA_ROOT%\p4\%SDP_INSTANCE%\root -J off -xu %SDP_INSTANCE_BIN_DIR%\p4d -r %METADATA_ROOT%\p4\%SDP_INSTANCE%\root -J off -xu >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR net start p4_%SDP_INSTANCE% if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME echo Upgrade the offline_db directory and dump out a new checkpoint file. >> %LOG% 2>&1 echo Upgrade the offline_db directory and dump out a new checkpoint file. echo %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -J off -xu %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -J off -xu >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME echo %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jd -z %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%.ckp.%ckp%.gz %SDP_INSTANCE_BIN_DIR%\p4d -r %OFFLINE_DB_DIR% -jd -z %CHECKPOINTS_DIR%\%SDP_INSTANCE_P4SERVICE_NAME%.ckp.%ckp%.gz >> %LOG% 2>&1 if NOT ERRORLEVEL 0 goto ERROR call :OUTPUT_TIME echo Finished!>> %LOG% echo Finished! echo Upgrade was successful - see %LOG% goto END :ERROR echo An ERROR occured in the upgrade process, please check for errors in %LOG% goto END :OUTPUT_TIME for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do @for /f "delims=" %%B in ("%%j") do set ldt=%%B if '.%%i.'=='.LocalDateTime.' set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6% echo %ldt%>> %LOG% echo %ldt% goto :EOF :END endlocal