Hi,
I don't think we knew about ns_uuid. uuid::uuid is now used in quite a few
places in the codebase.
We can do an audit and change to a wrapper proc which uses uuid::uuid or
ns_uuid depending on whether the proc is being called within NaviServer or
not... but I wanted to make sure there was a good reason to introduce the
extra complexity.

On Mon, 6 Apr 2020 at 18:26, Gustaf Neumann <neum...@wu.ac.at> wrote:

> Dear David,
>
> is there any reason not using "ns_uuid"?
>
> -g
> On 06.04.20 17:02, David Osborne wrote:
>
> Hi,
> Hope everyone is well.
>
> We encountered a situation where uuids generated by tcllib's uuid::uuid
> generate can repeat sequences under naviserver which has caused some
> issues in our codebase with collisions.
> We wondered if you would expect this behaviour?
>
> Using Debian 9.7 with Naviserver 4.99.19 tarball.
>
> We have a /usr/local/ns/tcl/test.tcl file:
>
> proc uuid_test {} {
>     ns_return 200 text/plain [uuid::uuid generate]
> }
> package require uuid
> ns_register_proc GET /test.tcl uuid_test
>
> Then we start naviserver with:
> sudo /usr/local/ns/bin/nsd -u nsadmin -t /usr/local/ns/conf/nsd-config.tcl
>
> Each request starts off with unique uuids:
>
> $ curl http://127.0.0.1:8080/test.tcl
> 94648710-5503-4ecb-8853-7acd68fe289c
> $ curl http://127.0.0.1:8080/test.tcl
> de3a7eee-8b4d-45b9-b80c-71985b2b6346
> $ curl http://127.0.0.1:8080/test.tcl
> efec82f4-2e0f-43ff-a951-6abb0a9a61a9
>
> Then if we do a ns_eval -sync source of any file:
>
> $ nc 127.0.0.1 4080
> Welcome to default running at /usr/local/ns/bin/nsd (pid 12248)
> NaviServer/4.99.19 for linux built on Apr  6 2020 at 14:27:50
> Tag: tar-4.99.19
> default:nscp 1> ns_eval -sync source /usr/local/ns/tcl/file.tcl
>
> We are given the same sequence of uuids again:
>
> $ curl http://127.0.0.1:8080/test.tcl
> 94648710-5503-4ecb-8853-7acd68fe289c
> $ curl http://127.0.0.1:8080/test.tcl
> de3a7eee-8b4d-45b9-b80c-71985b2b6346
> $ curl http://127.0.0.1:8080/test.tcl
> efec82f4-2e0f-43ff-a951-6abb0a9a61a9
>
> The same issue does *not* happen with your ns_uuid implementation.
>
> We dug into the implementation details of the tcllib version. I'm not
> familiar with the uuid algorithm particularly, but it seems when initially
> called, the code generates some random data to use when making the uuid
> which it calls machinfo. This is then cached and will not change as long
> as the variable exists in memory. The only thing making each subsequent
> request different is an incrementing counter (called uid) which is used in
> the MD5 hash.
> What happens with ns_eval, is that this counter (uid) is reset, the machinfo
> stays the same, so the same sequence of uuids begins again.
>
> https://github.com/tcltk/tcllib/blob/master/modules/uuid/uuid.tcl#L37
>
> What's your take on this behaviour?
> Thanks,
> --
> David
>
>
> _______________________________________________
> naviserver-devel mailing 
> listnaviserver-devel@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/naviserver-devel
>
> _______________________________________________
> naviserver-devel mailing list
> naviserver-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/naviserver-devel
>


-- 

*David Osborne | Software Engineer*
Qcode Software, Castle House, Fairways Business Park, Inverness, IV2 6AA
*Email:* da...@qcode.co.uk | *Phone:* 01463 896 484
www.qcode.co.uk
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel

Reply via email to