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

Reply via email to