Search in sources :

Example 6 with Either

use of com.netflix.titus.common.util.tuple.Either in project titus-control-plane by Netflix.

the class CassandraJobStore method retrieveJobs.

@Override
public Observable<Pair<List<Job<?>>, Integer>> retrieveJobs() {
    Observable result = Observable.fromCallable(() -> {
        List<String> jobIds = activeJobIdsBucketManager.getItems();
        return jobIds.stream().map(retrieveActiveJobStatement::bind).map(this::execute).collect(Collectors.toList());
    }).flatMap(observables -> Observable.merge(observables, getConcurrencyLimit()).flatMapIterable(resultSet -> {
        List<Row> allRows = resultSet.all();
        if (allRows.isEmpty()) {
            logger.debug("Job id with no record");
            return Collections.emptyList();
        }
        return allRows.stream().map(row -> row.getString(0)).map(value -> {
            String effectiveValue;
            if (fitBadDataInjection.isPresent()) {
                effectiveValue = fitBadDataInjection.get().afterImmediate(JobStoreFitAction.ErrorKind.CorruptedRawJobRecords.name(), value);
            } else {
                effectiveValue = value;
            }
            Job<?> job;
            try {
                job = deserializeJob(effectiveValue);
            } catch (Exception e) {
                logger.error("Cannot map serialized job data to Job class: {}", effectiveValue, e);
                return Either.ofError(e);
            }
            if (job.getJobDescriptor().getDisruptionBudget() == null) {
                titusRuntime.getCodeInvariants().inconsistent("jobWithNoDisruptionBudget: jobId=%s", job.getId());
                job = JobFunctions.changeDisruptionBudget(job, DisruptionBudget.none());
            }
            // TODO Remove this code when there are no more jobs with missing migration data (caused by a bug in ServiceJobExt builder).
            if (job.getJobDescriptor().getExtensions() instanceof ServiceJobExt) {
                Job<ServiceJobExt> serviceJob = (Job<ServiceJobExt>) job;
                ServiceJobExt ext = serviceJob.getJobDescriptor().getExtensions();
                if (ext.getMigrationPolicy() == null) {
                    titusRuntime.getCodePointTracker().markReachable("Corrupted task migration record in Cassandra: " + job.getId());
                    ServiceJobExt fixedExt = ext.toBuilder().withMigrationPolicy(SystemDefaultMigrationPolicy.newBuilder().build()).build();
                    logger.warn("Service job with no migration policy defined. Setting system default: {}", job.getId());
                    job = serviceJob.toBuilder().withJobDescriptor(serviceJob.getJobDescriptor().toBuilder().withExtensions(fixedExt).build()).build();
                }
            }
            if (!fitBadDataInjection.isPresent()) {
                return Either.ofValue(job);
            }
            Job<?> effectiveJob = fitBadDataInjection.get().afterImmediate(JobStoreFitAction.ErrorKind.CorruptedJobRecords.name(), job);
            return Either.ofValue(effectiveJob);
        }).collect(Collectors.toList());
    })).toList().map(everything -> {
        List<Job> goodJobs = (List<Job>) everything.stream().filter(Either::hasValue).map(Either::getValue).collect(Collectors.toList());
        int errors = everything.size() - goodJobs.size();
        return Pair.of(goodJobs, errors);
    });
    return result;
}
Also used : JobStoreException(com.netflix.titus.api.jobmanager.store.JobStoreException) Task(com.netflix.titus.api.jobmanager.model.job.Task) LoggerFactory(org.slf4j.LoggerFactory) ConsistencyLevel(com.datastax.driver.core.ConsistencyLevel) Session(com.datastax.driver.core.Session) JobState(com.netflix.titus.api.jobmanager.model.job.JobState) Either(com.netflix.titus.common.util.tuple.Either) JobStore(com.netflix.titus.api.jobmanager.store.JobStore) BatchStatement(com.datastax.driver.core.BatchStatement) JobStoreFitAction(com.netflix.titus.api.jobmanager.store.JobStoreFitAction) Job(com.netflix.titus.api.jobmanager.model.job.Job) StoreTransactionLoggers.transactionLogger(com.netflix.titus.ext.cassandra.store.StoreTransactionLoggers.transactionLogger) JobFunctions(com.netflix.titus.api.jobmanager.model.job.JobFunctions) Collectors(java.util.stream.Collectors) TaskState(com.netflix.titus.api.jobmanager.model.job.TaskState) List(java.util.List) Stream(java.util.stream.Stream) DisruptionBudget(com.netflix.titus.api.jobmanager.model.job.disruptionbudget.DisruptionBudget) ProxyConfiguration(com.netflix.titus.common.util.guice.annotation.ProxyConfiguration) Optional(java.util.Optional) Logging(com.netflix.titus.common.util.guice.ProxyType.Logging) Statement(com.datastax.driver.core.Statement) Completable(rx.Completable) MoreExecutors(com.google.common.util.concurrent.MoreExecutors) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) QueryTrace(com.datastax.driver.core.QueryTrace) Row(com.datastax.driver.core.Row) Exceptions(rx.exceptions.Exceptions) Callable(java.util.concurrent.Callable) Singleton(javax.inject.Singleton) ArrayList(java.util.ArrayList) Observable(rx.Observable) Inject(javax.inject.Inject) PreparedStatement(com.datastax.driver.core.PreparedStatement) ResultSet(com.datastax.driver.core.ResultSet) Pair(com.netflix.titus.common.util.tuple.Pair) Spectator(com.netflix.titus.common.util.guice.ProxyType.Spectator) DriverException(com.datastax.driver.core.exceptions.DriverException) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) FitFramework(com.netflix.titus.common.framework.fit.FitFramework) Logger(org.slf4j.Logger) ServiceJobExt(com.netflix.titus.api.jobmanager.model.job.ext.ServiceJobExt) FitInjection(com.netflix.titus.common.framework.fit.FitInjection) SystemDefaultMigrationPolicy(com.netflix.titus.api.jobmanager.model.job.migration.SystemDefaultMigrationPolicy) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Emitter(rx.Emitter) FutureCallback(com.google.common.util.concurrent.FutureCallback) Futures(com.google.common.util.concurrent.Futures) V3JobOperations(com.netflix.titus.api.jobmanager.service.V3JobOperations) ObjectMappers(com.netflix.titus.api.json.ObjectMappers) Version(com.netflix.titus.api.jobmanager.model.job.Version) TitusRuntime(com.netflix.titus.common.runtime.TitusRuntime) Collections(java.util.Collections) ServiceJobExt(com.netflix.titus.api.jobmanager.model.job.ext.ServiceJobExt) Either(com.netflix.titus.common.util.tuple.Either) List(java.util.List) ArrayList(java.util.ArrayList) Job(com.netflix.titus.api.jobmanager.model.job.Job) Observable(rx.Observable) JobStoreException(com.netflix.titus.api.jobmanager.store.JobStoreException) DriverException(com.datastax.driver.core.exceptions.DriverException)

Example 7 with Either

use of com.netflix.titus.common.util.tuple.Either in project titus-control-plane by Netflix.

the class CellWebClientConnectorUtil method doGetAndMerge.

/**
 * Run GET operation on all cells and merge the result.
 */
public static <T> Either<List<T>, WebApplicationException> doGetAndMerge(CellWebClientConnector cellWebClientConnector, String path, ParameterizedTypeReference<List<T>> type, long timeoutMs) {
    Either<List<List<T>>, Throwable> partials;
    try {
        partials = Flux.merge(cellWebClientConnector.getWebClients().values().stream().map(c -> c.get().uri(path).retrieve().bodyToMono(type)).collect(Collectors.toList())).collectList().<Either<List<List<T>>, Throwable>>map(Either::ofValue).onErrorResume(e -> Mono.just(Either.ofError(e))).block(Duration.ofMillis(timeoutMs));
    } catch (Exception e) {
        logger.error("Unexpected error: path={}, type={}", path, type, e);
        return Either.ofError(new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR));
    }
    if (partials == null) {
        logger.error("No result from any cell: path={}, type={}", path, type);
        return Either.ofError(new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR));
    }
    if (partials.hasError()) {
        return Either.ofError(new WebApplicationException(partials.getError(), Response.Status.INTERNAL_SERVER_ERROR));
    }
    if (CollectionsExt.isNullOrEmpty(partials.getValue())) {
        return Either.ofValue(Collections.emptyList());
    }
    List<T> result = new ArrayList<>();
    partials.getValue().forEach(result::addAll);
    return Either.ofValue(result);
}
Also used : Logger(org.slf4j.Logger) ParameterizedTypeReference(org.springframework.core.ParameterizedTypeReference) CollectionsExt(com.netflix.titus.common.util.CollectionsExt) LoggerFactory(org.slf4j.LoggerFactory) Mono(reactor.core.publisher.Mono) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) HttpStatus(org.springframework.http.HttpStatus) Flux(reactor.core.publisher.Flux) List(java.util.List) Response(javax.ws.rs.core.Response) Duration(java.time.Duration) WebApplicationException(javax.ws.rs.WebApplicationException) WebClientResponseException(org.springframework.web.reactive.function.client.WebClientResponseException) Either(com.netflix.titus.common.util.tuple.Either) Collections(java.util.Collections) WebApplicationException(javax.ws.rs.WebApplicationException) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) WebApplicationException(javax.ws.rs.WebApplicationException) WebClientResponseException(org.springframework.web.reactive.function.client.WebClientResponseException)

Aggregations

Either (com.netflix.titus.common.util.tuple.Either)7 Logger (org.slf4j.Logger)5 LoggerFactory (org.slf4j.LoggerFactory)5 Pair (com.netflix.titus.common.util.tuple.Pair)4 ArrayList (java.util.ArrayList)4 List (java.util.List)4 CollectionsExt (com.netflix.titus.common.util.CollectionsExt)3 Duration (java.time.Duration)3 Mono (reactor.core.publisher.Mono)3 Job (com.netflix.titus.api.jobmanager.model.job.Job)2 JobFunctions (com.netflix.titus.api.jobmanager.model.job.JobFunctions)2 Task (com.netflix.titus.api.jobmanager.model.job.Task)2 TaskState (com.netflix.titus.api.jobmanager.model.job.TaskState)2 V3JobOperations (com.netflix.titus.api.jobmanager.service.V3JobOperations)2 TitusRuntime (com.netflix.titus.common.runtime.TitusRuntime)2 Collections (java.util.Collections)2 Collectors (java.util.stream.Collectors)2 Inject (javax.inject.Inject)2 Singleton (javax.inject.Singleton)2 AmazonIdentityManagementAsync (com.amazonaws.services.identitymanagement.AmazonIdentityManagementAsync)1