Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
### Fixes

- Add support for setting in-app-includes/in-app-excludes via AndroidManifest.xml ([#4240](https://github.com/getsentry/sentry-java/pull/4240))
- Avoid unnecessary copies and ensure thread-safety when using `CopyOnWriteArrayList` ([#4247](https://github.com/getsentry/sentry-java/pull/4247))
- This affects in particular `SentryTracer.getLatestActiveSpan` which would have previously unnecessarily copied all children spans, with high impact on memory usage
Comment thread
lcian marked this conversation as resolved.
Outdated
Comment thread
lcian marked this conversation as resolved.
Outdated

### Features

Expand Down
2 changes: 1 addition & 1 deletion sentry/src/main/java/io/sentry/Scope.java
Original file line number Diff line number Diff line change
Expand Up @@ -759,7 +759,7 @@ public void removeContexts(final @NotNull String key) {
@NotNull
@Override
public List<Attachment> getAttachments() {
return new CopyOnWriteArrayList<>(attachments);
return attachments;
Comment thread
lcian marked this conversation as resolved.
Outdated
}

/**
Expand Down
35 changes: 19 additions & 16 deletions sentry/src/main/java/io/sentry/SentryTracer.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.Objects;
import io.sentry.util.SpanUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
Expand Down Expand Up @@ -155,7 +154,10 @@ private void onDeadlineTimeoutReached() {
// abort all child-spans first, this ensures the transaction can be finished,
// even if waitForChildren is true
// iterate in reverse order to ensure leaf spans are processed before their parents
@NotNull final ListIterator<Span> iterator = children.listIterator(children.size());
Comment thread
lcian marked this conversation as resolved.
@NotNull final ListIterator<Span> iterator = this.children.listIterator();
while (iterator.hasNext()) {
iterator.next();
}
Comment thread
lcian marked this conversation as resolved.
Outdated
while (iterator.hasPrevious()) {
@NotNull final Span span = iterator.previous();
span.setSpanFinishedCallback(null);
Expand Down Expand Up @@ -677,14 +679,13 @@ private void updateBaggageValues(final @NotNull Baggage baggage) {
}

private boolean hasAllChildrenFinished() {
final List<Span> spans = new ArrayList<>(this.children);
if (!spans.isEmpty()) {
for (final Span span : spans) {
// This is used in the spanFinishCallback, when the span isn't finished, but has a finish
// date
if (!span.isFinished() && span.getFinishDate() == null) {
return false;
}
@NotNull final ListIterator<Span> iterator = this.children.listIterator();
while (iterator.hasNext()) {
@NotNull final Span span = iterator.next();
// This is used in the spanFinishCallback, when the span isn't finished, but has a finish
// date
if (!span.isFinished() && span.getFinishDate() == null) {
return false;
}
}
return true;
Expand Down Expand Up @@ -909,12 +910,14 @@ public void setName(@NotNull String name, @NotNull TransactionNameSource transac

@Override
public @Nullable ISpan getLatestActiveSpan() {
final List<Span> spans = new ArrayList<>(this.children);
if (!spans.isEmpty()) {
for (int i = spans.size() - 1; i >= 0; i--) {
if (!spans.get(i).isFinished()) {
return spans.get(i);
}
@NotNull final ListIterator<Span> iterator = this.children.listIterator();
while (iterator.hasNext()) {
Comment thread
lcian marked this conversation as resolved.
Outdated
iterator.next();
}
while (iterator.hasPrevious()) {
@NotNull final Span span = iterator.previous();
if (!span.isFinished()) {
return span;
}
}
return null;
Expand Down
Loading