diff --git a/.gitignore b/.gitignore index e7dcb2c..a0860c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,13 @@ -dbz-engine/target/ +# Generated binaries *.o *.so +*.bc + +dbz-engine/target/ testenv/olr/oradata/ testenv/olr/checkpoint/ testenv/olr/olrswap/ src/test/pytests/synchdbtests/__pycache__/ src/test/pytests/synchdbtests/t/__pycache__/ src/backend/debezium/target/ -synchdb_testdir/ +synchdb_testdir/ \ No newline at end of file diff --git a/Makefile b/Makefile index 22b89d0..086f365 100644 --- a/Makefile +++ b/Makefile @@ -182,3 +182,11 @@ oraclecheck-benchmark: olrcheck-benchmark: $(MAKE) dbcheck-tpcc DB=olr +.PHONY: clean_bc +clean_bc: + rm -rf $(patsubst %.o,%.bc, $(OBJS)) + +clean: clean_bc clean_dbz +ifeq ($(WITH_OLR), 1) +clean: clean_oracle_parser +endif diff --git a/src/backend/debezium/pom.xml b/src/backend/debezium/pom.xml index 5a73049..1e65f3c 100644 --- a/src/backend/debezium/pom.xml +++ b/src/backend/debezium/pom.xml @@ -4,7 +4,7 @@ com.example dbz-engine jar - 1.0.0 + 1.1.0 dbz-engine http://maven.apache.org diff --git a/src/backend/debezium/src/main/java/com/example/DebeziumRunner.java b/src/backend/debezium/src/main/java/com/example/DebeziumRunner.java index 8100cfb..45f0b4b 100644 --- a/src/backend/debezium/src/main/java/com/example/DebeziumRunner.java +++ b/src/backend/debezium/src/main/java/com/example/DebeziumRunner.java @@ -1300,6 +1300,25 @@ public void jvmMemDump() { checkMemoryStatus(); } + + public void changeLogLevel(int level) + { + switch (level) + { + case LOG_LEVEL_ALL: logger.setLevel(Level.ALL); break; + case LOG_LEVEL_DEBUG: logger.setLevel(Level.DEBUG); break; + case LOG_LEVEL_INFO: logger.setLevel(Level.INFO); break; + case LOG_LEVEL_ERROR: logger.setLevel(Level.ERROR); break; + case LOG_LEVEL_FATAL: logger.setLevel(Level.FATAL); break; + case LOG_LEVEL_OFF: logger.setLevel(Level.OFF); break; + case LOG_LEVEL_TRACE: logger.setLevel(Level.TRACE); break; + default: + case LOG_LEVEL_UNDEF: + case LOG_LEVEL_WARN: logger.setLevel(Level.WARN); break; + } + logger.warn("DBZ log level changed to " + logger.getLevel()); + } + public static void main(String[] args) { /* testing code can be put here */ diff --git a/src/backend/synchdb/synchdb.c b/src/backend/synchdb/synchdb.c index bbfc6ae..5a4fda9 100644 --- a/src/backend/synchdb/synchdb.c +++ b/src/backend/synchdb/synchdb.c @@ -86,6 +86,7 @@ PG_FUNCTION_INFO_V1(synchdb_add_infinispan); PG_FUNCTION_INFO_V1(synchdb_del_infinispan); PG_FUNCTION_INFO_V1(synchdb_translate_datatype); PG_FUNCTION_INFO_V1(synchdb_set_snapstats); +PG_FUNCTION_INFO_V1(synchdb_set_dbz_loglevel); /* Global variables */ SynchdbSharedState *sdb_state = NULL; /* Pointer to shared-memory state. */ @@ -1244,6 +1245,38 @@ dbz_engine_memory_dump(void) (*env)->CallVoidMethod(env, obj, jvmMemDump); } +/** + * dbz_engine_set_loglevel - Set Debezium log level + * + * This function set Debezium runner's log level during run time + */ +static int +dbz_engine_set_loglevel(int level) +{ + jmethodID changeLogLevel; + + if (!jvm) + { + elog(WARNING, "jvm not initialized"); + return -1; + } + if (!env) + { + elog(WARNING, "jvm env not initialized"); + return -1; + } + + changeLogLevel = (*env)->GetMethodID(env, cls, "changeLogLevel", "(I)V"); + if (changeLogLevel == NULL) + { + elog(WARNING, "Failed to find changeLogLevel method"); + return -1; + } + + (*env)->CallVoidMethod(env, obj, changeLogLevel, level); + return 0; +} + /* * synchdb_state_tupdesc - Create a TupleDesc for SynchDB state information * @@ -1476,6 +1509,8 @@ connectorStateAsString(ConnectorState state) return "schema sync"; case STATE_RELOAD_OBJMAP: return "reloading objmap"; + case STATE_DBZ_LOGLEVEL_UPDATE: + return "updating dbz log level"; } return "UNKNOWN"; } @@ -1843,6 +1878,16 @@ processRequestInterrupt(ConnectionInfo *connInfo, ConnectorType type, int connec fc_load_objmap(connInfo->name, type); set_shm_connector_state(connectorId, oldstate); } + else if (reqcopy->reqstate == STATE_DBZ_LOGLEVEL_UPDATE) + { + ConnectorState oldstate = get_shm_connector_state_enum(connectorId); + int level = atoi(reqcopy->reqdata); + + elog(LOG, "Updating log level for %s connector to %d", connInfo->name, level); + set_shm_connector_state(connectorId, STATE_DBZ_LOGLEVEL_UPDATE); + dbz_engine_set_loglevel(level); + set_shm_connector_state(connectorId, oldstate); + } else { /* unsupported request state combinations */ @@ -6558,3 +6603,81 @@ synchdb_set_snapstats(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } + +/* +* synchdb_set_dbz_loglevel +* +* This function dynamically changes the Debezium log4j log level at runtime +* for the specified connector without requiring a restart. +*/ +Datum +synchdb_set_dbz_loglevel(PG_FUNCTION_ARGS) +{ + int connectorId = -1; + pid_t pid; + SynchdbRequest *req; + int level; + text *level_text; + char *level_str; + + Name name = PG_GETARG_NAME(0); + level_text = PG_GETARG_TEXT_PP(1); + level_str = text_to_cstring(level_text); + + /* Convert level string to integer */ + if (pg_strcasecmp(level_str, "all") == 0) + level = LOG_LEVEL_ALL; + else if (pg_strcasecmp(level_str, "debug") == 0) + level = LOG_LEVEL_DEBUG; + else if (pg_strcasecmp(level_str, "info") == 0) + level = LOG_LEVEL_INFO; + else if (pg_strcasecmp(level_str, "warn") == 0) + level = LOG_LEVEL_WARN; + else if (pg_strcasecmp(level_str, "error") == 0) + level = LOG_LEVEL_ERROR; + else if (pg_strcasecmp(level_str, "fatal") == 0) + level = LOG_LEVEL_FATAL; + else if (pg_strcasecmp(level_str, "off") == 0) + level = LOG_LEVEL_OFF; + else if (pg_strcasecmp(level_str, "trace") == 0) + level = LOG_LEVEL_TRACE; + else + ereport(ERROR, + (errmsg("invalid log level \"%s\"", level_str), + errhint("Valid levels: all, trace, debug, info, warn, error, fatal, off"))); + + synchdb_init_shmem(); + if (!sdb_state) + ereport(ERROR, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("failed to init or attach to synchdb shared memory"))); + + connectorId = get_shm_connector_id_by_name(NameStr(*name), get_database_name(MyDatabaseId)); + if (connectorId < 0) + ereport(ERROR, + (errmsg("dbz connector (%s) does not have connector ID assigned", + NameStr(*name)), + errhint("use synchdb_start_engine_bgw() to assign one first"))); + + pid = get_shm_connector_pid(connectorId); + if (pid == InvalidPid) + ereport(ERROR, + (errmsg("dbz connector (%s) is not running", NameStr(*name)), + errhint("use synchdb_start_engine_bgw() to start a worker first"))); + + req = &(sdb_state->connectors[connectorId].req); + if (req->reqstate != STATE_UNDEF) + ereport(ERROR, + (errmsg("an active request is currently active for connector %s", + NameStr(*name)), + errhint("wait for it to finish and try again later"))); + + LWLockAcquire(&sdb_state->lock, LW_EXCLUSIVE); + req->reqstate = STATE_DBZ_LOGLEVEL_UPDATE; + snprintf(req->reqdata, SYNCHDB_ERRMSG_SIZE, "%d", level); + LWLockRelease(&sdb_state->lock); + + elog(WARNING, "sent loglevel update request to dbz connector (%s): %s", + NameStr(*name), level_str); + PG_RETURN_INT32(0); +} \ No newline at end of file diff --git a/src/include/synchdb/synchdb.h b/src/include/synchdb/synchdb.h index ce2be83..058e5ee 100644 --- a/src/include/synchdb/synchdb.h +++ b/src/include/synchdb/synchdb.h @@ -68,7 +68,7 @@ */ #define SYNCHDB_METADATA_DIR "pg_synchdb" -#define DBZ_ENGINE_JAR_FILE "dbz-engine-1.0.0.jar" +#define DBZ_ENGINE_JAR_FILE "dbz-engine-1.1.0.jar" #define ORACLE_RAW_PARSER_LIB "libsynchdb_oracle_parser.so" #define MAX_PATH_LENGTH 1024 #define MAX_JAVA_OPTION_LENGTH 256 @@ -119,8 +119,9 @@ typedef enum _connectorState STATE_OFFSET_UPDATE,/* in this state when user requests offset update */ STATE_RESTARTING, /* connector is restarting with new snapshot mode */ STATE_MEMDUMP, /* connector is dumping jvm heap memory info */ - STATE_SCHEMA_SYNC_DONE, /* connect has completed schema sync as requested */ - STATE_RELOAD_OBJMAP, /* connect is reloading object mapping */ + STATE_SCHEMA_SYNC_DONE, /* connector has completed schema sync as requested */ + STATE_RELOAD_OBJMAP, /* connector is reloading object mapping */ + STATE_DBZ_LOGLEVEL_UPDATE, /* connector is updating debezium log4j log level */ } ConnectorState; /** diff --git a/synchdb--1.0.sql b/synchdb--1.0.sql index c83e522..9ff45b2 100644 --- a/synchdb--1.0.sql +++ b/synchdb--1.0.sql @@ -43,6 +43,10 @@ CREATE OR REPLACE FUNCTION synchdb_log_jvm_meminfo(name) RETURNS int AS '$libdir/synchdb' LANGUAGE C IMMUTABLE STRICT; +CREATE OR REPLACE FUNCTION synchdb_set_dbz_loglevel(name, text) RETURNS int +AS '$libdir/synchdb' +LANGUAGE C IMMUTABLE STRICT; + CREATE OR REPLACE FUNCTION synchdb_get_stats() RETURNS SETOF record AS '$libdir/synchdb' LANGUAGE C IMMUTABLE STRICT;