I've added PRs for wicket 8.x, 9.x and master. I assume we won't be
releasing a 7.x anytime soon, so this is just one more benefit for
upgrading to a newer version IMO.

Even though this came up as a blocking hotspot, it did not show up as a
performance hotspot, so it will benefit all wicket applications, but it is
not detrimental.

If there are no objections I intend to merge these changes somewhere on
monday.

Martijn


On Fri, Sep 2, 2022 at 5:43 PM Martijn Dashorst <martijn.dasho...@gmail.com>
wrote:

> I've created this ticket for this:
>
> https://issues.apache.org/jira/browse/WICKET-7002
>
> And a PR: https://github.com/apache/wicket/pull/532
>
> Martijn
>
>
> On Fri, Sep 2, 2022 at 2:37 PM Martijn Dashorst <
> martijn.dasho...@gmail.com> wrote:
>
>> Well,
>>
>> I think that the metadata storage in Application tries to mimic a
>> key-value store, but does so in an esoteric way that requires
>> synchronization, which is unnecessary when we just use a ConcurrentHashMap
>> for the datastructure that is especially designed for this use case.
>> Changing the array to a ConcurrentHashMap will not increase the memory
>> footprint in any meaningful way, but will remove the need for
>> synchronization and change the algorithm for looking up a value by key from
>> O(n) to O(1) (
>> https://stackoverflow.com/questions/559839/big-o-summary-for-java-collections-framework-implementations
>> ).
>>
>> The change is completely encapsulated for external users (unless they
>> play with the internals using reflection) so this can also be backported to
>> Wicket 9, 8 and 7, up til Wicket 1.5 if we so desire (we don't but you get
>> my drift).
>>
>> I also think it is a bad idea to return the datastructure from the
>> setter. This would have made this optimization impossible to do in a
>> backwards compatible way.
>>
>> Martijn
>>
>>
>> On Fri, Sep 2, 2022 at 11:59 AM Andrea Del Bene <an.delb...@gmail.com>
>> wrote:
>>
>>> It's of course a delicate topic and it needs a full investigation, but
>>> looking at the code of both setMetaData and getMetaData I think we could
>>> reduce the synchronization overloading by making Application#metadata
>>> volatile and removing synchronized from getMetaData. In addition I think
>>> setMetaData should always return a new copy of Application#metadata to
>>> ensure a proper synchronization among threads, but I'm not 100% sure
>>> about
>>> this.
>>>
>>> Just some 2 cents...
>>>
>>> On Fri, Sep 2, 2022 at 8:46 AM Martijn Dashorst <
>>> martijn.dasho...@gmail.com>
>>> wrote:
>>>
>>> > Heya!
>>> >
>>> > In a performance dump for a production issue I was looking through the
>>> > monitors that were in use during request processing and I noticed that
>>> a
>>> > lot of request threads were blocking on Application.getMetaData.
>>> >
>>> > This method is synchronized because it uses an array of metadata and
>>> goes
>>> > through that array in search of the key.
>>> >
>>> > I'm no rocket scientist, but shouldn't that metadata field just be a
>>> > ConcurrentHashMap so we can remove the blocking synchronization on the
>>> > application object?
>>> >
>>> > Martijn
>>> >
>>> > <http://wicketinaction.com>
>>> >
>>>
>>>
>>> --
>>> Andrea Del Bene.
>>> Apache Wicket committer.
>>>
>>
>>
>> --
>> Become a Wicket expert, learn from the best: http://wicketinaction.com
>>
>
>
> --
> Become a Wicket expert, learn from the best: http://wicketinaction.com
>


-- 
Become a Wicket expert, learn from the best: http://wicketinaction.com

Reply via email to