Does PostgreSQL use atomic file creation of FS?

2018-12-12 Thread Dmitry Lazurkin
Hello.

Does PostgreSQL use atomic file creation on FS? How does PostgreSQL
catch situation when system crashes between open call and write call? I
am interesting in this because I would like use PostgreSQL on network
file system.

Thank you.





Re: Does PostgreSQL use atomic file creation of FS?

2018-12-12 Thread Dmitry Lazurkin
Thank you. But I have read this. I said about network file system only
for example. I would like to known how PostgreSQL handles this specific
case (of course if someone knowns a answer):

fd = open(file, "w");
write(fd, data);
// crash and now I have empty file which isn't correct
fsync(fd);

PS. I think PostgreSQL doesn't have this problem.

On 12/12/18 15:37, Karsten Hilbert wrote:
> On Wed, Dec 12, 2018 at 02:48:12PM +0300, Dmitry Lazurkin wrote:
>
>> Does PostgreSQL use atomic file creation on FS? How does PostgreSQL
>> catch situation when system crashes between open call and write call? I
>> am interesting in this because I would like use PostgreSQL on network
>> file system.
> I doubt we can get more certainty than this:
>
>   
> https://www.postgresql.org/docs/devel/creating-cluster.html#CREATING-CLUSTER-NFS
>
> Best,
> Karsten






Implementation of gtrgm_out for gevel

2017-11-23 Thread Dmitry Lazurkin
Hello.

I want use gevel (http://www.sai.msu.su/~megera/wiki/Gevel) for investigation 
of pg_trgm gist. But for gist_print i need implement gtrgm_out for pg_trgm gist 
node. And i have a problem here.

-

My version:

PostgreSQL 9.6.6 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 
5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609, 64-bit

-

Function:

Datum
gtrgm_out(PG_FUNCTION_ARGS)
{
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry is 
pointer to bad memory */
    char       *result;
    char    buf[1024];

    if (entry->leafkey) /* Why leafkey is always true and has strange value? */
    {   
/* This is from gtrgm_compress */ 

/* text *val = DatumGetTextPP(entry->key); <-- Segfault here */
        /* result = strndup(VARDATA_ANY(val), VARSIZE_ANY_EXHDR(val)); */
        sprintf(buf, "leafkey %c", entry->leafkey);
    }
    else
    {
        sprintf(buf, "leafkey %c", entry->leafkey);
    }

    result = pstrdup(buf);
    PG_RETURN_CSTRING(result);
}

-

Call gtrgm_out:

select * from gist_print('test1_trgm') as t(level int, valid bool, a gtrgm);
 level | valid |  a
---+---+--
 1 | t | leafkey \x7F
 2 | t | leafkey \x7F
 ...
 2 | t | leafkey v
 ...
 2 | t | leafkey \x7F
 ...
 2 | t | leafkey v
 2 | t | leafkey \x7F
 ...

Can anyone give me some advice? 

Thanks.



Re: Implementation of gtrgm_out for gevel

2017-11-23 Thread Dmitry Lazurkin
On 23.11.2017 21:58, Tom Lane wrote:
> Dmitry Lazurkin  writes:
>> Datum
>> gtrgm_out(PG_FUNCTION_ARGS)
>> {
>>     GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry 
>> is pointer to bad memory */
> The argument is TRGM *, I think ... certainly not GISTENTRY *.
>
>   regards, tom lane

Hmm. I will try to debug gist_print.








Re: Implementation of gtrgm_out for gevel

2017-11-24 Thread Dmitry Lazurkin
On 11/23/2017 09:58 PM, Tom Lane wrote:
> Dmitry Lazurkin  writes:
>> Datum
>> gtrgm_out(PG_FUNCTION_ARGS)
>> {
>>     GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0); /* I think entry 
>> is pointer to bad memory */
> The argument is TRGM *, I think ... certainly not GISTENTRY *.
>
>   regards, tom lane

You are right. Thank you.