Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed 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.
  */
 package com.facebook.presto.memory;
 
 
 
 import java.util.List;
 
 import static com.facebook.presto.spi.StandardErrorCode.EXCEEDED_MEMORY_LIMIT;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 public class QueryContext
 {
     private final long maxMemory;
     private final boolean enforceLimit;
     private final Executor executor;
     private final List<TaskContexttaskContexts = new CopyOnWriteArrayList<>();
 
     @GuardedBy("this")
     private long reserved;
 
     @GuardedBy("this")
     private MemoryPool memoryPool;
 
     public QueryContext(boolean enforceLimitDataSize maxMemoryMemoryPool memoryPoolExecutor executor)
     {
         this. = enforceLimit;
         this. = requireNonNull(maxMemory"maxMemory is null").toBytes();
         this. = requireNonNull(memoryPool"memoryPool is null");
         this. = requireNonNull(executor"executor is null");
     }
 
     public synchronized ListenableFuture<?> reserveMemory(long bytes)
     {
         checkArgument(bytes >= 0, "bytes is negative");
 
         if ( + bytes >  && ) {
             throw new PrestoException("Query exceeded local memory limit of " + new DataSize(..).convertToMostSuccinctDataSize());
         }
         ListenableFuture<?> future = .reserve(bytes);
          += bytes;
         return future;
     }
 
     public synchronized boolean tryReserveMemory(long bytes)
     {
         checkArgument(bytes >= 0, "bytes is negative");
 
         if ( + bytes >  && ) {
             return false;
         }
         if (.tryReserve(bytes)) {
              += bytes;
             return true;
         }
         return false;
     }
 
     public synchronized void freeMemory(long bytes)
     {
         checkArgument( - bytes >= 0, "tried to free more memory than is reserved");
          -= bytes;
         .free(bytes);
     }
 
     public synchronized void setMemoryPool(MemoryPool pool)
     {
         requireNonNull(pool"pool is null");
         if (pool.getId().equals(.getId())) {
             // Don't unblock our tasks and thrash the pools, if this is a no-op
             return;
         }
         MemoryPool originalPool = ;
         long originalReserved = ;
         = pool;
        ListenableFuture<?> future = pool.reserve();
        Futures.addCallback(futurenew FutureCallback<Object>() {
            @Override
            public void onSuccess(Object result)
            {
                originalPool.free(originalReserved);
                // Unblock all the tasks, if they were waiting for memory, since we're in a new pool.
                .stream().forEach(TaskContext::moreMemoryAvailable);
            }
            @Override
            public void onFailure(Throwable t)
            {
                originalPool.free(originalReserved);
                // Unblock all the tasks, if they were waiting for memory, since we're in a new pool.
                .stream().forEach(TaskContext::moreMemoryAvailable);
            }
        });
    }
    public TaskContext addTaskContext(TaskStateMachine taskStateMachineSession sessionDataSize maxTaskMemoryDataSize operatorPreAllocatedMemoryboolean verboseStatsboolean cpuTimerEnabled)
    {
        TaskContext taskContext = new TaskContext(thistaskStateMachinesessionmaxTaskMemoryoperatorPreAllocatedMemoryverboseStatscpuTimerEnabled);
        .add(taskContext);
        return taskContext;
    }
New to GrepCode? Check out our FAQ X