I think all the locking already handled properly by creating dummy backend in PGPROC, as it done in usual postgres 2pc implementation.
On the downstream, yes. But what about the decoding, reorder buffer and output plugin? They access the relcache etc. If you changed the structure of a table in a prepared xact you have to make sure you get that right.
Just checked DDL with following scenario:
* prepare tx that inserts a row in table on master * execute DROP TABLE on pglogical slave * commit prepared on master
Now it behaves as expected — slave blocks DROP TABLE until commit prepared on master.
Try doing DDL in the prepared xact on the upstream side, especially things that make structural changes to tables. Test both things that do full-table rewrites (alter table ... add column ... default not null) and things that don't (alter table ... drop column ; alter table ... add column ...; without not null or default).