├── .github ├── scripts │ ├── build.sh │ └── publish.sh └── workflows │ ├── build.yml │ └── publish.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle ├── jfrog.gradle ├── publications.gradle ├── versioning.gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── sum-lengths-graphviz-example.png └── sum-lengths-waterfall-example.png ├── scripts ├── help-text │ ├── local-release.txt │ └── release.txt ├── local-release └── release ├── settings.gradle └── subprojects ├── parseq-all └── build.gradle ├── parseq-batching ├── README.md ├── build.gradle ├── images │ ├── createExtendedSummary.png │ ├── createExtendedSummaryPar2.png │ ├── createExtendedSummaryPar2Batching.png │ └── createExtendedSummaryPar2BatchingSystemHidden.png └── src │ ├── main │ └── java │ │ └── com │ │ └── linkedin │ │ └── parseq │ │ └── batching │ │ ├── Batch.java │ │ ├── BatchAggregationTimeMetric.java │ │ ├── BatchImpl.java │ │ ├── BatchSizeMetric.java │ │ ├── BatchingStrategy.java │ │ ├── BatchingSupport.java │ │ ├── SimpleBatchingStrategy.java │ │ ├── SimpleTaskBatchingStrategy.java │ │ └── TaskBatchingStrategy.java │ └── test │ └── java │ └── com │ └── linkedin │ └── parseq │ └── batching │ ├── RecordingStrategy.java │ ├── RecordingTaskStrategy.java │ ├── TestBatch.java │ ├── TestBatchingSupport.java │ ├── TestSimpleBatchingStrategy.java │ ├── TestTaskBatchingStrategy.java │ ├── TestTaskSimpleBatchingStrategy.java │ └── TestTaskSimpleBatchingStrategyBlocking.java ├── parseq-benchmark ├── README.md ├── RESULTS.md ├── build.gradle └── src │ └── main │ └── java │ ├── com │ └── linkedin │ │ └── parseq │ │ ├── AbstractBenchmark.java │ │ ├── EventsArrival.java │ │ ├── HistogramSerializer.java │ │ ├── PerfLarge.java │ │ ├── PerfSmall.java │ │ ├── PoissonEventsArrival.java │ │ └── UniformEventsArrival.java │ └── org │ └── HdrHistogram │ └── Base64CompressedHistogramSerializer.java ├── parseq-examples ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── linkedin │ └── parseq │ └── example │ ├── batching │ ├── BatchingClientExample.java │ └── TaskBatchingClientExample.java │ ├── common │ ├── AbstractExample.java │ ├── BatchableMockService.java │ ├── ErrorMockRequest.java │ ├── ExampleUtil.java │ ├── MockRequest.java │ ├── MockRequestWithKey.java │ ├── MockService.java │ ├── MockServiceBatchingStrategy.java │ └── SimpleMockRequest.java │ ├── composite │ ├── MergeSortExample.java │ ├── TimeBoundSearchExample.java │ ├── TwoStageFanoutExample.java │ └── classifier │ │ ├── Classification.java │ │ ├── Classifier.java │ │ ├── ClassifierDriver.java │ │ ├── ClassifierPlanFactory.java │ │ ├── ConnectedClassifier.java │ │ ├── DefaultClassifier.java │ │ ├── Network.java │ │ ├── NetworkClassifier.java │ │ ├── SelfClassifier.java │ │ ├── TruthMapClassifier.java │ │ └── client │ │ ├── Client.java │ │ ├── Request.java │ │ └── impl │ │ ├── AbstractRequest.java │ │ ├── ClientImpl.java │ │ ├── GetNetworkRequest.java │ │ └── TruthMapRequest.java │ ├── domain │ ├── AbstractDomainExample.java │ ├── AsyncPersonClient.java │ ├── Company.java │ ├── DB.java │ ├── Examples.java │ ├── Message.java │ ├── ParSeqPersonClient.java │ └── Person.java │ ├── introduction │ └── IntroductoryExample.java │ ├── javadoc │ └── JavadocExamples.java │ └── simple │ ├── BranchExecutedExample.java │ ├── BranchSkippedExample.java │ ├── CancellationExample.java │ ├── DegradedExperienceExample.java │ ├── ErrorPropagationExample.java │ ├── ErrorRecoveryExample.java │ ├── FanInExample.java │ ├── FanOutExample.java │ └── TimeoutWithErrorExample.java ├── parseq-exec ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── linkedin │ └── parseq │ └── exec │ └── Exec.java ├── parseq-guava-interop ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── linkedin │ │ └── parseq │ │ └── guava │ │ └── ListenableFutureUtil.java │ └── test │ └── java │ └── com │ └── linkedin │ └── parseq │ └── guava │ └── ListenableFutureUtilTest.java ├── parseq-http-client ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── linkedin │ └── parseq │ └── httpclient │ ├── HttpClient.java │ └── WrappedRequestBuilder.java ├── parseq-lambda-names ├── README.md ├── build.gradle ├── setjdk_osx ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── linkedin │ │ │ │ └── parseq │ │ │ │ ├── TaskDescriptor.java │ │ │ │ └── lambda │ │ │ │ ├── ASMBasedTaskDescriptor.java │ │ │ │ ├── FindMethodCallAnalyzer.java │ │ │ │ ├── InferredOperation.java │ │ │ │ ├── LambdaClassDescription.java │ │ │ │ ├── LambdaClassLocator.java │ │ │ │ ├── LambdaMethodVisitor.java │ │ │ │ ├── SourcePointer.java │ │ │ │ ├── SyntheticLambdaAnalyzer.java │ │ │ │ └── Util.java │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ └── com.linkedin.parseq.TaskDescriptor │ └── test │ │ └── java │ │ └── com │ │ └── linkedin │ │ └── parseq │ │ └── lambda │ │ ├── BaseTest.java │ │ ├── TestInterface.java │ │ ├── TestMethodInv.java │ │ ├── TestMethodRef.java │ │ ├── TestStaticMethodInv.java │ │ ├── TestStaticMethodRef.java │ │ ├── TestUnrecognizedLambda.java │ │ └── TestUtil.java ├── supported_jvms └── test_supported_jvms ├── parseq-legacy-examples ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── linkedin │ └── parseq │ └── example │ ├── common │ ├── AbstractExample.java │ ├── ErrorMockRequest.java │ ├── ExampleUtil.java │ ├── MockRequest.java │ ├── MockService.java │ └── SimpleMockRequest.java │ ├── composite │ ├── MergeSortExample.java │ ├── TimeBoundSearchExample.java │ ├── TwoStageFanoutExample.java │ └── classifier │ │ ├── Classification.java │ │ ├── Classifier.java │ │ ├── ClassifierDriver.java │ │ ├── ClassifierPlanFactory.java │ │ ├── ConnectedClassifier.java │ │ ├── DefaultClassifier.java │ │ ├── Network.java │ │ ├── NetworkClassifier.java │ │ ├── SelfClassifier.java │ │ ├── TruthMapClassifier.java │ │ └── client │ │ ├── Client.java │ │ ├── Request.java │ │ └── impl │ │ ├── AbstractRequest.java │ │ ├── ClientImpl.java │ │ ├── GetNetworkRequest.java │ │ └── TruthMapRequest.java │ └── simple │ ├── BranchExecutedExample.java │ ├── BranchSkippedExample.java │ ├── ErrorPropagationExample.java │ ├── ErrorRecoveryExample.java │ ├── FanInExample.java │ ├── FanOutExample.java │ └── TimeoutWithErrorExample.java ├── parseq-restli-client ├── README.md ├── build.gradle └── src │ ├── main │ ├── antlr4 │ │ └── com │ │ │ └── linkedin │ │ │ └── restli │ │ │ └── client │ │ │ └── config │ │ │ └── RequestConfigKey.g4 │ └── java │ │ ├── RequestConfigKey.tokens │ │ ├── RequestConfigKeyLexer.tokens │ │ └── com │ │ └── linkedin │ │ └── restli │ │ └── client │ │ ├── DirectExecutor.java │ │ ├── GetRequestGroup.java │ │ ├── InboundRequestContext.java │ │ ├── InboundRequestContextBuilder.java │ │ ├── InboundRequestContextFinder.java │ │ ├── InboundRequestContextImpl.java │ │ ├── MultipleRequestConfigProvider.java │ │ ├── ParSeqRestClient.java │ │ ├── ParSeqRestliClient.java │ │ ├── ParSeqRestliClientBuilder.java │ │ ├── ParSeqRestliClientConfig.java │ │ ├── ParSeqRestliClientConfigBuilder.java │ │ ├── ParSeqRestliClientConfigChooser.java │ │ ├── ParSeqRestliClientConfigImpl.java │ │ ├── RequestGroup.java │ │ ├── RestRequestBatchKey.java │ │ ├── config │ │ ├── ConfigValue.java │ │ ├── ConfigValueCoercers.java │ │ ├── RequestConfig.java │ │ ├── RequestConfigBuilder.java │ │ ├── RequestConfigCacheKey.java │ │ ├── RequestConfigElement.java │ │ ├── RequestConfigImpl.java │ │ ├── RequestConfigKeyBaseListener.java │ │ ├── RequestConfigKeyLexer.java │ │ ├── RequestConfigKeyListener.java │ │ ├── RequestConfigKeyParser.java │ │ ├── RequestConfigKeyParsingErrorListener.java │ │ ├── RequestConfigKeyParsingException.java │ │ ├── RequestConfigOverrides.java │ │ ├── RequestConfigOverridesBuilder.java │ │ ├── RequestConfigOverridesImpl.java │ │ ├── RequestConfigProvider.java │ │ ├── RequestConfigProviderBuilder.java │ │ ├── RequestConfigProviderImpl.java │ │ └── RequestConfigTree.java │ │ └── metrics │ │ ├── BatchingMetrics.java │ │ └── Metrics.java │ └── test │ └── java │ └── com │ └── linkedin │ └── restli │ └── client │ ├── CapturingRestClient.java │ ├── ParSeqRestClientBatchingIntegrationTest.java │ ├── ParSeqRestClientIntegrationTest.java │ ├── TestInboundRequestContextBuilder.java │ ├── TestParSeqRestClient.java │ ├── TestParSeqRestClientBatching.java │ ├── TestParSeqRestClientBatchingOverride.java │ ├── TestParSeqRestClientClientException.java │ ├── TestParSeqRestClientNoBatching.java │ ├── TestParSeqRestClientNoBatchingOverrides.java │ ├── TestParSeqRestClientWithD2Timeout.java │ ├── TestRequest404WithBatching.java │ ├── TestRequestContextProvider.java │ └── config │ ├── TestRequestConfigElement.java │ └── TestRequestConfigProvider.java ├── parseq-test-api ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── linkedin │ └── parseq │ ├── AbstractBaseEngineTest.java │ ├── BaseEngineParTest.java │ ├── BaseEngineTest.java │ ├── ListLogger.java │ ├── ListLoggerFactory.java │ ├── ParSeqUnitTestHelper.java │ └── junitjupiter │ ├── BaseEngineJUnitJupiterTest.java │ └── BaseEngineParJunitJupiterTest.java ├── parseq-tracevis-server ├── Dockerfile ├── README.md ├── assembly-descriptor.xml ├── build.gradle ├── config.properties └── src │ └── main │ ├── java │ └── com │ │ └── linkedin │ │ └── parseq │ │ ├── Constants.java │ │ ├── DotHandler.java │ │ ├── GraphvizEngine.java │ │ ├── HashManager.java │ │ ├── HealthCheckHandler.java │ │ ├── HttpResponse.java │ │ ├── JhatHandler.java │ │ ├── TracePostHandler.java │ │ ├── TracevisHttpsServer.java │ │ ├── TracevisServer.java │ │ ├── TracevisServerJarMain.java │ │ └── TracevisServerMain.java │ └── resources │ ├── RecoverParSeqTracesFromHeapDump.js │ └── heapster │ ├── heapster.html │ ├── img │ └── icon.png │ └── js │ ├── jquery-2.2.3.min.js │ ├── jquery.spin.js │ └── spin.min.js ├── parseq-tracevis ├── .gitignore ├── .jshintrc ├── .npmignore ├── Makefile ├── README.md ├── bootstrap │ ├── css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js ├── browser.js ├── build.gradle ├── css │ ├── d3.slider.css │ ├── table.css │ └── waterfall.css ├── img │ └── icon.png ├── index.js ├── js │ ├── d3.slider.js │ └── d3.v3.min.js ├── lib │ ├── render │ │ ├── graphviz.js │ │ ├── table.js │ │ └── waterfall.js │ └── trace │ │ ├── criticalPath.js │ │ ├── d3Treeify.js │ │ ├── dotify.js │ │ ├── exclude.js │ │ ├── parse.js │ │ └── util.js ├── package-lock.json ├── package.json ├── test │ ├── int │ │ └── int-test.mjs │ └── unit │ │ ├── assert.js │ │ ├── criticalPath-test.js │ │ ├── d3Treeify-test.js │ │ ├── dotify-test.js │ │ ├── exclude-test.js │ │ └── parse-test.js └── trace.html ├── parseq-zk-client ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── linkedin │ │ └── parseq │ │ └── zk │ │ ├── client │ │ ├── PlanLocal.java │ │ ├── Reaper.java │ │ ├── WatchableTask.java │ │ ├── ZKClient.java │ │ ├── ZKClientBuilder.java │ │ ├── ZKClientImpl.java │ │ ├── ZKData.java │ │ └── ZKUtil.java │ │ └── recipes │ │ ├── LockUtil.java │ │ ├── MultiLocks.java │ │ ├── Synchronizable.java │ │ └── ZKLock.java │ └── test │ ├── java │ └── com │ │ └── linkedin │ │ └── parseq │ │ └── zk │ │ ├── client │ │ ├── TestReaper.java │ │ └── TestZKClient.java │ │ ├── recipes │ │ └── TestZKLock.java │ │ └── server │ │ └── ZKServer.java │ └── resources │ └── log4j.properties └── parseq ├── build.gradle └── src ├── main ├── codegen │ ├── config.fmpp │ ├── data │ │ └── fmpp.tdd │ └── templates │ │ ├── com │ │ └── linkedin │ │ │ └── parseq │ │ │ ├── ParNTask.java.ftl │ │ │ ├── TupleNTask.java.ftl │ │ │ ├── TupleNTaskDelegate.java.ftl │ │ │ └── function │ │ │ ├── ConsumerN.java.ftl │ │ │ ├── FunctionN.java.ftl │ │ │ ├── TupleN.java.ftl │ │ │ └── Tuples.java.ftl │ │ └── macros │ │ └── macros.ftl └── java │ └── com │ └── linkedin │ └── parseq │ ├── ActionTask.java │ ├── After.java │ ├── AsyncCallableTask.java │ ├── BaseTask.java │ ├── CallableTask.java │ ├── Cancellable.java │ ├── CancellationException.java │ ├── Context.java │ ├── DelayedExecutor.java │ ├── DelayedExecutorAdapter.java │ ├── EarlyFinishException.java │ ├── Engine.java │ ├── EngineBuilder.java │ ├── EngineShutdownException.java │ ├── Exceptions.java │ ├── FusionTask.java │ ├── FusionTraceContext.java │ ├── IndirectDelayedExecutor.java │ ├── MultiException.java │ ├── Par10Task.java │ ├── Par11Task.java │ ├── Par12Task.java │ ├── Par13Task.java │ ├── Par14Task.java │ ├── Par15Task.java │ ├── Par2Task.java │ ├── Par3Task.java │ ├── Par4Task.java │ ├── Par5Task.java │ ├── Par6Task.java │ ├── Par7Task.java │ ├── Par8Task.java │ ├── Par9Task.java │ ├── ParSeqGlobalConfiguration.java │ ├── ParTask.java │ ├── ParTaskImpl.java │ ├── Priority.java │ ├── SeqTask.java │ ├── Task.java │ ├── TaskDescriptor.java │ ├── TaskDescriptorFactory.java │ ├── TaskQueueFactory.java │ ├── TaskType.java │ ├── Tasks.java │ ├── ThrowableCallable.java │ ├── Tuple10Task.java │ ├── Tuple10TaskDelegate.java │ ├── Tuple11Task.java │ ├── Tuple11TaskDelegate.java │ ├── Tuple12Task.java │ ├── Tuple12TaskDelegate.java │ ├── Tuple13Task.java │ ├── Tuple13TaskDelegate.java │ ├── Tuple14Task.java │ ├── Tuple14TaskDelegate.java │ ├── Tuple15Task.java │ ├── Tuple15TaskDelegate.java │ ├── Tuple2Task.java │ ├── Tuple2TaskDelegate.java │ ├── Tuple3Task.java │ ├── Tuple3TaskDelegate.java │ ├── Tuple4Task.java │ ├── Tuple4TaskDelegate.java │ ├── Tuple5Task.java │ ├── Tuple5TaskDelegate.java │ ├── Tuple6Task.java │ ├── Tuple6TaskDelegate.java │ ├── Tuple7Task.java │ ├── Tuple7TaskDelegate.java │ ├── Tuple8Task.java │ ├── Tuple8TaskDelegate.java │ ├── Tuple9Task.java │ ├── Tuple9TaskDelegate.java │ ├── doc-files │ ├── andThen-1.png │ ├── andThen-2.png │ ├── andThen-3.png │ ├── andThen-4.png │ ├── flatMap-1.png │ ├── flatMap-2.png │ ├── map-1.png │ ├── map-2.png │ ├── onFailure-1.png │ ├── onFailure-2.png │ ├── recover-1.png │ ├── recoverWith-1.png │ ├── shareable-1.png │ ├── shareable-2.png │ ├── toTry-1.png │ ├── toTry-2.png │ ├── transform-1.png │ ├── transformWith-1.png │ ├── withSideEffect-1.png │ └── withTimeout-1.png │ ├── function │ ├── Action.java │ ├── Consumer1.java │ ├── Consumer10.java │ ├── Consumer11.java │ ├── Consumer12.java │ ├── Consumer13.java │ ├── Consumer14.java │ ├── Consumer15.java │ ├── Consumer2.java │ ├── Consumer3.java │ ├── Consumer4.java │ ├── Consumer5.java │ ├── Consumer6.java │ ├── Consumer7.java │ ├── Consumer8.java │ ├── Consumer9.java │ ├── Failure.java │ ├── Function1.java │ ├── Function10.java │ ├── Function11.java │ ├── Function12.java │ ├── Function13.java │ ├── Function14.java │ ├── Function15.java │ ├── Function2.java │ ├── Function3.java │ ├── Function4.java │ ├── Function5.java │ ├── Function6.java │ ├── Function7.java │ ├── Function8.java │ ├── Function9.java │ ├── Success.java │ ├── Try.java │ ├── Tuple.java │ ├── Tuple10.java │ ├── Tuple11.java │ ├── Tuple12.java │ ├── Tuple13.java │ ├── Tuple14.java │ ├── Tuple15.java │ ├── Tuple2.java │ ├── Tuple3.java │ ├── Tuple4.java │ ├── Tuple5.java │ ├── Tuple6.java │ ├── Tuple7.java │ ├── Tuple8.java │ ├── Tuple9.java │ └── Tuples.java │ ├── internal │ ├── ArgumentUtil.java │ ├── CachedLoggerFactory.java │ ├── CancellableScheduledFuture.java │ ├── Clock.java │ ├── ContextImpl.java │ ├── Continuations.java │ ├── DefaultPlanBasedRateLimiter.java │ ├── ExecutionMonitor.java │ ├── FIFOPriorityQueue.java │ ├── IdGenerator.java │ ├── InternalUtil.java │ ├── LIFOBiPriorityQueue.java │ ├── PlanBasedRateLimiter.java │ ├── PlanCompletionListener.java │ ├── PlanContext.java │ ├── PlanDeactivationListener.java │ ├── PlatformClock.java │ ├── Prioritizable.java │ ├── PrioritizableRunnable.java │ ├── SerialExecutionException.java │ ├── SerialExecutor.java │ ├── SystemHiddenTask.java │ ├── TaskLogger.java │ ├── ThreadDumper.java │ ├── TimeUnitHelper.java │ └── UncaughtExceptionHandler.java │ ├── package-info.java │ ├── promise │ ├── CountDownPromiseListener.java │ ├── DelegatingPromise.java │ ├── FastFailCountDownPromiseListener.java │ ├── Promise.java │ ├── PromiseException.java │ ├── PromiseListener.java │ ├── PromisePropagator.java │ ├── PromiseResolvedException.java │ ├── PromiseTransformer.java │ ├── PromiseUnresolvedException.java │ ├── Promises.java │ ├── ResolvedError.java │ ├── ResolvedValue.java │ ├── Settable.java │ ├── SettablePromise.java │ ├── SettablePromiseImpl.java │ ├── TransformingPromiseListener.java │ └── package-info.java │ ├── retry │ ├── ErrorClassification.java │ ├── RetriableTask.java │ ├── RetryPolicy.java │ ├── RetryPolicyBuilder.java │ ├── RetryPolicyImpl.java │ ├── backoff │ │ ├── BackoffPolicy.java │ │ ├── ConstantBackoff.java │ │ ├── ExponentialBackoff.java │ │ ├── FibonacciBackoff.java │ │ ├── LinearBackoff.java │ │ ├── RandomizedBackoff.java │ │ └── SelectedBackoff.java │ └── termination │ │ ├── GuavaRateLimiter.java │ │ ├── LimitAttempts.java │ │ ├── LimitDuration.java │ │ ├── LimitRate.java │ │ ├── RateLimiter.java │ │ ├── RequireAny.java │ │ ├── RequireBoth.java │ │ ├── RequireEither.java │ │ └── TerminationPolicy.java │ └── trace │ ├── Relationship.java │ ├── ResultType.java │ ├── ShallowTrace.java │ ├── ShallowTraceBuilder.java │ ├── ShallowTraceImp.java │ ├── Trace.java │ ├── TraceBuilder.java │ ├── TraceRelationship.java │ ├── TraceUtil.java │ ├── codec │ ├── TraceCodec.java │ ├── json │ │ ├── JsonTraceCodec.java │ │ ├── JsonTraceDeserializer.java │ │ ├── JsonTraceSerializer.java │ │ └── package-info.java │ └── package-info.java │ └── package-info.java └── test └── java ├── com └── linkedin │ └── parseq │ ├── AbstractTaskTest.java │ ├── ParSeqUnitTestHelperTest.java │ ├── TestAsyncCallableTask.java │ ├── TestCancellingPlanExceptionHandler.java │ ├── TestContext.java │ ├── TestEngine.java │ ├── TestEngineConcurrentPlans.java │ ├── TestEnginePlanBasedRateLimit.java │ ├── TestFusionTask.java │ ├── TestIndirectDelayedExecutor.java │ ├── TestParTask.java │ ├── TestSeqTask.java │ ├── TestTask.java │ ├── TestTaskCancellation.java │ ├── TestTaskFactoryMethods.java │ ├── TestTaskLogging.java │ ├── TestTaskReuse.java │ ├── TestTaskStates.java │ ├── TestTaskType.java │ ├── TestTasks.java │ ├── TestUtil.java │ ├── TestWithTry.java │ ├── TestingExecutorService.java │ ├── ThrowingRunnable.java │ ├── internal │ ├── TestArgumentUtil.java │ ├── TestCachedLoggerFactory.java │ ├── TestClock.java │ ├── TestContinuations.java │ ├── TestExecutionMonitor.java │ ├── TestFIFOPriorityQueue.java │ ├── TestLIFOBiPriorityQueue.java │ ├── TestLogAppender.java │ ├── TestPlanCompletionListener.java │ └── TestSerialExecutor.java │ ├── promise │ ├── TestDelegatingPromise.java │ ├── TestPromises.java │ └── TestSettablePromise.java │ ├── retry │ ├── TestBackoffPolicy.java │ ├── TestRetriableTask.java │ ├── TestRetryPolicy.java │ └── TestTerminationPolicy.java │ └── trace │ ├── TestFusionTaskTrace.java │ ├── TestShallowTraceBuilder.java │ ├── TestTaskToTrace.java │ ├── TestTraceBuilder.java │ └── codec │ └── json │ └── TestJsonTraceCodec.java └── log4j.properties /.github/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Ensure that this is being run in CI by GitHub Actions 4 | if [ "$CI" != "true" ] || [ "$GITHUB_ACTIONS" != "true" ]; then 5 | echo "This script should only be run in CI by GitHub Actions." 6 | exit 2 7 | fi 8 | 9 | # Ensure that the script is being run from the root project directory 10 | PROPERTIES_FILE='gradle.properties' 11 | if [ ! -f "$PROPERTIES_FILE" ]; then 12 | echo "Could not find $PROPERTIES_FILE, are you sure this is being run from the root project directory?" 13 | echo "PWD: ${PWD}" 14 | exit 1 15 | fi 16 | 17 | # Determine the current version 18 | VERSION=$(awk 'BEGIN { FS = "=" }; $1 == "version" { print $2 }' $PROPERTIES_FILE | awk '{ print $1 }') 19 | if [ -z "$VERSION" ]; then 20 | echo "Could not read the version from $PROPERTIES_FILE, please fix it and try again." 21 | exit 1 22 | fi 23 | 24 | # Run the actual build 25 | ./gradlew -Prelease build 26 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | on: 3 | pull_request: 4 | branches: [master] 5 | push: 6 | branches: [master] 7 | jobs: 8 | build: 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest] 14 | java: [8.0.312+7] 15 | name: Java ${{ matrix.java }} on ${{ matrix.os }} 16 | steps: 17 | - uses: actions/checkout@v2 18 | with: 19 | # Need to fetch 2 commits for the PR (base commit and head merge commit) so we can compute the diff 20 | fetch-depth: 2 21 | - uses: actions/setup-java@v2 22 | with: 23 | distribution: zulu 24 | java-version: ${{ matrix.java }} 25 | cache: gradle 26 | - run: ./.github/scripts/build.sh 27 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Build and Publish 2 | on: 3 | push: 4 | tags: 5 | # On standard release tags (e.g. "v29.0.12") 6 | - v[0-9]+.[0-9]+.[0-9]+ 7 | # On release-candidate tags (e.g. "v1.2.3-rc.1") 8 | - v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+ 9 | jobs: 10 | publish: 11 | environment: jfrog-publish 12 | runs-on: ubuntu-latest 13 | strategy: 14 | fail-fast: false 15 | matrix: 16 | java: [8.0.312+7] 17 | name: Java ${{ matrix.java }} 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: actions/setup-java@v2 21 | with: 22 | distribution: zulu 23 | java-version: ${{ matrix.java }} 24 | # Do NOT use caching, since we want to ensure published artifacts are fresh 25 | - run: ./.github/scripts/publish.sh 26 | env: 27 | JFROG_USER: ${{ secrets.JFROG_USER }} 28 | JFROG_KEY: ${{ secrets.JFROG_KEY }} 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .classpath 3 | .project 4 | .idea 5 | *.iml 6 | *.ipr 7 | *.iws 8 | build 9 | dist 10 | out 11 | node_modules 12 | target 13 | .DS_Store 14 | .gradle 15 | /.gradle 16 | .settings 17 | subprojects/parseq-lambda-names/bin/ 18 | subprojects/parseq-tracevis/npm-debug.log -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | version=5.1.20 2 | group=com.linkedin.parseq 3 | org.gradle.parallel=true 4 | -------------------------------------------------------------------------------- /gradle/versioning.gradle: -------------------------------------------------------------------------------- 1 | if (!project.hasProperty('release') && !project.version.endsWith("-SNAPSHOT")) { 2 | project.version += "-SNAPSHOT" 3 | } 4 | 5 | logger.lifecycle "Building version $version" -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /images/sum-lengths-graphviz-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/images/sum-lengths-graphviz-example.png -------------------------------------------------------------------------------- /images/sum-lengths-waterfall-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/images/sum-lengths-waterfall-example.png -------------------------------------------------------------------------------- /scripts/help-text/local-release.txt: -------------------------------------------------------------------------------- 1 | Usage: ./scripts/local-release [OPTION]... 2 | Publishes ParSeq's Maven artifacts to ~/local-repo. 3 | This script must be run from the root project directory. 4 | 5 | Options: 6 | -h, --help print this help text and exit 7 | -s, --snapshot release a snapshot version 8 | 9 | Examples: 10 | ./scripts/local-release publish x.y.z artifacts to ~/local-repo 11 | ./scripts/local-release -s publish x.y.z-SNAPSHOT artifacts to ~/local-repo 12 | -------------------------------------------------------------------------------- /scripts/help-text/release.txt: -------------------------------------------------------------------------------- 1 | Usage: ./scripts/release [OPTION]... [TARGET_COMMIT] 2 | Releases a new version of ParSeq by creating and pushing a tag at TARGET_COMMIT (defaults to HEAD). 3 | This script must be run from the root project directory. 4 | 5 | Options: 6 | -h, --help print this help text and exit 7 | 8 | Examples: 9 | ./scripts/release create and push a release tag at HEAD 10 | ./scripts/release 0a1b2c3 create and push a release tag at commit 0a1b2c3 11 | ./scripts/release master^^ create and push a release tag at two commits before the head of master 12 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'parseq' 2 | 3 | def modules = [ /* the name of the modules to use */ 4 | 'parseq', // core parseq code 5 | 'parseq-all', // meta-project containing the entire dependency tree 6 | 'parseq-batching', 7 | 'parseq-benchmark', 8 | 'parseq-examples', 9 | 'parseq-exec', 10 | 'parseq-guava-interop', 11 | 'parseq-http-client', 12 | 'parseq-lambda-names', // shadow jar 13 | 'parseq-legacy-examples', 14 | 'parseq-restli-client', 15 | 'parseq-test-api', // unit/integration test utils 16 | 'parseq-tracevis', // trace visualization tools 17 | 'parseq-tracevis-server', 18 | 'parseq-zk-client' 19 | ] 20 | 21 | 22 | modules.each { module -> 23 | include "${module}" 24 | project(":${module}").projectDir = file("subprojects/${module}") 25 | } 26 | -------------------------------------------------------------------------------- /subprojects/parseq-all/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | This is a meta-project that programmatically depends on all other consumer-facing modules. 3 | The purpose of this module is to act as an entry point for systems to compute the entire dependency tree of ParSeq. 4 | It is not intended to be directly consumed like a normal module, since it'll bloat the consumer's dependencies. 5 | */ 6 | ext { 7 | description = '''Meta-project containing the entire dependency tree of parseq; should not be consumed directly.''' 8 | } 9 | 10 | dependencies { 11 | rootProject.subprojects.forEach { 12 | if (it != project && !it.name.endsWith('examples')) { 13 | compile it 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /subprojects/parseq-batching/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | description = """Provides a convenient API for creating automatically batched tasks""" 3 | } 4 | 5 | 6 | dependencies { 7 | compile group: 'org.hdrhistogram', name: 'HdrHistogram', version:'2.1.8' 8 | 9 | testCompile project(':parseq-test-api') 10 | testCompile group: 'org.testng', name: 'testng', version:'6.9.9' 11 | testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.12' 12 | } 13 | -------------------------------------------------------------------------------- /subprojects/parseq-batching/images/createExtendedSummary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/subprojects/parseq-batching/images/createExtendedSummary.png -------------------------------------------------------------------------------- /subprojects/parseq-batching/images/createExtendedSummaryPar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/subprojects/parseq-batching/images/createExtendedSummaryPar2.png -------------------------------------------------------------------------------- /subprojects/parseq-batching/images/createExtendedSummaryPar2Batching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/subprojects/parseq-batching/images/createExtendedSummaryPar2Batching.png -------------------------------------------------------------------------------- /subprojects/parseq-batching/images/createExtendedSummaryPar2BatchingSystemHidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/parseq/3a580be06c5c9f6af2bb13a788de968a6123b3e3/subprojects/parseq-batching/images/createExtendedSummaryPar2BatchingSystemHidden.png -------------------------------------------------------------------------------- /subprojects/parseq-batching/src/main/java/com/linkedin/parseq/batching/BatchingSupport.java: -------------------------------------------------------------------------------- 1 | package com.linkedin.parseq.batching; 2 | 3 | import java.util.List; 4 | import java.util.concurrent.CopyOnWriteArrayList; 5 | 6 | import com.linkedin.parseq.EngineBuilder; 7 | import com.linkedin.parseq.internal.PlanContext; 8 | import com.linkedin.parseq.internal.PlanDeactivationListener; 9 | 10 | /** 11 | * This class allows registering instances of {@link BatchingStrategy}. 12 | *
13 | * Please note that BatchingSupport must be registered with an {@link EngineBuilder} e.g. 14 | *
20 | * 21 | * @author Jaroslaw Odzga (jodzga@linkedin.com) 22 | */ 23 | public class BatchingSupport implements PlanDeactivationListener { 24 | 25 | private final List15 | * BatchingSupport batchingSupport = new BatchingSupport(); 16 | * engineBuilder.setPlanDeactivationListener(batchingSupport); 17 | * (...) 18 | * batchingSupport.registerStrategy(batchingStrategy); 19 | *