diff --git a/Makefile b/Makefile index 2611886f73..31dc50b243 100644 --- a/Makefile +++ b/Makefile @@ -136,6 +136,12 @@ neon-pg-ext-%: postgres-% -C $(POSTGRES_INSTALL_DIR)/build/neon-test-utils-$* \ -f $(ROOT_PROJECT_DIR)/pgxn/neon_test_utils/Makefile install +.PHONY: +neon-pg-ext-walproposer: + $(MAKE) PG_CONFIG=$(POSTGRES_INSTALL_DIR)/v15/bin/pg_config CFLAGS='$(PG_CFLAGS) $(COPT)' \ + -C $(POSTGRES_INSTALL_DIR)/build/neon-v15 \ + -f $(ROOT_PROJECT_DIR)/pgxn/neon/Makefile install + .PHONY: neon-pg-ext-clean-% neon-pg-ext-clean-%: $(MAKE) PG_CONFIG=$(POSTGRES_INSTALL_DIR)/$*/bin/pg_config \ diff --git a/libs/walproposer/bindgen_deps.h b/libs/walproposer/bindgen_deps.h index 43fa15f38e..b73d8ef535 100644 --- a/libs/walproposer/bindgen_deps.h +++ b/libs/walproposer/bindgen_deps.h @@ -14,3 +14,5 @@ int TestFunc(int a, int b); void RunClientC(uint32_t serverId); + +void WalProposerRust(); \ No newline at end of file diff --git a/libs/walproposer/build.rs b/libs/walproposer/build.rs index 65f3db460f..f813eef09c 100644 --- a/libs/walproposer/build.rs +++ b/libs/walproposer/build.rs @@ -24,7 +24,7 @@ fn main() -> anyhow::Result<()> { // println!("cargo:rustc-link-lib=pgcommon_srv"); // println!("cargo:rustc-link-lib=pgport_srv"); println!("cargo:rustc-link-arg=-Wl,--start-group"); - println!("cargo:rustc-link-arg=-lwalproposer"); + println!("cargo:rustc-link-arg=-lsim"); println!("cargo:rustc-link-arg=-lpgport_srv"); println!("cargo:rustc-link-arg=-lpostgres"); println!("cargo:rustc-link-arg=-lpgcommon_srv"); @@ -35,6 +35,7 @@ fn main() -> anyhow::Result<()> { println!("cargo:rustc-link-arg=-lrt"); println!("cargo:rustc-link-arg=-ldl"); println!("cargo:rustc-link-arg=-lm"); + println!("cargo:rustc-link-arg=-lwalproposer"); println!("cargo:rustc-link-arg=-Wl,--end-group"); // println!("cargo:rustc-flags=-C default-linker-libraries=y"); @@ -126,6 +127,7 @@ fn main() -> anyhow::Result<()> { .parse_callbacks(Box::new(CargoCallbacks)) .allowlist_function("TestFunc") .allowlist_function("RunClientC") + .allowlist_function("WalProposerRust") // .allowlist_function("WalProposerRust") // .clang_arg(format!("-I{inc_server_path}")) // .clang_arg(format!("-I{inc_pgxn_path}")) diff --git a/libs/walproposer/build.sh b/libs/walproposer/build.sh index af82afe10a..f440faa337 100755 --- a/libs/walproposer/build.sh +++ b/libs/walproposer/build.sh @@ -3,15 +3,17 @@ set -e # TODO: rewrite to Makefile -# make -C ../../ neon-pg-ext-v15 -s +make -C ../../ neon-pg-ext-walproposer -s # make -C ../../pg_install/build/v15/src/backend postgres-lib -s cp ../../pg_install/build/v15/src/backend/libpostgres.a . cp ../../pg_install/build/v15/src/common/libpgcommon_srv.a . cp ../../pg_install/build/v15/src/port/libpgport_srv.a . -clang -g -c -o test.o test.c -ferror-limit=1 -I ../../pg_install/v15/include/postgresql/server -rm -rf libwalproposer.a -ar rcs libwalproposer.a test.o +clang -g -c libpqwalproposer.c test.c -ferror-limit=1 -I ../../pg_install/v15/include/postgresql/server -I ../../pgxn/neon +rm -rf libsim.a +ar rcs libsim.a test.o libpqwalproposer.o -rm -rf libwalproposer2.a -ar rcs libwalproposer2.a ../../pg_install/build/neon-v15/*.o +rm -rf libwalproposer.a + +PGXN_DIR=../../pg_install/build/neon-v15/ +ar rcs libwalproposer.a $PGXN_DIR/walproposer.o $PGXN_DIR/walproposer_utils.o $PGXN_DIR/neon.o diff --git a/libs/walproposer/libpqwalproposer.c b/libs/walproposer/libpqwalproposer.c new file mode 100644 index 0000000000..4c0f0f49fa --- /dev/null +++ b/libs/walproposer/libpqwalproposer.c @@ -0,0 +1,110 @@ +#include "postgres.h" +#include "neon.h" +#include "walproposer.h" + +/* Header in walproposer.h -- Wrapper struct to abstract away the libpq connection */ +struct WalProposerConn +{ +}; + +/* Helper function */ +static bool +ensure_nonblocking_status(WalProposerConn *conn, bool is_nonblocking) +{ + elog(INFO, "not implemented"); + return false; +} + +/* Exported function definitions */ +char * +walprop_error_message(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return NULL; +} + +WalProposerConnStatusType +walprop_status(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return WP_CONNECTION_OK; +} + +WalProposerConn * +walprop_connect_start(char *conninfo) +{ + elog(INFO, "not implemented"); + return NULL; +} + +WalProposerConnectPollStatusType +walprop_connect_poll(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return WP_CONN_POLLING_OK; +} + +bool +walprop_send_query(WalProposerConn *conn, char *query) +{ + elog(INFO, "not implemented"); + return false; +} + +WalProposerExecStatusType +walprop_get_query_result(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return WP_EXEC_SUCCESS_COPYBOTH; +} + +pgsocket +walprop_socket(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return 0; +} + +int +walprop_flush(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); + return 0; +} + +void +walprop_finish(WalProposerConn *conn) +{ + elog(INFO, "not implemented"); +} + +/* + * Receive a message from the safekeeper. + * + * On success, the data is placed in *buf. It is valid until the next call + * to this function. + */ +PGAsyncReadResult +walprop_async_read(WalProposerConn *conn, char **buf, int *amount) +{ + elog(INFO, "not implemented"); + return PG_ASYNC_READ_FAIL; +} + +PGAsyncWriteResult +walprop_async_write(WalProposerConn *conn, void const *buf, size_t size) +{ + elog(INFO, "not implemented"); + return PG_ASYNC_WRITE_FAIL; +} + +/* + * This function is very similar to walprop_async_write. For more + * information, refer to the comments there. + */ +bool +walprop_blocking_write(WalProposerConn *conn, void const *buf, size_t size) +{ + elog(INFO, "not implemented"); + return false; +} diff --git a/libs/walproposer/src/test.rs b/libs/walproposer/src/test.rs index 7fd2a58ac1..9fb0fcffc4 100644 --- a/libs/walproposer/src/test.rs +++ b/libs/walproposer/src/test.rs @@ -1,4 +1,4 @@ -use crate::bindings::{TestFunc, RunClientC}; +use crate::bindings::{TestFunc, RunClientC, WalProposerRust}; #[test] fn test_rust_c_calls() { @@ -8,5 +8,6 @@ fn test_rust_c_calls() { #[test] fn test_sim_bindings() { - unsafe { RunClientC(0); } + // unsafe { RunClientC(0); } + unsafe { WalProposerRust(); } } diff --git a/pgxn/neon/walproposer.c b/pgxn/neon/walproposer.c index 1b34e5291d..24689a3e24 100644 --- a/pgxn/neon/walproposer.c +++ b/pgxn/neon/walproposer.c @@ -318,6 +318,7 @@ nwp_shmem_startup_hook(void) void WalProposerRust() { + MemoryContextInit(); elog(LOG, "WalProposerRust"); }