UUID v7

Started by Andrey Borodinabout 3 years ago234 messages
Jump to latest
#1Andrey Borodin
amborodin@acm.org

Hello pgsql-hackers!

As you may know there's a new version of UUID being standardized [0]https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04.
These new algorithms of UUID generation are very promising for
database performance. It keeps data locality for time-ordered values.
From my POV v7 is especially needed for users. Current standard status
is "draft". And I'm not sure it will be accepted before our feature
freeze for PG16. Maybe we could provide a draft implementation in 16
and adjust it to the accepted version if the standard is changed? PFA
patch with implementation.

What do you think?

cc Brad Peabody and Kyzer R. Davis, authors of the standard
cc Kirk Wolak and Nik Samokhvalov who requested the feature

Thanks!

Best regards, Andrey Borodin.

[0]: https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04

Attachments:

v1-0001-Implement-UUID-v7-as-per-IETF-draft.patchapplication/octet-stream; name=v1-0001-Implement-UUID-v7-as-per-IETF-draft.patchDownload+72-2
#2Andres Freund
andres@anarazel.de
In reply to: Andrey Borodin (#1)
Re: UUID v7

Hi,

On 2023-02-10 15:57:50 -0800, Andrey Borodin wrote:

As you may know there's a new version of UUID being standardized [0].
These new algorithms of UUID generation are very promising for
database performance.

I agree it's very useful to have.

[0] https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04

That looks to not be the current version anymore, it's superseded by:
https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis

It keeps data locality for time-ordered values.
From my POV v7 is especially needed for users. Current standard status
is "draft". And I'm not sure it will be accepted before our feature
freeze for PG16. Maybe we could provide a draft implementation in 16
and adjust it to the accepted version if the standard is changed? PFA
patch with implementation.

Hm. It seems somewhat worrisome to claim something is a v7 UUID when it might
turn out to not be one.

Perhaps we should name the function something like
gen_time_ordered_random_uuid() instead? That gives us a bit more flexibility
about what uuid version we generate. And it might be easier for users, anyway.

Still not sure what version we'd best use for now. Perhaps v8?

Greetings,

Andres Freund

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#2)
Re: UUID v7

Andres Freund <andres@anarazel.de> writes:

On 2023-02-10 15:57:50 -0800, Andrey Borodin wrote:

From my POV v7 is especially needed for users. Current standard status
is "draft". And I'm not sure it will be accepted before our feature
freeze for PG16. Maybe we could provide a draft implementation in 16
and adjust it to the accepted version if the standard is changed? PFA
patch with implementation.

Hm. It seems somewhat worrisome to claim something is a v7 UUID when it might
turn out to not be one.

I think there is no need to rush this into v16. Let's wait for the
standardization process to play out.

regards, tom lane

#4Andrey Borodin
amborodin@acm.org
In reply to: Tom Lane (#3)
Re: UUID v7

On Fri, Feb 10, 2023 at 5:14 PM Andres Freund <andres@anarazel.de> wrote:

Perhaps we should name the function something like
gen_time_ordered_random_uuid() instead? That gives us a bit more flexibility
about what uuid version we generate. And it might be easier for users, anyway.

I think users would be happy with any name.

Still not sure what version we'd best use for now. Perhaps v8?

V8 is just a "custom data" format. Like "place whatever you want".
Though I agree that its sample implementation looks to be better.

On Fri, Feb 10, 2023 at 5:18 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Hm. It seems somewhat worrisome to claim something is a v7 UUID when it might
turn out to not be one.

I think there is no need to rush this into v16. Let's wait for the
standardization process to play out.

Standardization per se does not bring value to users. However, I agree
that eager users can just have it today as an extension and be happy
with it [0]https://github.com/x4m/pg_uuid_next.
Maybe it's fine to wait a year for others...

Best regards, Andrey Borodin.

[0]: https://github.com/x4m/pg_uuid_next

#5Peter Eisentraut
peter_e@gmx.net
In reply to: Andres Freund (#2)
Re: UUID v7

On 11.02.23 02:14, Andres Freund wrote:

On 2023-02-10 15:57:50 -0800, Andrey Borodin wrote:

As you may know there's a new version of UUID being standardized [0].
These new algorithms of UUID generation are very promising for
database performance.

I agree it's very useful to have.

[0] https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04

That looks to not be the current version anymore, it's superseded by:
https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis

Yes, this means that the draft that an individual had uploaded has now
been taken on by a working group for formal review. If there is a
prototype implementation, this is a good time to provide feedback. But
it's too early to ship a production version.

#6Kyzer Davis (kydavis)
kydavis@cisco.com
In reply to: Peter Eisentraut (#5)
RE: UUID v7

Hello Group,

I am happy to see others interested in the improvements provided by UUIDv7!

I caught up on the thread and you all are correct.

Work has moved on GitHub from uuid6/uuid6-ietf-draft to
ietf-wg-uuidrev/rfc4122bis
- Draft 00 merged RFC4122 with Draft 04 and fixed as many problems as possible
with RFC4122.
- Draft 01 continued to iterate on RFC4122 problems:
https://author-tools.ietf.org/iddiff?url2=draft-ietf-uuidrev-rfc4122bis-01
- Draft 02 items being changed are summarized in the latest PR for review in
the upcoming interim meeting (Feb 16th):
https://github.com/ietf-wg-uuidrev/rfc4122bis/pull/60
Note: Draft 02 should be published by the end of the week and long term we
have one more meeting at IETF 116 to iron out the replacement of RFC4122,
perform last call and submit to the IESG for official review and consideration
for replacement of RFC4122 (actual timeline for that varies based on what IESG
wants me to fix.)

That all being said:
The point is 99% of the work since adoption by the IETF has been ironing out
RFC4122's problems and nothing major related to UUIDv6/7/8 which are all in a
very good state.

If anybody has any feedback found during draft reviewing or prototyping;
please either email uuidrev@ietf.org or drop an issue on the tracker:
https://github.com/ietf-wg-uuidrev/rfc4122bis/issues

Lastly, I have added the C/SQL implementation to the prototypes page below:
https://github.com/uuid6/prototypes

Thanks!

-----Original Message-----
From: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Sent: Saturday, February 11, 2023 10:51 AM
To: Andres Freund <andres@anarazel.de>; Andrey Borodin <amborodin86@gmail.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>; brad@peabody.io;
wolakk@gmail.com; Kyzer Davis (kydavis) <kydavis@cisco.com>; Nikolay
Samokhvalov <samokhvalov@gmail.com>
Subject: Re: UUID v7

On 11.02.23 02:14, Andres Freund wrote:

On 2023-02-10 15:57:50 -0800, Andrey Borodin wrote:

As you may know there's a new version of UUID being standardized [0].
These new algorithms of UUID generation are very promising for
database performance.

I agree it's very useful to have.

[0]
https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid
-format-04

That looks to not be the current version anymore, it's superseded by:
https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis

Yes, this means that the draft that an individual had uploaded has now been
taken on by a working group for formal review. If there is a prototype
implementation, this is a good time to provide feedback. But it's too early
to ship a production version.

Attachments:

smime.p7sapplication/pkcs7-signature; name=smime.p7sDownload
#7Nikolay Samokhvalov
samokhvalov@gmail.com
In reply to: Kyzer Davis (kydavis) (#6)
Re: UUID v7

On Tue, Feb 14, 2023 at 6:13 AM Kyzer Davis (kydavis) <kydavis@cisco.com> wrote:

I am happy to see others interested in the improvements provided by UUIDv7!

Thank you for providing the details!

Some small updates as I see them:
- there is revision 7 now in https://github.com/ietf-wg-uuidrev/rfc4122bis
- noticing that there is no commitfest record, I created one:
https://commitfest.postgresql.org/43/4388/
- recent post by Ants Aasma, Cybertec about the downsides of
traditional UUID raised a big discussion today on HN:
https://news.ycombinator.com/item?id=36429986

#8Daniel Gustafsson
daniel@yesql.se
In reply to: Nikolay Samokhvalov (#7)
Re: UUID v7

On 22 Jun 2023, at 20:30, Nikolay Samokhvalov <samokhvalov@gmail.com> wrote:

Some small updates as I see them:
- there is revision 7 now in https://github.com/ietf-wg-uuidrev/rfc4122bis
- noticing that there is no commitfest record, I created one:

I will actually go ahead and close this entry in the current CF, not because we
don't want the feature but because it's unlikely that it will go in now given
that standardization is still underway. Comitting anything right now seems
premature, we might as well wait for standardization given that we have lots of
time before the v17 freeze.

--
Daniel Gustafsson

#9Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: Daniel Gustafsson (#8)
Re: UUID v7

On Thu, 6 Jul 2023 at 14:24, Daniel Gustafsson <daniel@yesql.se> wrote:

On 22 Jun 2023, at 20:30, Nikolay Samokhvalov <samokhvalov@gmail.com> wrote:

Some small updates as I see them:
- there is revision 7 now in https://github.com/ietf-wg-uuidrev/rfc4122bis
- noticing that there is no commitfest record, I created one:

I will actually go ahead and close this entry in the current CF, not because we
don't want the feature but because it's unlikely that it will go in now given
that standardization is still underway. Comitting anything right now seems
premature, we might as well wait for standardization given that we have lots of
time before the v17 freeze.

I'd like to note that this draft has recently had its last call
period, and has been proposed for publishing early last month. I don't
know how long this publishing process usually takes, but it seems like
the WG considers the text final, so unless this would take months I
wouldn't mind keeping this patch around as "waiting for external
process to complete". Sure, it's earlier than the actual release of
the standard, but that wasn't a blocker for SQL features that were
considered finalized either.

Kind regards,

Matthias van de Meent
Neon (https://neon.tech)

#10Daniel Gustafsson
daniel@yesql.se
In reply to: Matthias van de Meent (#9)
Re: UUID v7

On 6 Jul 2023, at 15:29, Matthias van de Meent <boekewurm+postgres@gmail.com> wrote:

On Thu, 6 Jul 2023 at 14:24, Daniel Gustafsson <daniel@yesql.se> wrote:

On 22 Jun 2023, at 20:30, Nikolay Samokhvalov <samokhvalov@gmail.com> wrote:

Some small updates as I see them:
- there is revision 7 now in https://github.com/ietf-wg-uuidrev/rfc4122bis
- noticing that there is no commitfest record, I created one:

I will actually go ahead and close this entry in the current CF, not because we
don't want the feature but because it's unlikely that it will go in now given
that standardization is still underway. Comitting anything right now seems
premature, we might as well wait for standardization given that we have lots of
time before the v17 freeze.

I'd like to note that this draft has recently had its last call
period, and has been proposed for publishing early last month.

Sure, but this document is in AD Evaluation and there are many stages left in
the IESG process, it may still take a fair bit of time before this is done.

Sure, it's earlier than the actual release of
the standard, but that wasn't a blocker for SQL features that were
considered finalized either.

I can't speak for any SQL standard features we've committed before being
standardized, it's for sure not the norm for the project. I'm only commenting
on this particular Internet standard which we have plenty of time to commit
before v17 without rushing to beat a standards committee.

Also, if you look you can see that I moved it to the next CF in a vague hope
that standardization will be swift (which is admittedly never is).

--
Daniel Gustafsson

#11Tom Lane
tgl@sss.pgh.pa.us
In reply to: Daniel Gustafsson (#10)
Re: UUID v7

Daniel Gustafsson <daniel@yesql.se> writes:

On 6 Jul 2023, at 15:29, Matthias van de Meent <boekewurm+postgres@gmail.com> wrote:

Sure, it's earlier than the actual release of
the standard, but that wasn't a blocker for SQL features that were
considered finalized either.

I can't speak for any SQL standard features we've committed before being
standardized, it's for sure not the norm for the project.

We have done a couple of things that way recently. An important
reason why we felt we could get away with that is that nowadays
we have people who actually sit on the SQL committee and have
reliable information on what's likely to make it into the final text
of the next version. I don't think we have equivalent visibility or
should have equivalent confidence about how UUID v7 standardization
will play out.

regards, tom lane

#12Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#11)
Re: UUID v7

On 06.07.23 16:02, Tom Lane wrote:

Daniel Gustafsson <daniel@yesql.se> writes:

On 6 Jul 2023, at 15:29, Matthias van de Meent <boekewurm+postgres@gmail.com> wrote:

Sure, it's earlier than the actual release of
the standard, but that wasn't a blocker for SQL features that were
considered finalized either.

I can't speak for any SQL standard features we've committed before being
standardized, it's for sure not the norm for the project.

We have done a couple of things that way recently. An important
reason why we felt we could get away with that is that nowadays
we have people who actually sit on the SQL committee and have
reliable information on what's likely to make it into the final text
of the next version. I don't think we have equivalent visibility or
should have equivalent confidence about how UUID v7 standardization
will play out.

(I have been attending some meetings and I'm on the mailing list.)

Anyway, I think it would be reasonable to review this patch now. We
might leave it hanging in "Ready for Committer" for a while when we get
there. But surely review can start now.

#13Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#12)
Re: UUID v7

On 6 Jul 2023, at 21:38, Peter Eisentraut <peter.eisentraut@enterprisedb.com> wrote:

I think it would be reasonable to review this patch now.

+1.

Also, I think we should discuss UUID v8. UUID version 8 provides an RFC-compatible format for experimental or vendor-specific use cases. Revision 1 of IETF draft contained interesting code for v8: almost similar to v7, but with fields for "node ID" and "rolling sequence number".
I think this is reasonable approach, thus I attach implementation of UUID v8 per [0]https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-01. But from my point of view this implementation has some flaws.
These two new fields "node ID" and "sequence" are there not for uniqueness, but rather for data locality.
But they are placed at the end, in bytes 14 and 15, after randomly generated numbers.

I think that "sequence" is there to help generate local ascending identifiers when the real time clock do not provide enough resolution. So "sequence" field must be placed after 6 bytes of time-generated identifier.

On a contrary "node ID" must differentiate identifiers generated on different nodes. So it makes sense to place "node ID" before timing. So identifiers generated on different nodes will tend to be in different ranges.
Although, section "6.4. Distributed UUID Generation" states that "node ID" is there to decrease the likelihood of a collision. So my intuition might be wrong here.

Do we want to provide this "vendor-specific" UUID with tweaks for databases? Or should we limit the scope with well defined UUID v7?

Best regards, Andrey Borodin.

[0]: https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-01

Attachments:

v2-0001-Implement-UUID-v7-and-v8-as-per-IETF-draft.patchapplication/octet-stream; name=v2-0001-Implement-UUID-v7-and-v8-as-per-IETF-draft.patch; x-unix-mode=0644Download+144-2
#14Kyzer Davis (kydavis)
kydavis@cisco.com
In reply to: Andrey Borodin (#13)
RE: UUID v7

Great discussions group,

I think it would be reasonable to review this patch now.

I am happy to review the format and logic for any proposed v7 and/or v8
UUID. Just point me to a PR or some code review location.

Distributed UUID Generation" states that "node ID" is there to decrease
the likelihood of a collision.

Correct, node identifiers help provide some bit space that ensures no
collision in the event the stars align where two nodes create the exact
UUID.

From what I have seen UUIDv7 should meet the requirements outlined thus far
In this thread.

Also to add, there are two UUID prototypes for postgres from my checks.
Although they are outdated from the latest draft sent up for official
Publication so review them from an academic perspective.)
- https://github.com/uuid6/prototypes
- pg_uuid_next (see this thread which nicely summarizes some UUIDv7
"checkboxes" https://github.com/x4m/pg_uuid_next/issues/1)
- UUID_v7_for_Postgres.sql

Don't forget, if we have UUIDv1 already implemented in the postgres code you
may want to examine UUIDv6.
UUIDv6 is simply a fork of that code and swap of the timestamp bits.
In terms of effort UUIDv6 easy to implement and gives you a time ordered
UUID re-using 99% of the code you may already have.

Lastly, my advice on v8 is that I would examine/implement v6 or v7 first
before jumping to v8
because whatever you do for implementing v6 or v7 will help you implement a
better v8.
There are also a number of v8 prototype implementations (at the previous
link) if somebody wants to give them a scroll.

Happy to answer any other questions where I can provide input.

Thanks,

-----Original Message-----
From: Andrey M. Borodin <x4mmm@yandex-team.ru>
Sent: Friday, July 7, 2023 8:06 AM
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>; Daniel Gustafsson <daniel@yesql.se>;
Matthias van de Meent <boekewurm+postgres@gmail.com>; Nikolay Samokhvalov
<samokhvalov@gmail.com>; Kyzer Davis (kydavis) <kydavis@cisco.com>; Andres
Freund <andres@anarazel.de>; Andrey Borodin <amborodin86@gmail.com>;
PostgreSQL Hackers <pgsql-hackers@postgresql.org>; brad@peabody.io;
wolakk@gmail.com
Subject: Re: UUID v7

On 6 Jul 2023, at 21:38, Peter Eisentraut

<peter.eisentraut@enterprisedb.com> wrote:

I think it would be reasonable to review this patch now.

+1.

Also, I think we should discuss UUID v8. UUID version 8 provides an
RFC-compatible format for experimental or vendor-specific use cases.
Revision 1 of IETF draft contained interesting code for v8: almost similar
to v7, but with fields for "node ID" and "rolling sequence number".
I think this is reasonable approach, thus I attach implementation of UUID v8
per [0]https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-01. But from my point of view this implementation has some flaws.
These two new fields "node ID" and "sequence" are there not for uniqueness,
but rather for data locality.
But they are placed at the end, in bytes 14 and 15, after randomly generated
numbers.

I think that "sequence" is there to help generate local ascending
identifiers when the real time clock do not provide enough resolution. So
"sequence" field must be placed after 6 bytes of time-generated identifier.

On a contrary "node ID" must differentiate identifiers generated on
different nodes. So it makes sense to place "node ID" before timing. So
identifiers generated on different nodes will tend to be in different
ranges.
Although, section "6.4. Distributed UUID Generation" states that "node ID"
is there to decrease the likelihood of a collision. So my intuition might be
wrong here.

Do we want to provide this "vendor-specific" UUID with tweaks for databases?
Or should we limit the scope with well defined UUID v7?

Best regards, Andrey Borodin.

[0]: https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-01

Attachments:

smime.p7sapplication/pkcs7-signature; name=smime.p7sDownload
#15Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#13)
Re: UUID v7

On 07.07.23 14:06, Andrey M. Borodin wrote:

Also, I think we should discuss UUID v8. UUID version 8 provides an RFC-compatible format for experimental or vendor-specific use cases. Revision 1 of IETF draft contained interesting code for v8: almost similar to v7, but with fields for "node ID" and "rolling sequence number".
I think this is reasonable approach, thus I attach implementation of UUID v8 per [0].

I suggest we keep this thread to v7, which has pretty straightforward
semantics for PostgreSQL. v8 by definition has many possible
implementations, so you're going to have to make pretty strong arguments
that yours is the best and only one, if you are going to claim the
gen_uuid_v8 function name.

#16Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#15)
Re: UUID v7

On 10 Jul 2023, at 21:50, Peter Eisentraut <peter.eisentraut@enterprisedb.com> wrote:

I suggest we keep this thread to v7, which has pretty straightforward semantics for PostgreSQL. v8 by definition has many possible implementations, so you're going to have to make pretty strong arguments that yours is the best and only one, if you are going to claim the gen_uuid_v8 function name.

Thanks Peter, I'll follow this course of action.

After discussion on GitHub with Sergey Prokhorenko [0]https://github.com/x4m/pg_uuid_next/issues/1#issuecomment-1657074776 <https://github.com/x4m/pg_uuid_next/issues/1#issuecomment-1657074776&gt; I understood that counter is optional, but useful part of UUID v7. It actually promotes sortability of data generated at high speed.
The standard does not specify how big counter should be. PFA patch with 16 bit counter. Maybe it worth doing 18bit counter - it will save us one byte of PRNG data. Currently we only take 2 bits out of the whole random byte.

Best regards, Andrey Borodin.

[0]: https://github.com/x4m/pg_uuid_next/issues/1#issuecomment-1657074776 <https://github.com/x4m/pg_uuid_next/issues/1#issuecomment-1657074776&gt;

Attachments:

v3-0001-Implement-UUID-v7-as-per-IETF-draft.patchapplication/octet-stream; name=v3-0001-Implement-UUID-v7-as-per-IETF-draft.patch; x-unix-mode=0644Download+79-2
#17Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#16)
Re: UUID v7

On 30 Jul 2023, at 13:08, Andrey M. Borodin <x4mmm@yandex-team.ru> wrote:

After discussion on GitHub with Sergey Prokhorenko [0] I understood that counter is optional, but useful part of UUID v7. It actually promotes sortability of data generated at high speed.
The standard does not specify how big counter should be. PFA patch with 16 bit counter. Maybe it worth doing 18bit counter - it will save us one byte of PRNG data. Currently we only take 2 bits out of the whole random byte.

Here's a new patch version. Now counter is initialised with strong random on every time change (each ms). However, one first bit of the counter is preserved to zero. This is done to extend counter capacity (I left comments with reference to RFC with explanations).

Thanks!

Best regards, Andrey Borodin.

Attachments:

v4-0001-Implement-UUID-v7-as-per-IETF-draft.patchapplication/octet-stream; name=v4-0001-Implement-UUID-v7-as-per-IETF-draft.patch; x-unix-mode=0644Download+105-2
#18Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#17)
Re: UUID v7

On 20 Aug 2023, at 23:56, Andrey M. Borodin <x4mmm@yandex-team.ru> wrote:

<v4-0001-Implement-UUID-v7-as-per-IETF-draft.patch>

I've observed, that pre-generating and buffering random numbers makes UUID generation 10 times faster.

Without buffering
postgres=# with x as (select gen_uuid_v7() from generate_series(1,1e6)) select count(*) from x;
Time: 5286.572 ms (00:05.287)

With buffering
postgres=# with x as (select gen_uuid_v7() from generate_series(1,1e6)) select count(*) from x;
Time: 390.091 ms

This can speed up gen_random_uuid() on the same scale too. PFA implementation of this technique.

Best regards, Andrey Borodin.

Attachments:

v5-0001-Implement-UUID-v7-as-per-IETF-draft.patchapplication/octet-stream; name=v5-0001-Implement-UUID-v7-as-per-IETF-draft.patch; x-unix-mode=0644Download+105-2
v5-0002-Buffer-random-numbers.patchapplication/octet-stream; name=v5-0002-Buffer-random-numbers.patch; x-unix-mode=0644Download+20-4
v5-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patchapplication/octet-stream; name=v5-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patch; x-unix-mode=0644Download+1-2
#19Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#18)
Re: UUID v7

On 21 Aug 2023, at 13:42, Andrey M. Borodin <x4mmm@yandex-team.ru> wrote:

<v5-0001-Implement-UUID-v7-as-per-IETF-draft.patch><v5-0002-Buffer-random-numbers.patch><v5-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patch>

FPA attached next version.
Changes:
- implemented protection from time leap backwards when series is generated on the same backend
- counter overflow is now translated into ms step forward

Best regards, Andrey Borodin.

Attachments:

v6-0001-Implement-UUID-v7-as-per-IETF-draft.patchapplication/octet-stream; name=v6-0001-Implement-UUID-v7-as-per-IETF-draft.patch; x-unix-mode=0644Download+118-2
v6-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patchapplication/octet-stream; name=v6-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patch; x-unix-mode=0644Download+1-2
v6-0002-Buffer-random-numbers.patchapplication/octet-stream; name=v6-0002-Buffer-random-numbers.patch; x-unix-mode=0644Download+20-4
#20Mat Arye
mat@timescaledb.com
In reply to: Andrey Borodin (#19)
Re: UUID v7

Andrey,

Thanks for all your work on this. I think this will be really useful.

From a user perspective, it would be great to add 2 things:
- A function to extract the timestamp from a V7 UUID (very useful for
defining constraints if partitioning by the uuid-embedded timestamps, for
instance).
- Can we add an optional timestamptz argument to gen_uuid_v7 so that you
can explicitly specify a time instead of always generating for the current
time? If the argument is NULL, then use current time. This could be useful
for backfilling and other applications.

Thanks,
Matvey Arye
Timescale software developer.

On Wed, Aug 30, 2023 at 3:05 PM Andrey M. Borodin <x4mmm@yandex-team.ru>
wrote:

Show quoted text

On 21 Aug 2023, at 13:42, Andrey M. Borodin <x4mmm@yandex-team.ru>

wrote:

<v5-0001-Implement-UUID-v7-as-per-IETF-draft.patch><v5-0002-Buffer-random-numbers.patch><v5-0003-Use-cached-random-numbers-in-gen_random_uuid-too.patch>

FPA attached next version.
Changes:
- implemented protection from time leap backwards when series is generated
on the same backend
- counter overflow is now translated into ms step forward

Best regards, Andrey Borodin.

#21Andrey Borodin
amborodin@acm.org
In reply to: Mat Arye (#20)
#22Chris Travers
chris.travers@gmail.com
In reply to: Andrey Borodin (#21)
#23Nick Babadzhanian
pgnickb@gmail.com
In reply to: Andrey Borodin (#21)
#24Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Nick Babadzhanian (#23)
#25Brad Peabody
brad@peabody.io
In reply to: Jelte Fennema-Nio (#24)
#26Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#24)
#27Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#26)
#28Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#27)
#29Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Andrey Borodin (#28)
#30Andrey Borodin
amborodin@acm.org
In reply to: Przemysław Sztoch (#29)
#31Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#30)
#32Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Jelte Fennema-Nio (#31)
#33Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Przemysław Sztoch (#32)
#34Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#33)
#35Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#34)
#36Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#35)
#37Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#36)
#38Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#37)
#39Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#36)
#40Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Andrey Borodin (#34)
#41Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#38)
#42Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Jelte Fennema-Nio (#41)
#43Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Aleksander Alekseev (#35)
#44Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Przemysław Sztoch (#42)
#45Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#44)
#46Aleksander Alekseev
aleksander@timescale.com
In reply to: Przemysław Sztoch (#43)
#47Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#46)
#48Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#47)
#49Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Aleksander Alekseev (#48)
#50Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#47)
#51Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#50)
#52Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Andrey Borodin (#45)
#53Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Aleksander Alekseev (#46)
#54Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Andrey Borodin (#47)
#55Lukas Fittl
lukas@fittl.com
In reply to: Andrey Borodin (#45)
#56David G. Johnston
david.g.johnston@gmail.com
In reply to: Andrey Borodin (#50)
#57Andrey Borodin
amborodin@acm.org
In reply to: David G. Johnston (#56)
#58Aleksander Alekseev
aleksander@timescale.com
In reply to: Przemysław Sztoch (#53)
#59Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#57)
#60Nikolay Samokhvalov
samokhvalov@gmail.com
In reply to: Andrey Borodin (#59)
#61Nikolay Samokhvalov
samokhvalov@gmail.com
In reply to: Nikolay Samokhvalov (#60)
#62Aleksander Alekseev
aleksander@timescale.com
In reply to: Nikolay Samokhvalov (#60)
#63Aleksander Alekseev
aleksander@timescale.com
In reply to: Aleksander Alekseev (#62)
#64Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#63)
#65Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#64)
#66Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#65)
#67Aleksander Alekseev
aleksander@timescale.com
In reply to: Aleksander Alekseev (#65)
#68Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#66)
#69Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#68)
#70Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#69)
#71Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#70)
#72Marcos Pegoraro
marcos@f10.com.br
In reply to: Andrey Borodin (#71)
#73Andrey Borodin
amborodin@acm.org
In reply to: Marcos Pegoraro (#72)
#74Marcos Pegoraro
marcos@f10.com.br
In reply to: Andrey Borodin (#73)
#75Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Marcos Pegoraro (#74)
#76Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Aleksander Alekseev (#68)
#77Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Nikolay Samokhvalov (#60)
#78Nikolay Samokhvalov
samokhvalov@gmail.com
In reply to: Sergey Prokhorenko (#77)
#79Nikolay Samokhvalov
samokhvalov@gmail.com
In reply to: Nikolay Samokhvalov (#78)
#80Andrey Borodin
amborodin@acm.org
In reply to: Nikolay Samokhvalov (#78)
#81Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#80)
#82Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Andrey Borodin (#80)
#83Aleksander Alekseev
aleksander@timescale.com
In reply to: Przemysław Sztoch (#82)
#84Aleksander Alekseev
aleksander@timescale.com
In reply to: Aleksander Alekseev (#83)
#85Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Aleksander Alekseev (#83)
#86Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Sergey Prokhorenko (#77)
#87Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Sergey Prokhorenko (#85)
#88Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Aleksander Alekseev (#84)
#89Junwang Zhao
zhjwpku@gmail.com
In reply to: Jelte Fennema-Nio (#87)
#90Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#85)
#91Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#90)
#92Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#90)
#93Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#91)
#94Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#93)
#95Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#94)
#96Junwang Zhao
zhjwpku@gmail.com
In reply to: Andrey Borodin (#95)
#97Andrey Borodin
amborodin@acm.org
In reply to: Junwang Zhao (#96)
#98Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#97)
#99Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#97)
#100Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#99)
#101Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#100)
#102Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#101)
#103Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Aleksander Alekseev (#102)
#104Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#103)
#105Michael Paquier
michael@paquier.xyz
In reply to: Andrey Borodin (#104)
#106Andrey Borodin
amborodin@acm.org
In reply to: Michael Paquier (#105)
#107Michael Paquier
michael@paquier.xyz
In reply to: Andrey Borodin (#106)
#108Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#104)
#109Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Michael Paquier (#107)
#110Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Jelte Fennema-Nio (#108)
#111Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Sergey Prokhorenko (#110)
#112Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#100)
#113Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#112)
#114Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#113)
#115Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#114)
#116Aleksander Alekseev
aleksander@timescale.com
In reply to: Andrey Borodin (#115)
#117Andrey Borodin
amborodin@acm.org
In reply to: Aleksander Alekseev (#116)
#118Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#117)
#119Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#118)
#120Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Andrey Borodin (#119)
#121Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#120)
#122Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#121)
#123Peter Eisentraut
peter_e@gmx.net
In reply to: Jelte Fennema-Nio (#120)
#124Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Peter Eisentraut (#123)
#125Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Sergey Prokhorenko (#124)
#126Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Sergey Prokhorenko (#125)
#127Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#119)
#128Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#127)
#129Peter Eisentraut
peter_e@gmx.net
In reply to: Andrey Borodin (#128)
#130Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#129)
#131Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#130)
#132Andrey Borodin
amborodin@acm.org
In reply to: Jelte Fennema-Nio (#109)
#133Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#132)
#134Michael Paquier
michael@paquier.xyz
In reply to: Sergey Prokhorenko (#133)
#135Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#132)
#136Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#135)
#137Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#135)
#138Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#137)
#139Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#138)
#140Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#139)
#141Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#140)
#142Michael Paquier
michael@paquier.xyz
In reply to: Andrey Borodin (#141)
#143Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#141)
#144Andrey Borodin
amborodin@acm.org
In reply to: Michael Paquier (#142)
#145Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#143)
#146Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#145)
#147Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#146)
#148Stepan Neretin
sndcppg@gmail.com
In reply to: Andrey Borodin (#147)
#149Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#147)
#150Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#149)
#151Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#150)
#152Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#151)
#153Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#152)
#154Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#153)
#155Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#154)
#156Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#155)
#157Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#156)
#158Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#157)
#159Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#158)
#160Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#157)
#161Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#159)
#162Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#161)
#163Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#162)
#164Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#163)
#165Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#164)
#166Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#165)
#167Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#166)
#168Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#167)
#169Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#168)
#170Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#169)
#171Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#170)
#172Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#171)
#173Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#172)
#174Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#173)
#175Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#174)
#176wenhui qiu
qiuwenhuifx@gmail.com
In reply to: Andrey Borodin (#175)
#177Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#175)
#178Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#177)
#179Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#178)
#180Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#179)
#181Japin Li
japinli@hotmail.com
In reply to: Masahiko Sawada (#179)
#182Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#179)
#183Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#182)
#184Przemysław Sztoch
przemyslaw@sztoch.pl
In reply to: Masahiko Sawada (#183)
#185Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Przemysław Sztoch (#184)
#186Jelte Fennema-Nio
postgres@jeltef.nl
In reply to: Sergey Prokhorenko (#185)
#187Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Jelte Fennema-Nio (#186)
#188Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#187)
#189Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#188)
#190Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#189)
#191Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Sergey Prokhorenko (#190)
#192Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#190)
#193Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#187)
#194Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#192)
#195Kirill Reshke
reshkekirill@gmail.com
In reply to: Sergey Prokhorenko (#194)
#196Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#194)
#197Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#196)
#198Andrey Borodin
amborodin@acm.org
In reply to: Sergey Prokhorenko (#197)
#199Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#197)
#200Andrey Borodin
amborodin@acm.org
In reply to: Peter Eisentraut (#193)
#201Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#200)
#202Marcos Pegoraro
marcos@f10.com.br
In reply to: Masahiko Sawada (#201)
#203Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Marcos Pegoraro (#202)
#204Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#203)
#205Daniel Verite
daniel@manitou-mail.org
In reply to: Andrey Borodin (#200)
#206Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Daniel Verite (#205)
#207Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#206)
#208Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#199)
#209Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#207)
#210Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#209)
#211Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#210)
#212Daniel Verite
daniel@manitou-mail.org
In reply to: Andrey Borodin (#207)
#213Andrey Borodin
amborodin@acm.org
In reply to: Daniel Verite (#212)
#214Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#211)
#215Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#214)
#216Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#215)
#217Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#216)
#218Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#217)
#219Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrey Borodin (#218)
#220Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#218)
#221Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Sergey Prokhorenko (#219)
#222Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Masahiko Sawada (#221)
#223Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#220)
#224Andrew Alsup
bluesbreaker@gmail.com
In reply to: Sergey Prokhorenko (#222)
#225David G. Johnston
david.g.johnston@gmail.com
In reply to: Andrew Alsup (#224)
#226Sergey Prokhorenko
sergeyprokhorenko@yahoo.com.au
In reply to: Andrew Alsup (#224)
#227David G. Johnston
david.g.johnston@gmail.com
In reply to: Sergey Prokhorenko (#226)
#228David G. Johnston
david.g.johnston@gmail.com
In reply to: Andrey Borodin (#200)
#229Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#223)
#230Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#229)
#231Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#230)
#232Andrey Borodin
amborodin@acm.org
In reply to: Masahiko Sawada (#231)
#233Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Andrey Borodin (#232)
#234Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#233)