Regression in LinkedTransferQueue since JDK17?

Matthew Swift via Concurrency-interest <[email protected]> Tue, 5 Jul 2022 19:00:58 +0200
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <CANGKH63YtErC0sWjLVRwZfMRJ8dj6MGgq8-UPzkV93Uv8Dpv1w@mail.gmail.com>
--0000000000009e9e2605e311cc56
Content-Type: multipart/alternative; boundary="0000000000009e9e2205e311cc54"

--0000000000009e9e2205e311cc54
Content-Type: text/plain; charset="UTF-8"

Hello!

Our application contains a work queue based on LinkedTransferQueue. After
some initial load, I leave the server idle only to notice that one of the
subscriber threads is spinning after a period of time.

I've only noticed this problem while testing on 17.0.3 as well as the
version of JDK18 currently shipped with Ubuntu 22.04 LTS (build
18-ea+36-Ubuntu-1 - sorry, no idea what this version really means). I
suspect the problem is related to a recent refactoring in LTQ:
https://bugs.openjdk.org/browse/JDK-8246677

I've managed to implement a test case that reliably fails after a few
minutes (attached). When running under the debugger I can see a single
subscriber thread is spinning
in java.util.concurrent.LinkedTransferQueue#awaitMatch while performing a
timed poll():

       while ((item = s.item) == e) {
            if (needSweep)                               // FALSE
                sweep();
            else if ((timed && nanos <= 0L) || w.isInterrupted()) {
                if (s.casItem(e, (e == null) ? s : null)) {
                    unsplice(pred, s);   // cancelled
                    return e;
                }
            }
            else if (stat <= 0) {                       // TRUE (stat = 0)
                if (pred != null && pred.next == s) {   // FALSE (pred !=
null but pred.next != s)
                    if (stat < 0 &&
                        (pred.isData != isData || pred.isMatched())) {
                        stat = 0;
                        Thread.yield();
                    }
                    else {
                        stat = 1;
                        s.waiter = w;
                    }
                }
            }
            ...
        }

It's as if the subscribers race each other to poll the empty queue
eventually causing one of the subscribers to get stuck in an infinite loop.
Cheers,
Matt

--0000000000009e9e2205e311cc54
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

PGRpdiBkaXI9Imx0ciI+SGVsbG8hPGRpdj48YnI+PC9kaXY+PGRpdj5PdXIgYXBwbGljYXRpb24g
Y29udGFpbnMgYSB3b3JrIHF1ZXVlIGJhc2VkIG9uIExpbmtlZFRyYW5zZmVyUXVldWUuIEFmdGVy
IHNvbWUgaW5pdGlhbCBsb2FkLCBJIGxlYXZlIHRoZSBzZXJ2ZXIgaWRsZSBvbmx5IHRvIG5vdGlj
ZSB0aGF0IG9uZSBvZiB0aGUgc3Vic2NyaWJlciB0aHJlYWRzIGlzIHNwaW5uaW5nIGFmdGVyIGEg
cGVyaW9kwqBvZiB0aW1lLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSYjMzk7dmUgb25seSBu
b3RpY2VkIHRoaXMgcHJvYmxlbSB3aGlsZSB0ZXN0aW5nIG9uIDE3LjAuMyBhcyB3ZWxsIGFzIHRo
ZSB2ZXJzaW9uIG9mIEpESzE4IGN1cnJlbnRseSBzaGlwcGVkIHdpdGggVWJ1bnR1IDIyLjA0IExU
UyAoYnVpbGQgMTgtZWErMzYtVWJ1bnR1LTEgLSBzb3JyeSwgbm8gaWRlYSB3aGF0IHRoaXMgdmVy
c2lvbiByZWFsbHkgbWVhbnMpLiBJIHN1c3BlY3QgdGhlIHByb2JsZW0gaXMgcmVsYXRlZCB0byBh
IHJlY2VudCByZWZhY3RvcmluZyBpbiBMVFE6wqA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpk
ay5vcmcvYnJvd3NlL0pESy04MjQ2Njc3Ij5odHRwczovL2J1Z3Mub3Blbmpkay5vcmcvYnJvd3Nl
L0pESy04MjQ2Njc3PC9hPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSYjMzk7dmUgbWFuYWdl
ZCB0byBpbXBsZW1lbnQgYSB0ZXN0IGNhc2UgdGhhdCByZWxpYWJseSBmYWlscyBhZnRlciBhIGZl
dyBtaW51dGVzIChhdHRhY2hlZCkuIFdoZW4gcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgSSBj
YW4gc2VlIGEgc2luZ2xlIHN1YnNjcmliZXIgdGhyZWFkIGlzIHNwaW5uaW5nIGluwqBqYXZhLnV0
aWwuY29uY3VycmVudC5MaW5rZWRUcmFuc2ZlclF1ZXVlI2F3YWl0TWF0Y2ggd2hpbGUgcGVyZm9y
bWluZyBhIHRpbWVkIHBvbGwoKTo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxmb250IGZhY2U9
Im1vbm9zcGFjZSI+wqAgwqAgwqAgwqB3aGlsZSAoKGl0ZW0gPSBzLml0ZW0pID09IGUpIHs8YnI+
wqAgwqAgwqAgwqAgwqAgwqAgaWYgKG5lZWRTd2VlcCnCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8vIEZBTFNFPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IHN3ZWVwKCk7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIGVsc2UgaWYgKCh0aW1lZCAmYW1wOyZhbXA7
IG5hbm9zICZsdDs9IDBMKSB8fCB3LmlzSW50ZXJydXB0ZWQoKSkgezxicj7CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCBpZiAocy5jYXNJdGVtKGUsIChlID09IG51bGwpID8gcyA6IG51bGwpKSB7PGJy
PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHVuc3BsaWNlKHByZWQsIHMpOyDCoCAvLyBj
YW5jZWxsZWQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIGU7PGJyPsKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+wqAgwqAgwqAgwqAgwqAgwqAgfTxicj7CoCDCoCDC
oCDCoCDCoCDCoCBlbHNlIGlmIChzdGF0ICZsdDs9IDApIHvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoC8vIFRSVUUgKHN0YXQgPSAwKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCBpZiAocHJlZCAhPSBudWxsICZhbXA7JmFtcDsgcHJlZC5uZXh0ID09IHMpIHvCoCDCoC8vIEZB
TFNFIChwcmVkICE9IG51bGwgYnV0IHByZWQubmV4dCAhPSBzKTxicj7CoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCBpZiAoc3RhdCAmbHQ7IDAgJmFtcDsmYW1wOzxicj7CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAocHJlZC5pc0RhdGEgIT0gaXNEYXRhIHx8IHByZWQuaXNN
YXRjaGVkKCkpKSB7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0YXQg
PSAwOzxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBUaHJlYWQueWllbGQo
KTs8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj7CoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCBlbHNlIHs8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgc3RhdCA9IDE7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHMud2Fp
dGVyID0gdzvCoDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPsKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIH08YnI+wqAgwqAgwqAgwqAgwqAgwqAgfTwvZm9udD48YnI+PC9kaXY+
PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UiPsKgIMKgIMKgIMKgIMKgIMKgIC4uLjwvZm9udD48
L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSI+wqAgwqAgwqAgwqAgfTwvZm9udD48L2Rp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkl0JiMzOTtzIGFzIGlmIHRoZSBzdWJzY3JpYmVycyByYWNl
IGVhY2ggb3RoZXIgdG8gcG9sbCB0aGUgZW1wdHkgcXVldWUgZXZlbnR1YWxseSBjYXVzaW5nIG9u
ZSBvZiB0aGUgc3Vic2NyaWJlcnMgdG8gZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AuPC9k
aXY+PGRpdj5DaGVlcnMsPC9kaXY+PGRpdj5NYXR0PC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+
DQo=
--0000000000009e9e2205e311cc54--

--0000000000009e9e2605e311cc56
Content-Type: text/x-java; charset="US-ASCII"; name="LinkedTransferQueueTest.java"
Content-Disposition: attachment; filename="LinkedTransferQueueTest.java"
Content-Transfer-Encoding: base64
Content-ID: <f_l58f31qp0>
X-Attachment-Id: f_l58f31qp0

cGFja2FnZSBjb20uZXhhbXBsZTsKCmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRv
clNlcnZpY2U7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CmltcG9ydCBq
YXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRUcmFuc2ZlclF1ZXVlOwppbXBvcnQgamF2YS51dGls
LmNvbmN1cnJlbnQuVGltZVVuaXQ7CgpwdWJsaWMgZmluYWwgY2xhc3MgTGlua2VkVHJhbnNmZXJR
dWV1ZVRlc3QgewogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTl9USFJFQURTID0gODsKCiAg
ICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0
ZWRFeGNlcHRpb24gewogICAgICAgIExpbmtlZFRyYW5zZmVyUXVldWU8TG9uZz4gcXVldWUgPSBu
ZXcgTGlua2VkVHJhbnNmZXJRdWV1ZTw+KCk7CiAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIHB1Ymxp
c2hlcnMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKE5fVEhSRUFEUyk7CiAgICAgICAg
RXhlY3V0b3JTZXJ2aWNlIHN1YnNjcmliZXJzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9v
bChOX1RIUkVBRFMpOwoKICAgICAgICAvLyBDcmVhdGUgc3Vic2NyaWJlcnMgd2hpY2ggd2lsbCBk
cmFpbiBtYW55IGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSBhbmQgdGhlbiBiZWNvbWUgaWRsZS4KICAg
ICAgICAvLyBJdCBhcHBlYXJzIHRoYXQgc29tZSB0aHJlYWRzIHN0YXJ0IHNwaW5uaW5nIGFmdGVy
IHNvbWUgdGltZSBpZGxlLgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgc3Vi
c2NyaWJlcnMiKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKSB7
CiAgICAgICAgICAgIHN1YnNjcmliZXJzLnN1Ym1pdCgoKSAtPiBydW5TdWJzY3JpYmVyKHF1ZXVl
KSk7CiAgICAgICAgfQoKICAgICAgICAvLyBTYXR1cmF0ZSB0aGUgcXVldWUgYW5kIHRoZW4gbGV0
IGl0IGJlY29tZSBpZGxlLgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgcHVi
bGlzaGVycyIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspIHsK
ICAgICAgICAgICAgcHVibGlzaGVycy5zdWJtaXQoKCkgLT4gcnVuUHVibGlzaGVyKHF1ZXVlKSk7
CiAgICAgICAgfQoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldhaXRpbmcgZm9yIHB1Ymxp
c2hlcnMiKTsKICAgICAgICBwdWJsaXNoZXJzLnNodXRkb3duKCk7CiAgICAgICAgaWYgKHB1Ymxp
c2hlcnMuYXdhaXRUZXJtaW5hdGlvbigxLCBUaW1lVW5pdC5NSU5VVEVTKSkgewogICAgICAgICAg
ICBTeXN0ZW0ub3V0LnByaW50bG4oIlB1Ymxpc2hlcnMgaGF2ZSBjb21wbGV0ZWQiKTsKICAgICAg
ICB9IGVsc2UgewogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlB1Ymxpc2hlcnMgZGlk
bid0IGNvbXBsZXRlIHdpdGhpbiAxIG1pbnV0ZSIpOwogICAgICAgIH0KCiAgICAgICAgU3lzdGVt
Lm91dC5wcmludGxuKCJXYWl0aW5nIGZvciBzdWJzY3JpYmVycyAoc2hvdWxkIG5ldmVyIHRlcm1p
bmF0ZSkiKTsKICAgICAgICBzdWJzY3JpYmVycy5zaHV0ZG93bigpOwogICAgICAgIGlmIChzdWJz
Y3JpYmVycy5hd2FpdFRlcm1pbmF0aW9uKDEsIFRpbWVVbml0LkhPVVJTKSkgewogICAgICAgICAg
ICBTeXN0ZW0uZXJyLnByaW50bG4oIlN1YnNjcmliZXJzIGhhdmUgY29tcGxldGVkIHVuZXhwZWN0
ZWRseSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi
U3Vic2NyaWJlcnMgdGltZWQgb3V0IGFmdGVyIDEgaG91ciIpOwogICAgICAgIH0KICAgIH0KCiAg
ICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blN1YnNjcmliZXIoTGlua2VkVHJhbnNmZXJRdWV1ZTxM
b25nPiBxdWV1ZSkgewogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHRyeSB7CiAg
ICAgICAgICAgICAgICBMb25nIGV2ZW50ID0gcXVldWUucG9sbCg1LCBUaW1lVW5pdC5TRUNPTkRT
KTsKICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsICYmIGV2ZW50IDwgMCkgewogICAg
ICAgICAgICAgICAgICAgIC8vIE5ldmVyIGNvbXBsZXRlcy4KICAgICAgICAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRF
eGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24o
ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgdm9p
ZCBydW5QdWJsaXNoZXIoTGlua2VkVHJhbnNmZXJRdWV1ZTxMb25nPiBxdWV1ZSkgewogICAgICAg
IGZvciAobG9uZyBldmVudCA9IDA7IGV2ZW50IDwgMTAwMDAwMEw7IGV2ZW50KyspIHsKICAgICAg
ICAgICAgcXVldWUub2ZmZXIoZXZlbnQpOwogICAgICAgIH0KICAgIH0KfQoK
--0000000000009e9e2605e311cc56
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest

--0000000000009e9e2605e311cc56--