Re: Proposal: Snapshot cloning

Поиск
Список
Период
Сортировка
От Gregory Stark
Тема Re: Proposal: Snapshot cloning
Дата
Msg-id 87iretae8c.fsf@stark.xeocode.com
обсуждение исходный текст
Ответ на Re: Proposal: Snapshot cloning  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
"Tom Lane" <tgl@sss.pgh.pa.us> writes:

>>> set_current_snapshot() would have to sanity check that the xmin of the new
>>> snapshot isn't older than the current globaloldestxmin. 
>
>> That would solve the backend to backend IPC problem nicely.
>
> But it fails on the count of making sure that globaloldestxmin doesn't
> advance past the snap you want to use.  And exactly how will you pass
> a snap through a table?  It won't become visible until you commit ...
> whereupon your own xmin isn't blocking the advance of globaloldestxmin.

Hm, good point. You could always do it in a separate connection, but that
starts to get annoying. I was more envisioning passing it around out-of-band
though, something like:


$db->execute(SET TRANSACTION ISOLATION LEVEL SERIALIZABLE);
$snap = $db->execute(select current_snapshot());
 for each db {     if (fork())         $slave[i] = $db->connect();         $slave[i]->execute(select
set_snapshot($snap));        $slave[i]->execute(copy table[i] to file[i]); }
 


I'm also wondering about something like:
 $db->execute(SET TRANSACTION ISOLATION LEVEL SERIALIZABLE); $snap = $db->execute(select current_snapshot());
 if (fork())     $slave = $db->connect();     $slave->execute(select set_snapshot($snap);     $slave->execute(copy tab
fromhugefile);     signal parent } else {     while(no signal yet) {         $rows_loaded_so_far = $db->execute(select
count(*)from tab);         display_progress($rows_loaded_so_far);         sleep(60);     } }
 


Sorry for the vaguely perlish pseudocode but it's the clearest way I can think
to write it. I don't think it would make much sense to try to do anything like
this in plpgsql; I think you really do want to be doing it in a language
outside the database where it's easier to open multiple connections and handle
IPC.

I realize the second idea might take more hackery than just setting the
snapshot... In particular as written above it wouldn't work because the slave
would be writing with a new xid that isn't actually in the snapshot.

--  Gregory Stark EnterpriseDB          http://www.enterprisedb.com


В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Simon Riggs"
Дата:
Сообщение: Re: Proposal: Snapshot cloning
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Piggybacking vacuum I/O