Wednesday, 2018-03-07

mattoliverauclayg: yeah, though I didn't leave until monday morning UK time.00:05
*** yashmurty has joined #openstack-swift00:28
yashmurty@kota_ are you attending the Tokyo Ops Meetup today?00:32
yashmurtyWhat time will you be arriving?00:32
*** tovin07_ has joined #openstack-swift00:51
*** gerardgine has quit IRC01:05
*** germs has joined #openstack-swift01:06
*** germs has quit IRC01:06
*** germs has joined #openstack-swift01:06
*** gyee has quit IRC01:08
openstackgerritTim Burke proposed openstack/swift feature/deep: Pick up the new probetests check on feature/deep  https://review.openstack.org/55029101:09
kei-ichiHi everyone.Hi everyone. Thank you for giving me a permission to proceed slogging task.01:10
*** itlinux has joined #openstack-swift01:10
kei-ichiNow launchpad page has created and I and yashmurty is going to start gerrit relevant work.01:10
kei-ichiI'll report progress of our task here in regular period. o/01:10
kei-ichi(I also got home yesterday evening in JST same as mattoliverau ..)01:10
*** germs has quit IRC01:11
mattoliveraukei-ichi: welcome home and thanks for coming last week, it was great to meet you!01:12
kei-ichiThank you mattoliverau !01:14
kei-ichiThat was first time for me to attend swift's meeting and I'd really appreciate everyone's warm welcome.01:14
kei-ichiI hope I can contribute to swift from Horizon/slogging side firstlly and finally I would like to make contribution for swift itself !01:14
notmynamekei-ichi: it was good to meet you, and I'm glad you came. good luck with the slogging work!01:15
mattoliveraukei-ichi: great!01:15
kei-ichiThaks notmyname !01:16
kei-ichiI would like to enjoy this wonderful opportunity o/01:16
*** SkyRocknRoll has quit IRC01:19
*** gerardgine has joined #openstack-swift01:29
openstackgerritTim Burke proposed openstack/swift feature/deep: Pick up the new probetests check on feature/deep  https://review.openstack.org/55029101:42
*** itlinux has quit IRC01:42
*** gerardgine has quit IRC01:58
*** tovin07_ has quit IRC02:03
notmynametimburke: you didn't want to get it via a merge from master?02:08
timburkenotmyname: i did. see https://storyboard.openstack.org/#!/story/200149602:09
timburkefeature/deep has it, but zuul doesn't know it's there yet02:09
timburkethat's why i only did a whitespace change to .zuul.yaml02:11
timburketdasilva: got any ideas on how to get swift logs for the probe test job?02:15
timburkeprobe test output ... isn't always terribly useful02:15
*** tovin07_ has joined #openstack-swift02:17
*** itlinux has joined #openstack-swift02:21
*** germs has joined #openstack-swift02:25
*** germs has quit IRC02:29
*** itlinux has quit IRC02:36
*** yashmurty has quit IRC02:55
*** itlinux has joined #openstack-swift03:04
*** yashmurty has joined #openstack-swift03:04
*** itlinux has quit IRC03:07
*** yashmurty has quit IRC03:35
tdasilvatimburke: no ideas yet, but was thinking of the same problem....i thought i saw someone making a change about getting logs from one of the jobs...was it kota_?? or am i confused...03:47
tdasilvawill look into that...03:47
*** links has joined #openstack-swift03:59
*** yashmurty has joined #openstack-swift04:00
*** yashmurty has quit IRC04:01
*** yashmurt_ has joined #openstack-swift04:03
*** yashmurt_ has quit IRC04:21
*** yashmurty has joined #openstack-swift04:23
*** links has quit IRC04:25
*** germs has joined #openstack-swift04:26
*** germs has quit IRC04:26
*** germs has joined #openstack-swift04:26
*** yashmurty has quit IRC04:27
*** links has joined #openstack-swift04:27
*** germs has quit IRC04:31
*** yashmurty has joined #openstack-swift04:32
*** psachin has joined #openstack-swift04:40
*** silor has joined #openstack-swift05:12
*** silor has quit IRC05:36
*** Supun has joined #openstack-swift05:52
*** cshastri has joined #openstack-swift06:00
*** rcernin_ has joined #openstack-swift06:18
*** rcernin has quit IRC06:21
*** germs has joined #openstack-swift06:27
*** germs has joined #openstack-swift06:27
*** Supun has quit IRC06:30
*** germs has quit IRC06:31
*** cbartz has joined #openstack-swift06:40
*** links has quit IRC06:41
*** yashmurty has quit IRC06:43
*** links has joined #openstack-swift06:51
*** gkadam has joined #openstack-swift06:58
*** yashmurty has joined #openstack-swift06:59
*** yashmurty has quit IRC06:59
*** yashmurty has joined #openstack-swift07:00
*** rcernin has joined #openstack-swift07:05
*** rcernin_ has quit IRC07:06
*** mlanner has quit IRC07:09
*** threestrands_ has joined #openstack-swift07:09
*** threestrands_ has quit IRC07:09
*** threestrands_ has joined #openstack-swift07:09
*** threestrands has quit IRC07:10
*** threestrands_ has quit IRC07:13
*** yashmurty has quit IRC07:19
*** yashmurty has joined #openstack-swift07:28
*** yashmurty has quit IRC07:29
*** yashmurty has joined #openstack-swift07:29
*** hseipp has joined #openstack-swift07:41
*** armaan has joined #openstack-swift07:51
*** pcaruana has joined #openstack-swift07:54
*** pcaruana has quit IRC07:55
*** pcaruana has joined #openstack-swift07:55
kota_online at Ops-MeetUp Tokyo ¥o/07:57
* kota_ was tighten up to my office in this morning07:57
*** tesseract has joined #openstack-swift08:22
*** hseipp has quit IRC08:27
*** germs has joined #openstack-swift08:27
*** germs has quit IRC08:27
*** germs has joined #openstack-swift08:27
*** threestrands has joined #openstack-swift08:32
*** threestrands has quit IRC08:32
*** threestrands has joined #openstack-swift08:32
*** germs has quit IRC08:32
*** hseipp has joined #openstack-swift08:33
*** yashmurty has quit IRC08:36
*** threestrands has quit IRC08:36
*** cshastri has quit IRC08:42
*** rcernin has quit IRC08:42
*** cshastri has joined #openstack-swift08:43
*** geaaru has joined #openstack-swift08:43
openstackgerritKota Tsuyuzaki proposed openstack/swift master: DNM: Try out to pull execution logs of functests  https://review.openstack.org/54822608:44
*** yashmurty has joined #openstack-swift08:45
kota_tdasilva: that is one I'm still trying to pull the logs08:46
kota_tdasilva: but I don't think I complete the work with the patch, yet.08:46
acolesgood morning08:46
kota_I still needs to dig out around log setup with in-process. When i tried to grep the results from /var/log/syslog, the vm for testing denied because of permission.08:47
kota_acoles: morning!08:47
acoleshi kota_ did you make it home ok?08:47
kota_it was delayed tho, I'm fine here in Tokyo now.08:47
kota_how were you?08:48
acolesI made it home on Saturday after delays, there was also snow in my street but not too bad08:49
*** yashmurty has quit IRC08:49
kota_sounds not so bad08:51
kota_that was crazy snow tho.08:52
*** kei_yama has quit IRC08:56
kota_acoles: do you have any good idea to dump the swift log into tox log dir  at in process testing?09:01
acoleskota_: no, sorry. I'm just looking at a new gate probe test and wanting to see logs too!09:02
kota_im digging around log_address in conf file but not yet reach the answer09:03
kota_acoles: ok. no worries09:04
*** hseipp has quit IRC09:11
*** hseipp has joined #openstack-swift09:12
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Move auto_create_account_prefix option to DEFAULT section  https://review.openstack.org/55040909:22
*** armaan has quit IRC09:24
*** armaan has joined #openstack-swift09:25
*** armaan has quit IRC09:38
*** armaan has joined #openstack-swift09:38
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add an update_meta method to ShardRange  https://review.openstack.org/55041409:45
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add an update_meta method to ShardRange  https://review.openstack.org/55041409:48
*** tovin07_ has quit IRC09:59
*** kukacz has quit IRC10:17
*** kei-ichi has quit IRC10:26
*** kei-ichi has joined #openstack-swift10:27
*** germs has joined #openstack-swift10:28
*** germs has quit IRC10:28
*** germs has joined #openstack-swift10:28
*** germs has quit IRC10:33
*** kazsh has quit IRC10:40
*** kazsh has joined #openstack-swift10:45
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add an update_meta method to ShardRange  https://review.openstack.org/55041411:18
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043611:18
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043611:51
openstackgerrityanwei proposed openstack/swift master: remove the if statement  https://review.openstack.org/55045711:58
openstackgerrityanwei proposed openstack/swift master: 1,According to http://www.gevent.org/gevent.html Parameters: exception (type) – The type of exception to raise in  the greenlet. The default is GreenletExit, which indicates a  successful() completion of the greenlet.  https://review.openstack.org/55045712:00
*** mattoliverau has quit IRC12:21
*** mattoliverau has joined #openstack-swift12:22
*** armaan has quit IRC12:26
*** armaan has joined #openstack-swift12:26
*** psachin has quit IRC12:27
*** germs has joined #openstack-swift12:29
*** germs has quit IRC12:29
*** germs has joined #openstack-swift12:29
*** germs has quit IRC12:34
*** cshastri has quit IRC12:53
*** armaan has quit IRC12:55
*** armaan has joined #openstack-swift12:56
*** cshastri has joined #openstack-swift13:01
*** germs has joined #openstack-swift14:08
*** germs has quit IRC14:08
*** germs has joined #openstack-swift14:08
*** germs has quit IRC14:09
*** germs has joined #openstack-swift14:09
*** germs has quit IRC14:09
*** germs has joined #openstack-swift14:09
*** SkyRocknRoll has joined #openstack-swift14:15
*** armaan has quit IRC14:16
*** armaan has joined #openstack-swift14:20
*** armaan has quit IRC14:22
*** germs has quit IRC14:33
*** links has quit IRC14:37
*** mvk has quit IRC14:41
*** cshastri has quit IRC14:51
*** cbartz has quit IRC14:56
m3m0hello, I'm using a red hat :(  openstack deployment and apparently the swift deployment is using "virtual drives" on my controllers, is there a way to get the current capacity of the disk and the "expected capacity"? swift-recon -d does not return anything useful15:00
tdasilvam3m0: by default on a tripleo (i.e., director) deployment, swift uses the OS disk on a controller node15:02
m3m0tdasilva: mmm in that case, swift-recon -d should work the same no?15:04
m3m0but complains about: Error. No drive info available.15:05
tdasilvam3m0: I don't have a tripleo environment available to me atm to test :/15:10
m3m0tdasilva: thanks a lot anyway :) and one last question, where can I find the replica configuration for my objects15:13
tdasilvain the rings15:13
tdasilvam3m0: what openstack version are you running?15:13
m3m0tdasilva: mitaka15:14
tdasilvaoh15:15
m3m0or red hat openstack 915:15
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043615:16
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Store own shard range in the shard ranges table  https://review.openstack.org/55024615:16
tdasilvam3m0: deployment has worked better in newer releases, starting with newton15:17
m3m0tdasilva: indeed, I was deploying queens with docker and it was easier to manage than this one :)15:18
m3m0but deploying is one thing and managing is another one :)15:20
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043615:21
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Store own shard range in the shard ranges table  https://review.openstack.org/55024615:21
*** mvk has joined #openstack-swift15:30
*** germs has joined #openstack-swift15:31
*** germs has quit IRC15:31
*** germs has joined #openstack-swift15:31
*** armaan has joined #openstack-swift15:32
*** germs has quit IRC15:32
*** germs has joined #openstack-swift15:35
*** germs has quit IRC15:35
*** germs has joined #openstack-swift15:35
*** pcaruana has quit IRC16:10
*** guimaluf has joined #openstack-swift16:16
tdasilvawhat happened to that s3 doc we created in denver with the supported features?16:20
tdasilvawas it ever published somewhere?16:20
*** itlinux has joined #openstack-swift16:35
*** geaaru has quit IRC16:47
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Store own shard range in the shard ranges table  https://review.openstack.org/55024616:55
*** geaaru has joined #openstack-swift17:09
openstackgerritAlistair Coles proposed openstack/swift feature/deep: DO NOT MERGE Allow a container PUT with shards body to autocreate container  https://review.openstack.org/55053517:10
*** gkadam has quit IRC17:11
*** armaan has quit IRC17:15
*** armaan has joined #openstack-swift17:15
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043617:15
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Store own shard range in the shard ranges table  https://review.openstack.org/55024617:15
timburkegood morning17:21
notmynamegood morning17:23
*** cshastri has joined #openstack-swift17:27
*** hseipp has quit IRC17:29
*** armaan has quit IRC17:47
*** armaan has joined #openstack-swift17:48
*** gyee has joined #openstack-swift17:48
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Add assertions to probe test  https://review.openstack.org/55054817:52
openstackgerritMerged openstack/swift feature/deep: Add an update_meta method to ShardRange  https://review.openstack.org/55041417:53
*** armaan has quit IRC17:53
*** armaan has joined #openstack-swift17:54
*** pcaruana has joined #openstack-swift17:57
*** kallenp has joined #openstack-swift18:06
*** cshastri has quit IRC18:10
*** kallenp_ has joined #openstack-swift18:11
kallenp_test only18:12
*** kallenp_ has quit IRC18:13
*** SkyRocknRoll has quit IRC18:29
*** mvk has quit IRC18:31
*** geaaru has quit IRC18:42
*** tesseract has quit IRC18:53
*** kallenp has quit IRC19:08
*** kallenp has joined #openstack-swift19:10
*** kallenp has quit IRC19:10
*** kallenp has joined #openstack-swift19:13
*** mvk has joined #openstack-swift19:14
*** kallenp has quit IRC19:19
timburkenotmyname: i had a similar concern about https://review.openstack.org/#/c/548948/ -- see the response; since the change also overrides the fmt arg, it should be ok... though it still seems a little odd. otoh, do we ever override fmt elsewhere? how do (can?) operators *not* have "%s(server)s:" included in log messages today?19:20
patchbotpatch 548948 - swift - Add template in proxy to create custom and anonymo...19:20
*** bartden has joined #openstack-swift19:20
*** kallenp has joined #openstack-swift19:30
*** kallenp has quit IRC19:34
*** kallenp has joined #openstack-swift19:35
*** kallenp has quit IRC19:35
*** kallenp has joined #openstack-swift19:37
*** yashmurty has joined #openstack-swift19:37
*** kallenp has quit IRC19:39
*** silor has joined #openstack-swift19:41
*** yashmurty has quit IRC19:42
*** germs_ has joined #openstack-swift19:52
*** germs__ has joined #openstack-swift19:54
*** germs has quit IRC19:54
*** germs_ has quit IRC19:57
*** germs__ is now known as germs19:58
*** germs has quit IRC19:58
*** germs has joined #openstack-swift19:58
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Persist own shard stats after reporting to root  https://review.openstack.org/55058620:00
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Persist own shard stats after reporting to root  https://review.openstack.org/55058620:01
*** silor1 has joined #openstack-swift20:09
*** gerardgine has joined #openstack-swift20:09
*** silor has quit IRC20:12
*** silor1 is now known as silor20:12
*** kallenp has joined #openstack-swift20:14
*** kallenp has quit IRC20:23
*** silor1 has joined #openstack-swift20:31
*** silor has quit IRC20:32
*** silor1 is now known as silor20:32
*** gerardgine has quit IRC20:35
*** hseipp has joined #openstack-swift20:36
openstackgerritTim Burke proposed openstack/swift master: Functional tests for staticweb middleware  https://review.openstack.org/50326220:38
*** d0ugal has quit IRC20:40
openstackgerritTim Burke proposed openstack/swift master: Make storage_domain configurable in func tests  https://review.openstack.org/54927720:41
*** kallenp has joined #openstack-swift20:41
*** bartden has left #openstack-swift20:42
openstackgerritTim Burke proposed openstack/swift feature/deep: Pick up the new probetests check on feature/deep  https://review.openstack.org/55029120:44
*** d0ugal has joined #openstack-swift20:53
kota_morning20:55
notmynamekota_: I hope you got home ok20:56
kota_notmyname: yeah, it was delayed but fine for now20:57
openstackgerritTim Burke proposed openstack/swift master: py3: have Timestamp accept bytestrings, better validate input  https://review.openstack.org/55060220:57
mattoliverauMorning20:57
openstackgerritMerged openstack/swift feature/deep: Add assertions for cleaved broker own shard range state  https://review.openstack.org/55043620:59
notmynamemeeting time in #openstack-meeting20:59
*** hseipp has quit IRC20:59
*** hseipp has joined #openstack-swift21:00
timburkeacoles: a thought on sharding and sync points -- once we cleave and unlink the retired db, could we update *all* sync points to the last row of the db we just unlinked? we no longer have them to send, and we've got an assumption that the rows are now durable...21:01
*** hseipp has quit IRC21:06
*** hseipp has joined #openstack-swift21:06
*** hseipp has quit IRC21:07
*** pcaruana has quit IRC21:12
notmynamerledisez: we were hoping to cover https://etherpad.openstack.org/p/Swift_Operational_Feedback with you. but there's the etherpad, so maybe we can talk more in an async fashion21:18
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Store own shard range in the shard ranges table  https://review.openstack.org/55024621:24
openstackgerritAlistair Coles proposed openstack/swift feature/deep: Persist own shard stats after reporting to root  https://review.openstack.org/55058621:24
*** silor has quit IRC21:28
notmynamerledisez: ok, consistency engine work21:30
rlediseznotmyname: ready :)21:30
*** pdardeau has quit IRC21:31
notmynamethe major stuff we (swiftstack) will be working on include the patches you saw in the meeting. this gives some of the same tuning knobs for the DB replicator as the object replicator21:31
notmynamewe also need to add concurrency-per-disk to both the object replicator and the DB replicator21:31
notmynamewe want to reexamine some tuning defaults, too. this *may* involve changing the baseline for some values. eg moving from "total workers" to a "workers per Foo" metric21:32
*** gerardgine has joined #openstack-swift21:32
notmynameso that the same config file can be better suited to run on different hardware21:32
notmynamemay be -per-disk or -per-core values21:33
notmynameI'm being vague because we haven't really started examining that in detail yet. it's just a meaningful short-term improvement we can make and get done sooner than "remove rsync"21:33
rledisezone related question: we always assume ssync is slow. and it's true. did someone profile that? do we know what is slow?21:34
notmynamethe two big things I do not thing we'll be able to get done as a community in 2018 (unless something radically changes in our community) are creating a replacement replication protocol that removes rsync and rewriting storage node servers in golang21:34
notmynamerledisez: clayg has some great thoughts on that, but it mostly comes down to rsync replication being decent at bulk replication (aside from the lack of backpressure from us not being in the data path) and ssync being decent and replicating individual objects21:35
notmynamethey're respectively terrible at the other21:35
notmynamerledisez: IIRC ssync is pretty slow because it's sending (and managing) individual objects instead of partitions, suffixes, or anything batch-related21:39
rlediseznotmyname: ok, i see your point21:40
notmynameoh, and I just had a call this morning about a customer who has a pretty small amount of storage (15 servers) but they have billions and billions of tiny objects. they're wondering how to make it faster. "well, there's this thing rledisez is working on...." ;-)21:41
rledisezwell, i won't say it's easy to use for now, but we deployed it on 10 servers (~2PB), and will move to 100 servers in a week21:42
notmynamenice!21:42
notmynamerledisez: on the consistency engine front, torgomatic is currently working on improving the object replicator to better organize the replication work jobs. that, along with the concurrency per disk, should help make some meaningful improvement in the replication engine21:43
notmynamewhen will alecuyer be back from holiday? could we set something up for next week?21:44
torgomaticyeah, ssync is a chatty protocol, and it also goes through the normal diskfile paths so it's calling fsync() left and right21:44
rlediseznotmyname: he'll be back on monday, i'll drop him a mail right now to ask him if he's available fo smthing21:45
notmynameok. maybe tdasilva can host a video chat next week21:45
rlediseznotmyname: torgomatic: if it can help, we use this on our clusters for reconstruction: https://review.openstack.org/#/c/548664/21:45
patchbotpatch 548664 - swift - Split REVERT and SYNC processes in reconstructor21:45
tdasilvanotmyname, rledisez let me know when and i can set it up21:45
timburkestarred21:45
torgomaticrledisez: that sounds like a good idea. I'd briefly considered sorting the jobs and doing all REVERT first since those are cheaper and might save some other node from doing a full reconstruction21:46
torgomaticI never got to writing code for that, though...21:46
rledisezBTW, what's the thing with swift-tox-py27? is there any issue? all my patches fails on that one21:46
rledisezor am I a terrible dev? yeah, probably true also :D21:46
notmynamelol21:46
notmynameshould be the same as `.unittests` locally21:46
torgomaticrledisez: if it's a test about the lockup detector, you can blame someone else. Otherwise... ;)21:47
rledisezi'll check my SAIO, because unittests are OK for me21:47
rlediseztorgomatic: on that subject of revert first (it's dirty, sorry :)): https://review.openstack.org/#/c/389676/21:48
patchbotpatch 389676 - swift - WIP: reconstructor: do not sync recently moved parts21:48
kallenpAnyone, who can remotely help me with OpenStack Swift implementation ?21:49
notmynamekallenp: we're happy to help answer specific questions, but none of us here are equipped to do professional services or contract work. however, several of us work for companies who provide those paid products21:50
rledisezthx for all the info notmyname and torgomatic, i'll sleep on that21:55
notmynamerledisez: let me know what alecuyer says and we'll get a video chat set up21:56
rledisezsure21:56
*** ChanServ sets mode: +v mattoliverau22:00
*** mlanner has joined #openstack-swift22:06
*** kallenp has quit IRC22:10
*** kallenp has joined #openstack-swift22:11
*** ggine has joined #openstack-swift22:11
*** openstackstatus has quit IRC22:13
*** openstack has joined #openstack-swift22:15
*** ChanServ sets mode: +o openstack22:15
*** ggine has quit IRC22:35
*** itlinux has quit IRC22:36
*** rcernin has joined #openstack-swift22:37
*** kallenp has quit IRC22:37
*** kallenp has joined #openstack-swift22:38
*** kallenp has joined #openstack-swift22:39
*** kallenp has quit IRC22:39
*** openstackstatus has quit IRC22:42
*** openstack has joined #openstack-swift22:44
*** ChanServ sets mode: +o openstack22:44
*** openstackstatus has joined #openstack-swift22:44
*** ChanServ sets mode: +v openstackstatus22:44
*** kallenp has joined #openstack-swift22:57
*** armaan has quit IRC22:58
*** armaan has joined #openstack-swift22:59
*** threestrands has joined #openstack-swift23:12
*** kallenp has left #openstack-swift23:15
*** kei_yama has joined #openstack-swift23:19
*** armaan has quit IRC23:33
notmynamehttp://not.mn/reviews.html <-- dashboard updated. was broken for some reason23:33
*** armaan has joined #openstack-swift23:34
*** threestrands_ has joined #openstack-swift23:34
*** threestrands_ has quit IRC23:34
*** threestrands_ has joined #openstack-swift23:34
*** threestrands_ has quit IRC23:35
*** threestrands_ has joined #openstack-swift23:36
*** threestrands has quit IRC23:36
*** gerardgine has joined #openstack-swift23:49

Generated by irclog2html.py 2.15.3 by Marius Gedminas - find it at mg.pov.lt!