public R processRequest()

in metacat-main/src/main/java/com/netflix/metacat/main/api/RequestWrapper.java [147:227]


    public <R> R processRequest(
        final QualifiedName name,
        final String resourceRequestName,
        final Map<String, String> requestTags,
        final Supplier<R> supplier) {
        final long start = registry.clock().wallTime();
        final Map<String, String> tags = new HashMap<>(name.parts());
        if (requestTags != null) {
            tags.putAll(requestTags);
        }
        tags.put("request", resourceRequestName);
        tags.put("scheme", MetacatContextManager.getContext().getScheme());
        String clientAppName =  MetacatContextManager.getContext().getClientAppName();
        if (clientAppName == null) {
            clientAppName = "UNKNOWN";
        }
        tags.put("caller", clientAppName);
        registry.counter(requestCounterId.withTags(tags)).increment();

        try {
            requestGateway.validateRequest(resourceRequestName, name);
            MetacatContextManager.getContext().setRequestName(resourceRequestName);
            log.info("### Calling method: {} for {}", resourceRequestName, name);
            return supplier.get();
        } catch (UnsupportedOperationException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            log.error(e.getMessage(), e);
            throw new MetacatNotSupportedException("Catalog does not support the operation. " + e.getMessage());
        } catch (DatabaseAlreadyExistsException | TableAlreadyExistsException | PartitionAlreadyExistsException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            log.error(e.getMessage(), e);
            throw new MetacatAlreadyExistsException(e.getMessage());
        } catch (NotFoundException | MetacatNotFoundException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            log.error(e.getMessage(), e);
            throw new MetacatNotFoundException(
                String.format("Unable to locate for %s. Details: %s", name, e.getMessage()));
        } catch (InvalidMetaException | IllegalArgumentException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            log.error(e.getMessage(), e);
            throw new MetacatBadRequestException(
                String.format("%s.%s", e.getMessage(), e.getCause() == null ? "" : e.getCause().getMessage()));
        } catch (TablePreconditionFailedException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            log.error(e.getMessage(), e);
            throw new MetacatPreconditionFailedException(
                String.format("%s.%s", e.getMessage(), e.getCause() == null ? "" : e.getCause().getMessage()));
        } catch (ConnectorException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            final String message = String.format("%s.%s -- %s failed for %s", e.getMessage(),
                e.getCause() == null ? "" : e.getCause().getMessage(), resourceRequestName, name);
            log.error(message, e);
            for (Throwable ex : Throwables.getCausalChain(e)) {
                if (ex.getMessage().contains("too many connections")
                    || ex.getMessage().contains("Timeout: Pool empty")) {
                    throw new MetacatTooManyRequestsException(ex.getMessage());
                }
            }
            throw new MetacatException(message, e);
        } catch (UserMetadataServiceException e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            final String message = String.format("%s.%s -- %s usermetadata operation failed for %s", e.getMessage(),
                e.getCause() == null ? "" : e.getCause().getMessage(), resourceRequestName, name);
            throw new MetacatUserMetadataException(message);
        }  catch (Exception e) {
            collectRequestExceptionMetrics(tags, e.getClass().getSimpleName());
            final String message = String.format("%s.%s -- %s failed for %s", e.getMessage(),
                e.getCause() == null ? "" : e.getCause().getMessage(), resourceRequestName, name);
            log.error(message, e);
            if (e instanceof MetacatException) {
                throw e;
            } else {
                throw new MetacatException(message, e);
            }
        } finally {
            final long duration = registry.clock().wallTime() - start;
            log.info("### Time taken to complete {} for {} is {} ms", resourceRequestName, name, duration);
            tryAddTableTypeTag(tags, name);
            this.registry.timer(requestTimerId.withTags(tags)).record(duration, TimeUnit.MILLISECONDS);
        }
    }