/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.impl;
import com.emc.storageos.Controller;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DiscoveredSystemObject;
import com.emc.storageos.db.exceptions.DatabaseException;
import com.emc.storageos.db.exceptions.RetryableDatabaseException;
import com.emc.storageos.svcs.errorhandling.resources.ServiceCode;
import com.emc.storageos.volumecontroller.impl.Dispatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
public abstract class AbstractDiscoveredSystemController {
private static final Logger _log = LoggerFactory.getLogger(AbstractDiscoveredSystemController.class);
protected void queueTask(DbClient dbClient, Class<? extends DiscoveredSystemObject> systemClazz,
Dispatcher dispatcher, String methodName, Object... args)
{
final URI systemURI = (URI) args[0];
_log.info("System {} received RMI request {}.", systemURI, methodName);
try {
// 1. select target device
final DiscoveredSystemObject device = dbClient.queryObject(systemClazz, systemURI);
final Controller controller = lookupDeviceController(device);
// 2. queue request
dispatcher.queue(device.getId(), device.getSystemType(), controller, methodName, args);
} catch (RetryableDatabaseException e) {
if (e.getServiceCode() == ServiceCode.DBSVC_CONNECTION_ERROR) {
// netflix curator ConnectionException is not serializable
// and thus should not be sent back to rmi client.
_log.error("Failed to queue task due to dbsvc disconnected. Error: ", e);
throw DatabaseException.retryables.connectionFailed();
}
throw e;
}
}
protected abstract Controller lookupDeviceController(DiscoveredSystemObject device);
}