All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.orientechnologies.agent.operation.OperationResponseManager Maven / Gradle / Ivy

package com.orientechnologies.agent.operation;

import com.orientechnologies.orient.core.config.OGlobalConfiguration;
import com.orientechnologies.orient.server.distributed.ODistributedRequestId;
import com.orientechnologies.orient.server.distributed.ODistributedResponse;
import com.orientechnologies.orient.server.distributed.ODistributedResponseManager;
import com.orientechnologies.orient.server.distributed.operation.NodeOperationResponse;
import com.orientechnologies.orient.server.distributed.operation.NodeOperationTaskResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

public class OperationResponseManager implements ODistributedResponseManager {

  private final List responses = new ArrayList<>();
  private final Set servers;
  private final CountDownLatch waitingFor;
  private final long sentOn = System.currentTimeMillis();

  public OperationResponseManager(Set servers) {
    this.servers = servers;
    this.waitingFor = new CountDownLatch(servers.size());
  }

  @Override
  public synchronized boolean setLocalResult(String localNodeName, Object localResult) {
    NodeOperationResponse result = (NodeOperationResponse) localResult;
    if (result.isOk()) {
      responses.add(new OperationResponseFromNode(localNodeName, new ResponseOk(result)));
    } else {
      responses.add(new OperationResponseFromNode(localNodeName, new ResponseFailed(result)));
    }
    return false;
  }

  @Override
  public ODistributedResponse getFinalResponse() {
    throw new UnsupportedOperationException();
  }

  @Override
  public synchronized void removeServerBecauseUnreachable(String node) {
    responses.add(new OperationResponseFromNode(node, new NodeNotReachable()));
    waitingFor.countDown();
  }

  @Override
  public boolean waitForSynchronousResponses() throws InterruptedException {
    return waitingFor.await(
        OGlobalConfiguration.DISTRIBUTED_HEARTBEAT_TIMEOUT.getValueAsInteger(),
        TimeUnit.MILLISECONDS);
  }

  @Override
  public long getSynchTimeout() {
    throw new UnsupportedOperationException();
  }

  @Override
  public void cancel() {
    while (waitingFor.getCount() > 0) waitingFor.countDown();
  }

  @Override
  public Set getExpectedNodes() {
    return servers;
  }

  @Override
  public List getRespondingNodes() {
    return responses.stream().map((a) -> a.getSenderNodeName()).collect(Collectors.toList());
  }

  @Override
  public ODistributedRequestId getMessageId() {
    return null;
  }

  @Override
  public int getQuorum() {
    throw new UnsupportedOperationException();
  }

  @Override
  public synchronized boolean collectResponse(ODistributedResponse response) {
    NodeOperationTaskResponse nodeResponse = (NodeOperationTaskResponse) response.getPayload();
    if (nodeResponse.getResponse().isOk()) {
      responses.add(
          new OperationResponseFromNode(
              response.getExecutorNodeName(), new ResponseOk(nodeResponse.getResponse())));
    } else {
      responses.add(
          new OperationResponseFromNode(
              response.getExecutorNodeName(), new ResponseFailed(nodeResponse.getResponse())));
    }
    waitingFor.countDown();
    return waitingFor.getCount() == 0;
  }

  @Override
  public void timeout() {
    cancel();
  }

  @Override
  public long getSentOn() {
    return sentOn;
  }

  @Override
  public List getMissingNodes() {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getDatabaseName() {
    return null;
  }

  public List getResponses() {
    return responses;
  }

  @Override
  public boolean isFinished() {
    return waitingFor.getCount() == 0;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy