Github user benchristel commented on a diff in the pull request:

    https://github.com/apache/incubator-hawq/pull/1379#discussion_r200793393
  
    --- Diff: 
pxf/pxf-service/src/main/java/org/apache/hawq/pxf/service/TimedProxyUGI.java ---
    @@ -0,0 +1,93 @@
    +package org.apache.hawq.pxf.service;
    +
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + *   http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied.  See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +import java.util.concurrent.Delayed;
    +import java.util.concurrent.TimeUnit;
    +
    +import org.apache.hadoop.security.UserGroupInformation;
    +
    +public class TimedProxyUGI implements Delayed {
    +
    +    private volatile long startTime;
    +    private UserGroupInformation proxyUGI;
    +    private SegmentTransactionId session;
    +    private boolean cleaned = false;
    +    AtomicInteger inProgress = new AtomicInteger();
    +
    +    public TimedProxyUGI(UserGroupInformation proxyUGI, 
SegmentTransactionId session) {
    +        this.startTime = System.currentTimeMillis();
    +        this.proxyUGI = proxyUGI;
    +        this.session = session;
    +    }
    +
    +    public UserGroupInformation getProxyUGI() {
    +        return proxyUGI;
    +    }
    +
    +    public SegmentTransactionId getSession() {
    +        return session;
    +    }
    +
    +    public boolean isCleaned() {
    +        return cleaned;
    +    }
    +
    +    public void setCleaned() {
    +        cleaned = true;
    +    }
    +
    +    public int getCounter() {
    +        return inProgress.get();
    +    }
    +
    +    public void incrementCounter() {
    +        inProgress.incrementAndGet();
    +    }
    +
    +    public void decrementCounter() {
    +        inProgress.decrementAndGet();
    +    }
    +
    +    public void resetTime() {
    +        startTime = System.currentTimeMillis();
    +    }
    +
    +    public void setExpired() {
    +        startTime = -1L;
    +    }
    +
    +    @Override
    +    public long getDelay(TimeUnit unit) {
    +        return unit.convert(getDelayMillis(), TimeUnit.MILLISECONDS);
    +    }
    +
    +    @Override
    +    public int compareTo(Delayed other) {
    +        TimedProxyUGI that = (TimedProxyUGI) other;
    +        return Long.compare(this.getDelayMillis(), that.getDelayMillis());
    +    }
    +
    +    public long getDelayMillis() {
    +        return (startTime + UGICache.UGI_CACHE_EXPIRY) - 
System.currentTimeMillis();
    --- End diff --
    
    It's a little strange that we're referencing `UGI_CACHE_EXPIRY` directly 
here—it hints at a tight coupling between this class and the `UGICache` that 
isn't explicit elsewhere, and also creates a dependency cycle between these two 
classes. That may be fine if we want to let these classes be coupled, but if so 
I'd want to make the coupling even more explicit, e.g. by making this class a 
public static inner class of `UGICache`. If we want to decouple them, we could 
instead pass the expiry time to the constructor of `TimedProxyUGI`.


---

Reply via email to