diff --git a/src/gausskernel/process/postmaster/pgaudit.cpp b/src/gausskernel/process/postmaster/pgaudit.cpp index 078ae09ba..86adae315 100755 --- a/src/gausskernel/process/postmaster/pgaudit.cpp +++ b/src/gausskernel/process/postmaster/pgaudit.cpp @@ -807,11 +807,11 @@ void pgaudit_stop_all(void) { for (int i = 0; i < g_instance.audit_cxt.thread_num; ++i) { if (g_instance.pid_cxt.PgAuditPID[i] != 0) { + Assert(!dummyStandbyMode); signal_child(g_instance.pid_cxt.PgAuditPID[i], SIGQUIT, -1); } } audit_process_cxt_exit(); - ereport(LOG, (errmsg("parameter audit_enabled is set to false, terminate auditor process."))); } /* @@ -2416,7 +2416,7 @@ static void pgaudit_indextbl_init_new(void) return; } -static void pgaudit_udpate_maxnum() +static void pgaudit_update_maxnum() { errno_t errorno = EOK; int thread_num = g_instance.attr.attr_security.audit_thread_num; @@ -2428,15 +2428,19 @@ static void pgaudit_udpate_maxnum() /* curidx and latest_idx should be updated later from old index table file */ new_indextbl->begidx = 0; new_indextbl->maxnum = u_sess->attr.attr_security.Audit_RemainThreshold + 1; + new_indextbl->last_audit_time = g_instance.audit_cxt.audit_indextbl->last_audit_time; + new_indextbl->thread_num = g_instance.audit_cxt.audit_indextbl->thread_num; if (g_instance.audit_cxt.audit_indextbl->count > 0) { AuditIndexItem *item = NULL; uint32 latest_idx = g_instance.audit_cxt.audit_indextbl->latest_idx; + uint32 last_idx = (latest_idx == 0) ? (g_instance.audit_cxt.audit_indextbl->maxnum - 1): (latest_idx - 1); uint32 index = g_instance.audit_cxt.audit_indextbl->begidx; uint32 pos = new_indextbl->begidx; do { item = g_instance.audit_cxt.audit_indextbl->data + index; - errorno = memcpy_s(new_indextbl->data + pos, (new_indextbl_data_lenth - pos), item, sizeof(AuditIndexItem)); + errorno = memcpy_s(new_indextbl->data + pos, (new_indextbl_data_lenth - (pos * sizeof(AuditIndexItem))), + item, sizeof(AuditIndexItem)); securec_check(errorno, "\0", "\0"); new_indextbl->count++; @@ -2444,11 +2448,11 @@ static void pgaudit_udpate_maxnum() * finished copy old index table file from range [begin, latest_idx) * then update new index table file curidxes */ - if (index == (latest_idx - 1)) { + if (index == last_idx) { for (int i = 0; i < thread_num; ++i) { - new_indextbl->curidx[i] = pos - thread_num + i; + new_indextbl->curidx[i] = pos - thread_num + 1 + i; } - new_indextbl->latest_idx = pos; + new_indextbl->latest_idx = pos + 1; break; } @@ -2486,7 +2490,7 @@ static void pgaudit_reset_indexfile() /* If file remain threshold parameter changed, than copy the old audit index table to the new table */ if (old_maxnum != (uint32)u_sess->attr.attr_security.Audit_RemainThreshold + 1) { LWLockAcquire(g_instance.audit_cxt.index_file_lock, LW_EXCLUSIVE); - pgaudit_udpate_maxnum(); + pgaudit_update_maxnum(); LWLockRelease(g_instance.audit_cxt.index_file_lock); } @@ -2995,17 +2999,19 @@ Datum pg_query_audit(PG_FUNCTION_ARGS) * load the index audit table from global index audit table instance * then use the local thread one when iterate all audit files */ + pgaudit_read_indexfile(audit_dir); LWLockAcquire(g_instance.audit_cxt.index_file_lock, LW_SHARED); - t_thrd.audit.audit_indextbl = NULL; - int indextbl_len = - (u_sess->attr.attr_security.Audit_RemainThreshold + 1) * sizeof(AuditIndexItem) + indextbl_header_size; - t_thrd.audit.audit_indextbl = (AuditIndexTableNew *)palloc0(indextbl_len); - error_t errorno = - memcpy_s(t_thrd.audit.audit_indextbl, indextbl_len, g_instance.audit_cxt.audit_indextbl, indextbl_len); - securec_check(errorno, "\0", "\0"); - + pfree_ext(t_thrd.audit.audit_indextbl); + if (g_instance.audit_cxt.audit_indextbl != NULL) { + int indextbl_len = + (u_sess->attr.attr_security.Audit_RemainThreshold + 1) * sizeof(AuditIndexItem) + indextbl_header_size; + t_thrd.audit.audit_indextbl = (AuditIndexTableNew *)palloc0(indextbl_len); + error_t errorno = + memcpy_s(t_thrd.audit.audit_indextbl, indextbl_len, g_instance.audit_cxt.audit_indextbl, indextbl_len); + securec_check(errorno, "\0", "\0"); + } LWLockRelease(g_instance.audit_cxt.index_file_lock); - + per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); @@ -3016,8 +3022,6 @@ Datum pg_query_audit(PG_FUNCTION_ARGS) MemoryContextSwitchTo(oldcontext); - ereport(DEBUG1, - (errmsg("pg_query_audit count: %d indextbl_len: %d", t_thrd.audit.audit_indextbl->count, indextbl_len))); if (begtime < endtime && t_thrd.audit.audit_indextbl != NULL && t_thrd.audit.audit_indextbl->count > 0) { bool satisfied = false; uint32 index = 0; @@ -3072,14 +3076,17 @@ Datum pg_delete_audit(PG_FUNCTION_ARGS) * load the index audit table from global index audit table instance * then use the local thread one when iterate all audit files */ + pgaudit_read_indexfile(g_instance.attr.attr_security.Audit_directory); LWLockAcquire(g_instance.audit_cxt.index_file_lock, LW_SHARED); pfree_ext(t_thrd.audit.audit_indextbl); - int indextbl_len = - (u_sess->attr.attr_security.Audit_RemainThreshold + 1) * sizeof(AuditIndexItem) + indextbl_header_size; - t_thrd.audit.audit_indextbl = (AuditIndexTableNew *)palloc0(indextbl_len); - error_t errorno = - memcpy_s(t_thrd.audit.audit_indextbl, indextbl_len, g_instance.audit_cxt.audit_indextbl, indextbl_len); - securec_check(errorno, "\0", "\0"); + if (g_instance.audit_cxt.audit_indextbl != NULL) { + int indextbl_len = + (u_sess->attr.attr_security.Audit_RemainThreshold + 1) * sizeof(AuditIndexItem) + indextbl_header_size; + t_thrd.audit.audit_indextbl = (AuditIndexTableNew *)palloc0(indextbl_len); + error_t errorno = + memcpy_s(t_thrd.audit.audit_indextbl, indextbl_len, g_instance.audit_cxt.audit_indextbl, indextbl_len); + securec_check(errorno, "\0", "\0"); + } LWLockRelease(g_instance.audit_cxt.index_file_lock); int thread_num = g_instance.audit_cxt.thread_num; diff --git a/src/gausskernel/process/postmaster/postmaster.cpp b/src/gausskernel/process/postmaster/postmaster.cpp index 944036ea9..834ba9631 100644 --- a/src/gausskernel/process/postmaster/postmaster.cpp +++ b/src/gausskernel/process/postmaster/postmaster.cpp @@ -4670,9 +4670,9 @@ static void SIGHUP_handler(SIGNAL_ARGS) signal_child(g_instance.pid_cxt.SysLoggerPID, SIGHUP); /* signal the auditor process */ if (g_instance.pid_cxt.PgAuditPID != NULL) { - Assert(!dummyStandbyMode); for (int i = 0; i < g_instance.audit_cxt.thread_num; ++i) { if (g_instance.pid_cxt.PgAuditPID[i] != 0) { + Assert(!dummyStandbyMode); signal_child(g_instance.pid_cxt.PgAuditPID[i], SIGHUP); } } @@ -6074,7 +6074,6 @@ static void reaper(SIGNAL_ARGS) * nothing left for it to do. */ if (g_instance.pid_cxt.PgAuditPID != NULL) { - Assert(!dummyStandbyMode); pgaudit_stop_all(); } } else { @@ -6355,8 +6354,8 @@ static void reaper(SIGNAL_ARGS) if (g_instance.pid_cxt.PgAuditPID != NULL) { bool is_audit_thread = false; for (int i = 0; i < g_instance.audit_cxt.thread_num; ++i) { - Assert(!dummyStandbyMode); if (pid == g_instance.pid_cxt.PgAuditPID[i]) { + Assert(!dummyStandbyMode); g_instance.pid_cxt.PgAuditPID[i] = 0; is_audit_thread = true; if (!EXIT_STATUS_0(exitstatus)) @@ -7212,7 +7211,6 @@ static void PostmasterStateMachine(void) /* signal the auditor process */ if (g_instance.pid_cxt.PgAuditPID != NULL) { - Assert(!dummyStandbyMode); pgaudit_stop_all(); } diff --git a/src/gausskernel/storage/ipc/ipci.cpp b/src/gausskernel/storage/ipc/ipci.cpp index 832468591..0cd007b3e 100644 --- a/src/gausskernel/storage/ipc/ipci.cpp +++ b/src/gausskernel/storage/ipc/ipci.cpp @@ -463,6 +463,9 @@ void CreateSharedMemoryAndSemaphores(bool makePrivate, int port) MemoryContext oldcontext = MemoryContextSwitchTo(g_instance.audit_cxt.global_audit_context); int thread_num = g_instance.attr.attr_security.audit_thread_num; g_instance.pid_cxt.PgAuditPID = (ThreadId*)palloc0(sizeof(ThreadId) * thread_num); + if (g_instance.audit_cxt.index_file_lock == NULL) { + g_instance.audit_cxt.index_file_lock = LWLockAssign(LWTRANCHE_AUDIT_INDEX_WAIT); + } (void)MemoryContextSwitchTo(oldcontext); }