palantir / atlasdb

Transactional Distributed Database Layer
https://palantir.github.io/atlasdb/
Apache License 2.0
45 stars 7 forks source link

Initialize eclipse-collections classes to avoid JDK classload deadlock #7081

Closed schlosna closed 2 months ago

schlosna commented 3 months ago

General

Before this PR:

Follow up to https://github.com/palantir/atlasdb/pull/7073 as we encountered an AtlasDB service that hit JDK classloader deadlock bug JDK-8266350 / JDK-8266310 on JDK 17 that was outside of #7073 changes.

The problematic class loading was the service loader traversal in org.eclipse.collections.api.factory.Sets looking for org.eclipse.collections.api.factory.set.ImmutableSetFactory instances triggered from org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet#collect via CommitTimestampLoader.waitForCommitToComplete(LongIterable). This ends up

org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet#collect:

    @Override
    public <V> ImmutableSet<V> collect(LongToObjectFunction<? extends V> function)
    {
        return Sets.immutable.of();
    }

https://github.com/palantir/atlasdb/blob/59ba3ee8fcbcaa4b1c1985f34f32f6481a3e5914/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/transaction/impl/CommitTimestampLoader.java#L174-L181

Note that this code was recently refactored and moved to DefaultCommitTimestampLoader, but the same issue may still occur with some probability depending on JNI & class loading ordering.

https://github.com/palantir/atlasdb/blob/29d98957a65265a83bb525af79ce637a84fb9885/atlasdb-impl-shared/src/main/java/com/palantir/atlasdb/transaction/impl/DefaultCommitTimestampLoader.java#L183-L190

After this PR:

As a temporary workaround for services that are not yet running with JDK-8266310 fix in JDK 18+, we can pre-load the eclipse-collections classes that traverse ServiceLoader as those are the ones most likely to encounter deadlock with concurrent JNI loadLibrary calls.

==COMMIT_MSG== Eagerly initialize Eclipse collections classes to avoid potential JDK classloader deadlock bug JDK-8266350 / JDK-8266310 when one thread is attempting to load a native library (e.g. netty which is used by grpc) while another thread is attempting to load classes from a cryptographically signed JAR (e.g. eclipse-collections). This has been seen by some folks using netty & eclipse-collections in netty issue 11209](https://github.com/netty/netty/issues/11209#issuecomment-829468638)

JDK-8266310 fixed this deadlock in JDK 18+.

==COMMIT_MSG==

Priority:

Concerns / possible downsides (what feedback would you like?):

This could add significant time to initial transaction manager startup (e.g. unit test in CI took 18.4 seconds to initialize these eclipse-collections classes, with a relatively small set of libraries in atlasdb-commons compared to full services & the classes in their application classloader context )

Is documentation needed?:

Compatibility

Does this PR create any API breaks (e.g. at the Java or HTTP layers) - if so, do we have compatibility?:

Does this PR change the persisted format of any data - if so, do we have forward and backward compatibility?:

The code in this PR may be part of a blue-green deploy. Can upgrades from previous versions safely coexist? (Consider restarts of blue or green nodes.):

Does this PR rely on statements being true about other products at a deployment - if so, do we have correct product dependencies on these products (or other ways of verifying that these statements are true)?:

Does this PR need a schema migration?

Testing and Correctness

What, if any, assumptions are made about the current state of the world? If they change over time, how will we find out?:

What was existing testing like? What have you done to improve it?:

If this PR contains complex concurrent or asynchronous code, is it correct? The onus is on the PR writer to demonstrate this.:

If this PR involves acquiring locks or other shared resources, how do we ensure that these are always released?:

Execution

How would I tell this PR works in production? (Metrics, logs, etc.):

Has the safety of all log arguments been decided correctly?:

Will this change significantly affect our spending on metrics or logs?:

How would I tell that this PR does not work in production? (monitors, etc.):

If this PR does not work as expected, how do I fix that state? Would rollback be straightforward?:

If the above plan is more complex than “recall and rollback”, please tag the support PoC here (if it is the end of the week, tag both the current and next PoC):

Scale

Would this PR be expected to pose a risk at scale? Think of the shopping product at our largest stack.:

Would this PR be expected to perform a large number of database calls, and/or expensive database calls (e.g., row range scans, concurrent CAS)?:

Would this PR ever, with time and scale, become the wrong thing to do - and if so, how would we know that we need to do something differently?:

Development Process

Where should we start reviewing?:

If this PR is in excess of 500 lines excluding versions lock-files, why does it not make sense to split it?:

Please tag any other people who should be aware of this PR: @jeremyk-91 @sverma30 @raiju

changelog-app[bot] commented 3 months ago

Generate changelog in changelog-dir>`changelog/@unreleased`</changelog-dir

What do the change types mean? - `feature`: A new feature of the service. - `improvement`: An incremental improvement in the functionality or operation of the service. - `fix`: Remedies the incorrect behaviour of a component of the service in a backwards-compatible way. - `break`: Has the potential to break consumers of this service's API, inclusive of both Palantir services and external consumers of the service's API (e.g. customer-written software or integrations). - `deprecation`: Advertises the intention to remove service functionality without any change to the operation of the service itself. - `manualTask`: Requires the possibility of manual intervention (running a script, eyeballing configuration, performing database surgery, ...) at the time of upgrade for it to succeed. - `migration`: A fully automatic upgrade migration task with no engineer input required. _Note: only one type should be chosen._
How are new versions calculated? - ❗The `break` and `manual task` changelog types will result in a major release! - 🐛 The `fix` changelog type will result in a minor release in most cases, and a patch release version for patch branches. This behaviour is configurable in autorelease. - ✨ All others will result in a minor version release.

Type

- [ ] Feature - [ ] Improvement - [x] Fix - [ ] Break - [ ] Deprecation - [ ] Manual task - [ ] Migration

Description

Eagerly initialize Eclipse collections classes to avoid potential JDK classloader deadlock bug [JDK-8266350](https://bugs.openjdk.org/browse/JDK-8266350) / [JDK-8266310](https://bugs.openjdk.org/browse/JDK-8266310) when one thread is attempting to load a native library (e.g. netty which is used by grpc) while another thread is attempting to load classes from a cryptographically signed JAR (e.g. eclipse-collections). This has been seen by some folks using netty & eclipse-collections in netty issue 11209](https://github.com/netty/netty/issues/11209#issuecomment-829468638) [JDK-8266310](https://bugs.openjdk.org/browse/JDK-8266310) fixed this deadlock in JDK 18+. **Check the box to generate changelog(s)** - [x] Generate changelog entry
schlosna commented 3 months ago

some of the example stack traces for threads blocked on class loading:

sun.security.provider.SHA5.lf_S(long, int):175
   sun.security.provider.SHA5.lf_sigma1(long):193
      sun.security.provider.SHA5.implCompress0(byte[], int):265
      sun.security.provider.SHA5.implCompress(byte[], int):223
      sun.security.provider.DigestBase.implCompressMultiBlock0(byte[], int, int):150
      sun.security.provider.DigestBase.implCompressMultiBlock(byte[], int, int):144
      sun.security.provider.DigestBase.engineUpdate(byte[], int, int):131
      java.security.MessageDigest$Delegate.engineUpdate(byte[], int, int):658
      java.security.MessageDigest.update(byte[], int, int):349
      sun.security.rsa.RSASignature.engineUpdate(byte[], int, int):172
      java.security.Signature$Delegate.engineUpdate(byte[], int, int):1413
      java.security.Signature.update(byte[], int, int):902
      java.security.Signature.update(byte[]):871
      sun.security.pkcs.SignerInfo.verify(PKCS7, byte[]):492
      sun.security.pkcs.PKCS7.verify(SignerInfo, byte[]):555
      sun.security.pkcs.PKCS7.verify(byte[]):572
      sun.security.util.SignatureFileVerifier.processImpl(Hashtable, List, String):313
      sun.security.util.SignatureFileVerifier.process(Hashtable, List, String):289
      java.util.jar.JarVerifier.processEntry(ManifestEntryVerifier):327
      java.util.jar.JarVerifier.update(int, byte[], int, int, ManifestEntryVerifier):239
      java.util.jar.JarFile.initializeVerifier():761
      java.util.jar.JarFile.getInputStream(ZipEntry):849
      sun.net.www.protocol.jar.JarURLConnection.getInputStream():187
      java.util.ServiceLoader$LazyClassPathLookupIterator.parse(URL):1172
      java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass():1213
      java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService():1228
      java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext():1273
      java.util.ServiceLoader$2.hasNext():1309
      java.util.ServiceLoader$3.hasNext():1393
      org.eclipse.collections.api.factory.ServiceLoaderUtils.loadServiceClass(Class, ClassLoader):318
      org.eclipse.collections.api.factory.ServiceLoaderUtils.loadServiceClass(Class):292
      org.eclipse.collections.api.factory.primitive.LongLongMaps.<clinit>():30
      com.palantir.atlasdb.transaction.impl.SerializableTransaction$PartitionedTimestamps.myCommittedTransaction():1118
sun.security.provider.SHA5.implCompress0(byte[], int):251
   sun.security.provider.SHA5.implCompress(byte[], int):223
   sun.security.provider.DigestBase.implCompressMultiBlock0(byte[], int, int):150
   sun.security.provider.DigestBase.implCompressMultiBlock(byte[], int, int):144
   sun.security.provider.DigestBase.engineUpdate(byte[], int, int):131
   java.security.MessageDigest$Delegate.engineUpdate(byte[], int, int):658
   java.security.MessageDigest.update(byte[], int, int):349
   sun.security.rsa.RSASignature.engineUpdate(byte[], int, int):172
   java.security.Signature$Delegate.engineUpdate(byte[], int, int):1413
   java.security.Signature.update(byte[], int, int):902
   java.security.Signature.update(byte[]):871
   sun.security.pkcs.SignerInfo.verify(PKCS7, byte[]):492
   sun.security.pkcs.PKCS7.verify(SignerInfo, byte[]):555
   sun.security.pkcs.PKCS7.verify(byte[]):572
   sun.security.util.SignatureFileVerifier.processImpl(Hashtable, List, String):313
   sun.security.util.SignatureFileVerifier.process(Hashtable, List, String):289
   java.util.jar.JarVerifier.processEntry(ManifestEntryVerifier):327
   java.util.jar.JarVerifier.update(int, byte[], int, int, ManifestEntryVerifier):239
   java.util.jar.JarFile.initializeVerifier():761
   java.util.jar.JarFile.getInputStream(ZipEntry):849
   sun.net.www.protocol.jar.JarURLConnection.getInputStream():187
   java.util.ServiceLoader$LazyClassPathLookupIterator.parse(URL):1172
   java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass():1213
   java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService():1228
   java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext():1273
   java.util.ServiceLoader$2.hasNext():1309
   java.util.ServiceLoader$3.hasNext():1393
   org.eclipse.collections.api.factory.ServiceLoaderUtils.loadServiceClass(Class, ClassLoader):318
   org.eclipse.collections.api.factory.ServiceLoaderUtils.loadServiceClass(Class):292
   org.eclipse.collections.api.factory.primitive.LongLongMaps.<clinit>():30
      com.palantir.atlasdb.transaction.impl.SerializableTransaction$PartitionedTimestamps.myCommittedTransaction():1118
      com.palantir.atlasdb.transaction.impl.ImmutablePartitionedTimestamps.<init>(long, LongSet, LongSet, Long):51
      com.palantir.atlasdb.transaction.impl.ImmutablePartitionedTimestamps$Builder.build():346
      com.palantir.atlasdb.transaction.impl.SerializableTransaction$4.splitTransactionBeforeAndAfter(long, LongIterable):1033
      com.palantir.atlasdb.transaction.impl.SerializableTransaction$4.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):954
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringInternal(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1714
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringIterate$32(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1593
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1489+0x00000001008e6858.863379376.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringIterate(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1587
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringAsync$31(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1570
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1488+0x00000001008e6630.814467083.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringAsync(TableReference, Map, Function, AsyncKeyValueService, AsyncTransactionService):1568
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringSync(TableReference, Map, Function):1522
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.filterRowResults(TableReference, Map, ImmutableMap$Builder):884
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRowsInternal(TableReference, Iterable, ColumnSelection):468
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getRows$1(TableReference, ColumnSelection, Iterable):444
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1462+0x00000001008db120.1211247912.apply(Object):-1
      com.palantir.atlasdb.keyvalue.api.cache.NoOpTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):85
      com.palantir.atlasdb.keyvalue.api.cache.ReadOnlyTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):90
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRows(TableReference, Iterable, ColumnSelection):433
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.verifyColumns(Transaction, TableReference, ConcurrentNavigableMap, Multimap, ColumnSelection):620
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.verifyRows(Transaction):608
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.throwIfReadWriteConflictForSerializable(long):592
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$commitWrites$48(long):2153
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1811+0x00000001009b5c68.85615641.run():-1
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.traced(String, Runnable):2185
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.timedAndTraced(String, Runnable):2191
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$commitWrites$53(TransactionService):2152
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1555+0x0000000100906750.2139369072.run():-1
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.traced(String, Runnable):2185
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.timedAndTraced(String, Runnable):2191
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.commitWrites(TransactionService):2093
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.commitWithoutCallbacks(TransactionService):2028
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.commitWithoutCallbacks():1994
      com.palantir.atlasdb.transaction.impl.AbstractTransactionManager.runTaskThrowOnConflictWithCallback(TransactionTask, CallbackAwareTransaction, Runnable):72
      com.palantir.atlasdb.transaction.impl.SnapshotTransactionManager$OpenTransactionImpl.finishWithCallback(TransactionTask, Runnable):269
      com.palantir.atlasdb.transaction.impl.SnapshotTransactionManager.runTaskWithConditionThrowOnConflict(PreCommitCondition, ConditionAwareTransactionTask):185
      com.palantir.atlasdb.transaction.impl.SerializableTransactionManager.runTaskWithConditionThrowOnConflict(PreCommitCondition, ConditionAwareTransactionTask):58
      com.palantir.atlasdb.transaction.impl.AbstractConditionAwareTransactionManager.lambda$runTaskWithConditionWithRetry$0(Supplier, ConditionAwareTransactionTask):50
      com.palantir.atlasdb.transaction.impl.AbstractConditionAwareTransactionManager$$Lambda$1383+0x0000000100898888.592123821.run():-1
      com.palantir.atlasdb.transaction.impl.TransactionRetryStrategy$$Lambda$1393+0x000000010089b498.184549460.call():-1
      com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(Callable):78
      com.github.rholder.retry.Retryer.call(Callable):160
      com.palantir.atlasdb.transaction.impl.TransactionRetryStrategy.runWithRetry(IntPredicate, TransactionRetryStrategy$Retryable):86
      com.palantir.atlasdb.transaction.impl.AbstractConditionAwareTransactionManager.runTaskWithConditionWithRetry(Supplier, ConditionAwareTransactionTask):47
      com.palantir.atlasdb.transaction.api.TransactionManager.runTaskWithConditionWithRetry(Supplier, ConditionAwareTransactionTask):255
      com.palantir.atlasdb.transaction.impl.AbstractConditionAwareTransactionManager.runTaskWithRetry(TransactionTask):62
      com.palantir.tritium.proxy.InstrumentedTransactionManager$5.runTaskWithRetry(TransactionTask):-1
      com.palantir.atlas.migration2.orchestration.consensus.HeartbeatingConsensusStore.writeHeartbeat(String, SchemaVersion, Set, long):97
      com.palantir.atlas.migration2.orchestration.consensus.HeartbeatingConsensusManager$HeartbeatWritingService.runOneIteration():147
      com.google.common.util.concurrent.AbstractScheduledService$ServiceDelegate$Task.run():234
      com.google.common.util.concurrent.Callables.lambda$threadRenaming$3(Supplier, Runnable):105
      com.google.common.util.concurrent.Callables$$Lambda$1378+0x0000000100896798.960545396.run():-1
      com.palantir.tracing.Tracers.lambda$wrapWithNewTrace$1(Observability, String, Runnable):435
      com.palantir.tracing.Tracers$$Lambda$332+0x000000010042b9d0.1408073939.run():-1
      com.palantir.tritium.metrics.TaggedMetricsScheduledExecutorService$TaggedMetricsRunnable.run():138
      java.util.concurrent.Executors$RunnableAdapter.call():539
      java.util.concurrent.FutureTask.runAndReset():305
      java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run():305
      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker):1136
      java.util.concurrent.ThreadPoolExecutor$Worker.run():635
      com.palantir.tritium.metrics.TaggedMetricsThreadFactory$InstrumentedTask.run():94
      java.lang.Thread.run():840
   org.eclipse.collections.api.factory.Sets.<clinit>():59
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):146
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):47
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitToComplete(LongIterable):178
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitterToComplete(TableReference, LongIterable):210
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):126
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):2590
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringInternal(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1714
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringIterate$32(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1593
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1489+0x00000001008e6858.863379376.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringIterate(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1587
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringAsync$31(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1570
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1488+0x00000001008e6630.814467083.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringAsync(TableReference, Map, Function, AsyncKeyValueService, AsyncTransactionService):1568
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringSync(TableReference, Map, Function):1522
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.filterRowResults(TableReference, Map, ImmutableMap$Builder):884
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRowsInternal(TableReference, Iterable, ColumnSelection):468
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getRows$1(TableReference, ColumnSelection, Iterable):444
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1462+0x00000001008db120.1211247912.apply(Object):-1
      com.palantir.atlasdb.keyvalue.api.cache.NoOpTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):85
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRows(TableReference, Iterable, ColumnSelection):433
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.getRows(TableReference, Iterable, ColumnSelection):210
   org.eclipse.collections.api.factory.Sets.<clinit>():61
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):146
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):47
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitToComplete(LongIterable):178
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitterToComplete(TableReference, LongIterable):210
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):126
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):2590
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringInternal(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1714
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringIterate$32(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1593
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1489+0x00000001008e6858.863379376.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringIterate(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1587
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringAsync$31(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1570
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1488+0x00000001008e6630.814467083.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringAsync(TableReference, Map, Function, AsyncKeyValueService, AsyncTransactionService):1568
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringSync(TableReference, Map, Function):1522
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.filterRowResults(TableReference, Map, ImmutableMap$Builder):884
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRowsInternal(TableReference, Iterable, ColumnSelection):468
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getRows$1(TableReference, ColumnSelection, Iterable):444
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1462+0x00000001008db120.1211247912.apply(Object):-1
      com.palantir.atlasdb.keyvalue.api.cache.NoOpTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):85
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRows(TableReference, Iterable, ColumnSelection):433
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.getRows(TableReference, Iterable, ColumnSelection):210
   org.eclipse.collections.api.factory.Sets.<clinit>():57
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):146
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):47
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitToComplete(LongIterable):178
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitterToComplete(TableReference, LongIterable):210
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):126
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):2590
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringInternal(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1714
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringIterate$32(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1593
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1489+0x00000001008e6858.863379376.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringIterate(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1587
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringAsync$31(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1570
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1488+0x00000001008e6630.814467083.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringAsync(TableReference, Map, Function, AsyncKeyValueService, AsyncTransactionService):1568
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringSync(TableReference, Map, Function):1522
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.filterRowResults(TableReference, Map, ImmutableMap$Builder):884
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRowsInternal(TableReference, Iterable, ColumnSelection):468
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getRows$1(TableReference, ColumnSelection, Iterable):444
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1462+0x00000001008db120.1211247912.apply(Object):-1
      com.palantir.atlasdb.keyvalue.api.cache.NoOpTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):85
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRows(TableReference, Iterable, ColumnSelection):433
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.getRows(TableReference, Iterable, ColumnSelection):210
   org.eclipse.collections.api.factory.Sets.<clinit>():63
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):146
      org.eclipse.collections.impl.set.immutable.primitive.ImmutableLongEmptySet.collect(LongToObjectFunction):47
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitToComplete(LongIterable):178
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.waitForCommitterToComplete(TableReference, LongIterable):210
      com.palantir.atlasdb.transaction.impl.CommitTimestampLoader.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):126
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getCommitTimestamps(TableReference, LongIterable, boolean, AsyncTransactionService):2590
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringInternal(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1714
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringIterate$32(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1593
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1489+0x00000001008e6858.863379376.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringIterate(TableReference, Map, Collection, Function, AsyncKeyValueService, AsyncTransactionService):1587
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getWithPostFilteringAsync$31(TableReference, Collection, Function, AsyncKeyValueService, AsyncTransactionService, Map):1570
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1488+0x00000001008e6630.814467083.apply(Object):-1
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AsyncFunction, Object):224
      com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(Object, Object):211
      com.google.common.util.concurrent.AbstractTransformFuture.run():124
      com.google.common.util.concurrent.DirectExecutor.execute(Runnable):31
      com.google.common.util.concurrent.ImmediateFuture.addListener(Runnable, Executor):49
      com.google.common.util.concurrent.AbstractTransformFuture.create(ListenableFuture, AsyncFunction, Executor):44
      com.google.common.util.concurrent.Futures.transformAsync(ListenableFuture, AsyncFunction, Executor):453
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringAsync(TableReference, Map, Function, AsyncKeyValueService, AsyncTransactionService):1568
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getWithPostFilteringSync(TableReference, Map, Function):1522
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.filterRowResults(TableReference, Map, ImmutableMap$Builder):884
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRowsInternal(TableReference, Iterable, ColumnSelection):468
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.lambda$getRows$1(TableReference, ColumnSelection, Iterable):444
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction$$Lambda$1462+0x00000001008db120.1211247912.apply(Object):-1
      com.palantir.atlasdb.keyvalue.api.cache.NoOpTransactionScopedCache.getRows(TableReference, Iterable, ColumnSelection, Function, Function):85
      com.palantir.atlasdb.transaction.impl.SnapshotTransaction.getRows(TableReference, Iterable, ColumnSelection):433
      com.palantir.atlasdb.transaction.impl.SerializableTransaction.getRows(TableReference, Iterable, ColumnSelection):210
svc-autorelease commented 2 months ago

Released 0.1077.0