powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [хочу странного] как удостовериться в отсутствии конкурентов в моменте
4 сообщений из 29, страница 2 из 2
[хочу странного] как удостовериться в отсутствии конкурентов в моменте
    #39053331
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

вы не может просто ничего написать.

1) ваша попытка была изначально не верна по сути, так как вы не знали, про то, что pg_stat_activity показывает не "синхронное" с запросом состояние бекендов.

2) вы не может делать alter table и это вас якобы ограничивает. ну ок, вы не разобрались, как делать нормально альтер тейбл в постгресе (без локов видимо, а возможно вы и не понимаете какие локи на таблицы и как накладываются), и лондайст тут не при чем, так как он позволяет всё делать очень даже нормально, но вы тоже видимо не доразобрались.
https://wiki.postgresql.org/wiki/Londiste_Tutorial_(Skytools_2)
https://wiki.postgresql.org/wiki/Londiste_Tutorial_(Skytools_2)#Adding_a_column_to_a_replicated_table
Adding a column to a replicated table
This case is handled in a simple process:
1. add the column on all the subscribers
2. BEGIN; -- on the provider
3. add the column on the provider
4. SELECT londiste.provider_refresh_trigger('queue_name', 'tablename');
5. COMMIT;

// с пункта 2 по 5 процесса (рекомендация для любого альтера, а для пункта 1 может быть не важно, так как один поток репликационного консумера может подождать спокойно) нужен контроль блокировок set statement timeout и set deadlock timeout, последний для отстрела вакуума параллельного

3) вы вроде отвергли предложение о "батчах как в банках" так как там можно получить "большие батчи", но! ваше предложение с гипотетическим "отловом" подходящих моментов тоже может долго (и даже бесконечно долго) не находить "подходящего" момента --- и "большой батч" опять появится


ну и успехов, пишите еще, да
...
Рейтинг: 0 / 0
[хочу странного] как удостовериться в отсутствии конкурентов в моменте
    #39053467
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

ой деточка, ну не надо так дуться
мало ли, что вам не понятно
так вы все нервные клетки порастратите
...
Рейтинг: 0 / 0
[хочу странного] как удостовериться в отсутствии конкурентов в моменте
    #39055601
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,
можете радоваться.

макетик в работу не пойдёт.
хотя работает как часики.

не пойдёт не потому, что "большие батчи" -- [вы как -- то удивительно тупо читаете, не различая параллельно рассматриваемых кейсов] -- батчи я волен нарезать сам. любые из диапазона.

и не потому, что "может бесконечно долго"-- пауза равна длине пишущей транзакции, паузы не складываются. даже когда транзакции "накладываются" по времени. (тестил, а не только по идеологии)

--100 секундную задержку догоняет махом.

а потому, что нет гарантии что нам не захочется иметь когда--то в том же месте одну долгую транзакцию, более долгую, чем мы согласны будем терпеть в реплике.
а отфильтровать транзакции по автору в снапшоте -- нет возможности. (или я пока не знаю -- как).
как -- то так.

т.е. штучка получилась для очень узкоспецифичной задачи.
...
Рейтинг: 0 / 0
[хочу странного] как удостовериться в отсутствии конкурентов в моменте
    #39057242
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гнусный хак, позволяющий (с оговорками на "сабтранзакции" и точку замыкания xid) отстроится от "чужих" долгих транзакций :

// повторяю, считается что в канале фиксации идут только insert, и канал имеет именованного пользователя. не занимающегося больше ничем.

гнуснокод
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
-- Function: _my_txid_snapshot_xmin()
-- DROP FUNCTION _my_txid_snapshot_xmin();

CREATE OR REPLACE FUNCTION _my_txid_snapshot_xmin(p_writer	name DEFAULT 'sensor')
  RETURNS bigint AS
$BODY$
WITH in_process (txi) AS (SELECT txid_snapshot_xip(txid_current_snapshot()))
,not_writer_assync as -- ? move in dblink -- for no cash reed
	(SELECT 
		(backend_xid::text)::bigint 
			+ 4294967296::bigint *(txid_snapshot_xmin(txid_current_snapshot()) /4294967296::bigint)
			AS txi --
	FROM pg_stat_activity 
		WHERE usename <>p_writer AND backend_xid IS NOT NULL AND datname=current_database()
	)
	
SELECT min(txi) FROM 
	(SELECT txi FROM in_process
	EXCEPT
	SELECT txi from not_writer_assync) FOO

;
$BODY$
  LANGUAGE sql VOLATILE SECURITY DEFINER
  COST 100; 



и соответственно регистрация тика:
"тикер"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CREATE OR REPLACE FUNCTION _tick()
  RETURNS bigint AS
$xxx$
WITH def (txmax, max_id) AS 
	(SELECT txid_snapshot_xmax(txid_current_snapshot()),_max_id())
	
,d AS (
	INSERT INTO tick
		(txmax, max_id)
	(SELECT txmax, max_id FROM def
	EXCEPT
	SELECT txmax, max_id FROM tick ORDER BY txmax desc limit 1)
	RETURNING txmax, max_id
	)
,u AS (UPDATE tick t SET max_id = def.max_id
	FROM def WHERE def.txmax=t.txmax
	RETURNING t.txmax, t.max_id
	)
,visible AS (
	SELECT max_id ,t.txmax FROM tick t
	WHERE 
		--t.txmax < txid_snapshot_xmin(txid_current_snapshot())
		(t.txmax < _my_txid_snapshot_xmin()
				OR _my_txid_snapshot_xmin() IS NULL)		
		AND txid_visible_in_snapshot(t.txmax, txid_current_snapshot())
	ORDER BY t.txmax DESC LIMIT 1
	)
,del AS (DELETE FROM  tick t 
	WHERE t.txmax <= (SELECT v.txmax FROM visible v)
	RETURNING txmax
	)
,calc AS (SELECT
		GREATEST(coalesce(
				(SELECT v.max_id FROM visible v),0)
				,(SELECT last_value FROM max_id_to_load /* + advisory 'max_id_to_load'::regclass*/)
				,(SELECT last_value FROM max_id_loaded)
			) AS calc_to
			,(SELECT last_value FROM max_id_to_load) AS current_to
		) 
SELECT case WHEN calc_to > current_to THEN
			setval('max_id_to_load'::regclass ,calc_to)
		ELSE calc_to
		END
FROM calc
;
$xxx$
	LANGUAGE sql VOLATILE
	COST 100;



-- понятно, что такие хаки моя совать в работу не будет
но тесты показывают -- что фигачит как часы. если долгие "чужие" конкуренты простые, без т.н. "сабтранзов". [печаль]


вот жешь и сверло с винтом сыскалося
из овна слепленное, но фурыкает, как не странно
ещё бы и переключалку с простого исчисления на сложное -- чтобы в пустую стат--активити не опрашивать и вообще крысота б была
куда--нть в рисковое место запихать, с необязательной доставкой, что ли -- для опытов.
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [хочу странного] как удостовериться в отсутствии конкурентов в моменте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]