Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP 500 fix when having many requests in parallel #283

Open
wants to merge 2 commits into
base: branch-5.0
Choose a base branch
from

Conversation

ErykKul
Copy link

@ErykKul ErykKul commented Jan 15, 2025

Hi,

We have implemented an OAI interface using this library and our DB as source. When doing a load test, we noticed some HTTP 500 errors caused by the use of an instance (in a static field) of the java.util.regex.Matcher class, which is not safe to use in concurrent threads. In this PR, the static field is replaced by an instance of java.util.regex.Pattern class, which is thread safe, and should fix the problem.

Copy link
Member

@pdurbin pdurbin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't run the code but the change makes sense to me! Thanks, @ErykKul!

@@ -109,7 +108,7 @@ protected void writeXml(XmlWriter writer) throws IOException {

String firstChars = new String(bytes, StandardCharsets.UTF_8);
// match the start with the compiled regex and replace with nothing when matching.
firstChars = xmlDeclaration.reset(firstChars).replaceFirst("");
firstChars = xmlDeclaration.matcher(firstChars).replaceFirst("");

// write the chars to the output stream
writer.getOutputStream().write(firstChars.getBytes(StandardCharsets.UTF_8));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm just leaving this comment at the bottom.

The Sonar test is failing with the same error we saw in this issue:

@@ -14,7 +14,6 @@
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.regex.Matcher;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't run the code but yes, what @ErykKul is saying about thread safety seems well documented.

"Instances of this class are not safe for use by multiple concurrent threads." -- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Matcher.html

"Instances of this class are immutable and are safe for use by multiple concurrent threads. Instances of the Matcher class are not safe for such use." -- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html

So, yes, it sounds good to me to swap Matcher for Pattern!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants