static int init_native_env() { char *pchFd; pchFd = getenv("LSAPI_CRIU_SYNC_FD"); if (!pchFd) pchFd = getenv("LSCAPI_CRIU_SYNC_FD"); const char *image_path; image_path = getenv("LSAPI_CRIU_IMAGE_PATH"); if (!pchFd) { lscriu_err("LSCRIU (%d): LSAPI_CRIU_SYNC_FD internal environment " "variable not set - contact Litespeed tech support\n", getpid()); return -1; } if (!image_path) { lscriu_err("LSCRIU (%d): LSAPI_CRIU_IMAGE_PATH internal environment " "variable not set - contact Litespeed tech support\n", getpid()); return -1; } lscriu_dbg("LSCRIU (%d): Checkpoint dump. ImagePath: %s\n", getpid(), image_path); s_fd_native = atoi(pchFd); lscriu_dbg("LSCRIU (%d): Native checkpoint. Use filepointer %d (%s) to send " "pid %d\n", getpid(), s_fd_native, pchFd, iPidDump); s_criu_image_path = strdup(image_path); return 0; }
static void LSCRIU_CloudLinux_Checkpoint(void) { int iRet; if ((!s_native) && (!s_lscapi_dump_me)) { lscriu_dbg("LSCRIU (%d): Not native and unable to dump - abandon one-time " "dump\n", s_pid); return; } iRet = s_lscapi_dump_me(); if (iRet < 0) { char *pchError; lscriu_err("LSCRIU: CloudLinux dump of PID: %d, error: %s\n", s_pid, strerror(errno)); } if (iRet == 0) { // Dumped. To continue the child must send us the handles back lscriu_err("LSCRIU: Successful CloudLinux dump of PID: %d\n", s_pid); } else { s_restored = 1; LSAPI_reset_server_state(); /* Here we have restored the php process, so we should to tell (via semaphore) mod_lsapi that we are started and ready to receive data. */ LSCRIU_Wink_Server_is_Ready(); lscriu_err("LSCRIU: Successful CloudLinux restore of PID: %d, parent: %d.\n", getpid(), getppid()); } LSCRIU_Set_Initial_Start_Reqs(0); }
static int LSCRIU_Native_Dump(pid_t iPid, char *pchImagePath, int iFdNative) { criu_native_dump_t criu_native_dump; char *pchLastSlash; memset(&criu_native_dump, 0, sizeof(criu_native_dump)); criu_native_dump.m_iPidToDump = iPid; strncpy(criu_native_dump.m_chImageDirectory, pchImagePath, sizeof(criu_native_dump.m_chImageDirectory)); pchLastSlash = strrchr(criu_native_dump.m_chSocketDir,'/'); if (pchLastSlash) { pchLastSlash++; (*pchLastSlash) = 0; } lscriu_dbg("LSCRIU (%d): Sent the dump request to the listener\n", s_pid); if (write(iFdNative, &criu_native_dump, sizeof(criu_native_dump)) == -1) { lscriu_err("LSCRIU (%d): Error sending dump request to the listener: %s\n", s_pid, strerror(errno)); return(-1); } return 0; }
static void LSCRIU_try_checkpoint(int *forked_pid) { int iRet; pid_t iPid; pid_t iPidDump = getpid(); if (s_tried_checkpoint) { lscriu_dbg("LSCRIU (%d): Already tried checkpoint - one time per customer\n", getpid()); return; } lscriu_dbg("LSCRIU (%d): Trying checkpoint\n", getpid()); s_tried_checkpoint = 1; if (!s_native) { LSCRIU_CloudLinux_Checkpoint(); return; } lscriu_dbg("LSCRIU (%d): fork!\n", getpid()); iPid = fork(); if (iPid < 0) { lscriu_err("LSCRIU (%d): Can't checkpoint due to a fork error: %s\n", getpid(), strerror(errno)); return; } if (iPid == 0) { int iResult; pid_t iPidSender; pid_t iPidParent = getppid(); s_pid = getpid(); setsid(); iRet = LSCRIU_Native_Dump(s_pid, s_criu_image_path, s_fd_native); close(s_fd_native); LSCRIU_Wait_Dump_Finsh_Or_Restored(iPidParent); LSCRIU_Restored_Error(0, "Restored!"); LSAPI_reset_server_state(); s_restored = 1; } else { if (forked_pid) *forked_pid = iPid; } LSCRIU_Set_Initial_Start_Reqs(0); }
static int LSCRIU_Native_Dump(pid_t iPid, char *pchImagePath, int iFdNative) { criu_native_dump_t criu_native_dump; char *pchLastSlash; criu_native_dump_response_t criu_native_dump_response; memset(&criu_native_dump, 0, sizeof(criu_native_dump)); criu_native_dump.m_iPidToDump = iPid; strncpy(criu_native_dump.m_chImageDirectory, pchImagePath, sizeof(criu_native_dump.m_chImageDirectory)); pchLastSlash = strrchr(criu_native_dump.m_chSocketDir,'/'); if (pchLastSlash) { pchLastSlash++; (*pchLastSlash) = 0; } lscriu_dbg("LSCRIU (%d): Sent the dump request to the listener\n", s_pid); if (write(iFdNative, &criu_native_dump, sizeof(criu_native_dump)) == -1) { lscriu_err("LSCRIU (%d): Error sending dump request to the listener: %s\n", s_pid, strerror(errno)); return(-1); } return 0; /* do not wait response. //while (sleep(7200)); if (read(iFdNative, &criu_native_dump_response, sizeof(criu_native_dump_response)) == -1) { // The test will actually fail it! //LSCRIU_Restored_Error(1, "Error reading dump socket #%d from parent: %s", // iFdNative, strerror(errno)); //return(-1); } return(-1); */ }