int gtmsource_changelog(void) { uint4 changelog_desired = 0, changelog_accepted = 0; int log_fd = 0; /*used to indicate whether the new specified log file is writable*/ int close_status = 0; /*used to indicate if log file is successfully closed*/ char* err_code; int save_errno; assert(holds_sem[SOURCE][JNL_POOL_ACCESS_SEM]); repl_log(stderr, TRUE, TRUE, "Initiating CHANGELOG operation on source server pid [%d] for secondary instance [%s]\n", jnlpool.gtmsource_local->gtmsource_pid, jnlpool.gtmsource_local->secondary_instname); if (0 != jnlpool.gtmsource_local->changelog) { util_out_print("Change log is already in progress. Not initiating change in log file or log interval", TRUE); return (ABNORMAL_SHUTDOWN); } if ('\0' != gtmsource_options.log_file[0]) /* trigger change in log file */ { changelog_desired |= REPLIC_CHANGE_LOGFILE; if (0 != STRCMP(jnlpool.gtmsource_local->log_file, gtmsource_options.log_file)) { /*check if the new log file is writable*/ OPENFILE3_CLOEXEC(gtmsource_options.log_file, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, log_fd); if (log_fd < 0) { save_errno = ERRNO; err_code = STRERROR(save_errno); gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(8) ERR_REPLLOGOPN, 6, LEN_AND_STR(gtmsource_options.log_file), LEN_AND_STR(err_code), LEN_AND_STR(NULL_DEVICE)); } else { CLOSEFILE_IF_OPEN(log_fd, close_status); assert(close_status==0); changelog_accepted |= REPLIC_CHANGE_LOGFILE; STRCPY(jnlpool.gtmsource_local->log_file, gtmsource_options.log_file); util_out_print("Change log initiated with file !AD", TRUE, LEN_AND_STR(gtmsource_options.log_file)); } } else util_out_print("Log file is already !AD. Not initiating change in log file", TRUE, LEN_AND_STR(gtmsource_options.log_file)); } if (0 != gtmsource_options.src_log_interval) /* trigger change in log interval */ { changelog_desired |= REPLIC_CHANGE_LOGINTERVAL; if (gtmsource_options.src_log_interval != jnlpool.gtmsource_local->log_interval) { changelog_accepted |= REPLIC_CHANGE_LOGINTERVAL; jnlpool.gtmsource_local->log_interval = gtmsource_options.src_log_interval; util_out_print("Change log initiated with interval !UL", TRUE, gtmsource_options.src_log_interval); } else util_out_print("Log interval is already !UL. Not initiating change in log interval", TRUE, gtmsource_options.src_log_interval); } if (0 != changelog_accepted) jnlpool.gtmsource_local->changelog = changelog_accepted; else util_out_print("No change to log file or log interval", TRUE); return ((0 != changelog_accepted && changelog_accepted == changelog_desired) ? NORMAL_SHUTDOWN : ABNORMAL_SHUTDOWN); }
int gtmsource_mode_change(int to_mode) { uint4 savepid; int exit_status; int status, detach_status, remove_status; int log_fd = 0, close_status = 0; char* err_code; int save_errno; sgmnt_addrs *repl_csa; assert(holds_sem[SOURCE][JNL_POOL_ACCESS_SEM]); repl_log(stdout, TRUE, TRUE, "Initiating %s operation on source server pid [%d] for secondary instance [%s]\n", (GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode) ? "ACTIVATE" : "DEACTIVATE", jnlpool.gtmsource_local->gtmsource_pid, jnlpool.gtmsource_local->secondary_instname); if ((jnlpool.gtmsource_local->mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) || (jnlpool.gtmsource_local->mode == GTMSOURCE_MODE_PASSIVE_REQUESTED)) { repl_log(stderr, FALSE, TRUE, "Source Server %s already requested, not changing mode\n", (to_mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) ? "ACTIVATE" : "DEACTIVATE"); return (ABNORMAL_SHUTDOWN); } if (((GTMSOURCE_MODE_ACTIVE == jnlpool.gtmsource_local->mode) && (GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode)) || ((GTMSOURCE_MODE_PASSIVE == jnlpool.gtmsource_local->mode) && (GTMSOURCE_MODE_PASSIVE_REQUESTED == to_mode))) { repl_log(stderr, FALSE, TRUE, "Source Server already %s, not changing mode\n", (to_mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) ? "ACTIVE" : "PASSIVE"); return (ABNORMAL_SHUTDOWN); } assert(ROOTPRIMARY_UNSPECIFIED != gtmsource_options.rootprimary); /*check if the new log file is writable*/ if ('\0' != gtmsource_options.log_file[0] && 0 != STRCMP(jnlpool.gtmsource_local->log_file, gtmsource_options.log_file)) { OPENFILE3(gtmsource_options.log_file, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, log_fd); if (log_fd < 0) { save_errno = ERRNO; err_code = STRERROR(save_errno); gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(8) ERR_REPLLOGOPN, 6, LEN_AND_STR(gtmsource_options.log_file), LEN_AND_STR(err_code), LEN_AND_STR(NULL_DEVICE)); return (ABNORMAL_SHUTDOWN); } CLOSEFILE_IF_OPEN(log_fd, close_status); assert(close_status==0); } if ((GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode) && (ROOTPRIMARY_SPECIFIED == gtmsource_options.rootprimary) && jnlpool.jnlpool_ctl->upd_disabled) { /* ACTIVATE is specified with ROOTPRIMARY on a journal pool that was created with PROPAGATEPRIMARY. This is a * case of transition from propagating primary to root primary. Enable updates in this journal pool and append * a histinfo record to the replication instance file. The function "gtmsource_rootprimary_init" does just that. */ gtmsource_rootprimary_init(jnlpool.jnlpool_ctl->jnl_seqno); } DEBUG_ONLY(repl_csa = &FILE_INFO(jnlpool.jnlpool_dummy_reg)->s_addrs;)