Skip to content

Commit 4a9cf4b

Browse files
author
Alex Huang
committed
2 parents fe6f045 + 2246211 commit 4a9cf4b

7 files changed

Lines changed: 57 additions & 32 deletions

File tree

core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1494,10 +1494,14 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
14941494

14951495
try {
14961496
Class<?> clazz = Class.forName(value);
1497-
_storage = (StorageLayer)ComponentContext.inject(clazz);
1497+
_storage = (StorageLayer)clazz.newInstance();
14981498
_storage.configure("StorageLayer", params);
14991499
} catch (ClassNotFoundException e) {
15001500
throw new ConfigurationException("Unable to find class " + value);
1501+
} catch (InstantiationException e) {
1502+
throw new ConfigurationException("Unable to find class " + value);
1503+
} catch (IllegalAccessException e) {
1504+
throw new ConfigurationException("Unable to find class " + value);
15011505
}
15021506
}
15031507
_storage.mkdirs(_parent);

engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ public String getUri() {
9090
} else {
9191
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole());
9292
if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
93-
return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize();
93+
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize();
9494
} else {
95-
return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath();
95+
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath();
9696
}
9797
}
9898
}

engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java renamed to engine/storage/src/org/apache/cloudstack/storage/command/CreateObjectCommand.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@
2020

2121
import com.cloud.agent.api.Command;
2222

23-
public class CreateVolumeCommand extends Command implements StorageSubSystemCommand {
24-
protected String volumeUri;
23+
public class CreateObjectCommand extends Command implements StorageSubSystemCommand {
24+
protected String objectUri;
2525

26-
public CreateVolumeCommand(String volumeUri) {
26+
public CreateObjectCommand(String objectUri) {
2727
super();
28-
this.volumeUri = volumeUri;
28+
this.objectUri = objectUri;
2929
}
3030

31-
protected CreateVolumeCommand() {
31+
protected CreateObjectCommand() {
3232
super();
3333
}
3434

@@ -38,8 +38,8 @@ public boolean executeInSequence() {
3838
return false;
3939
}
4040

41-
public String getVolume() {
42-
return this.volumeUri;
41+
public String getObjectUri() {
42+
return this.objectUri;
4343
}
4444

4545
}

engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.cloud.host.dao.HostDao;
4040
import com.cloud.utils.db.DB;
4141
import com.cloud.utils.db.Transaction;
42+
import com.cloud.utils.exception.CloudRuntimeException;
4243

4344
@Component
4445
public class DefaultEndPointSelector implements EndPointSelector {
@@ -48,6 +49,8 @@ public class DefaultEndPointSelector implements EndPointSelector {
4849
HostDao hostDao;
4950
private String findOneHostInaScope = "select id from host where "
5051
+ " status == 'Up' and hypervisor_type != 'VMware' and type in ('Routing', 'SecondaryStorageVM') ";
52+
private String findOneHostOnPrimaryStorage = "select id from host where"
53+
+ "status == 'Up' and type == 'Routing' ";
5154

5255
protected boolean moveBetweenPrimaryImage(DataStore srcStore,
5356
DataStore destStore) {
@@ -62,9 +65,9 @@ protected boolean moveBetweenPrimaryImage(DataStore srcStore,
6265
}
6366

6467
@DB
65-
protected EndPoint findEndPointInScope(Scope scope) {
68+
protected EndPoint findEndPointInScope(Scope scope, String sqlBase) {
6669
StringBuilder sbuilder = new StringBuilder();
67-
sbuilder.append(findOneHostInaScope);
70+
sbuilder.append(sqlBase);
6871

6972
if (scope.getScopeType() == ScopeType.HOST) {
7073
sbuilder.append(" and id = ");
@@ -76,7 +79,7 @@ protected EndPoint findEndPointInScope(Scope scope) {
7679
sbuilder.append(" and data_center_id = ");
7780
sbuilder.append(scope.getScopeId());
7881
}
79-
82+
//TODO: order by rand() is slow if there are lot of hosts
8083
sbuilder.append(" ORDER by rand() limit 1");
8184
String sql = sbuilder.toString();
8285
PreparedStatement pstmt = null;
@@ -129,7 +132,7 @@ protected EndPoint findEndPointForImageMove(DataStore srcStore,
129132
// if both are zone scope
130133
selectedScope = srcScope;
131134
}
132-
return findEndPointInScope(selectedScope);
135+
return findEndPointInScope(selectedScope, findOneHostInaScope);
133136
}
134137

135138
@Override
@@ -146,4 +149,19 @@ public EndPoint select(DataObject srcData, DataObject destData) {
146149
// TODO Auto-generated method stub
147150
return null;
148151
}
152+
153+
protected EndPoint findEndpointForPrimaryStorage(DataStore store) {
154+
return findEndPointInScope(store.getScope(), findOneHostOnPrimaryStorage);
155+
}
156+
157+
@Override
158+
public EndPoint select(DataObject object) {
159+
DataStore store = object.getDataStore();
160+
if (store.getRole() == DataStoreRole.Primary) {
161+
return findEndpointForPrimaryStorage(store);
162+
} else {
163+
throw new CloudRuntimeException("not implemented yet");
164+
}
165+
166+
}
149167
}

engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,10 @@
2323

2424
public interface EndPointSelector {
2525
public EndPoint select(DataObject srcData, DataObject destData);
26+
27+
/**
28+
* @param object
29+
* @return
30+
*/
31+
EndPoint select(DataObject object);
2632
}

engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
// under the License.
1717
package org.apache.cloudstack.storage.datastore.driver;
1818

19-
import java.util.List;
2019
import java.util.Set;
2120

21+
import javax.inject.Inject;
22+
2223
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
2324
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
2425
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -28,10 +29,10 @@
2829
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
2930
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
3031
import org.apache.cloudstack.framework.async.AsyncRpcConext;
32+
import org.apache.cloudstack.storage.command.CreateObjectCommand;
3133
import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
32-
import org.apache.cloudstack.storage.command.CreateVolumeCommand;
3334
import org.apache.cloudstack.storage.command.DeleteCommand;
34-
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
35+
import org.apache.cloudstack.storage.endpoint.EndPointSelector;
3536
import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
3637
import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
3738
import org.apache.log4j.Logger;
@@ -41,11 +42,9 @@
4142

4243
public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
4344
private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreDriverImpl.class);
44-
protected PrimaryDataStore dataStore;
45-
public DefaultPrimaryDataStoreDriverImpl(PrimaryDataStore dataStore) {
46-
this.dataStore = dataStore;
47-
}
48-
45+
@Inject
46+
EndPointSelector selector;
47+
4948
public DefaultPrimaryDataStoreDriverImpl() {
5049

5150
}
@@ -83,8 +82,8 @@ public Void createAsyncCallback(AsyncCallbackDispatcher<DefaultPrimaryDataStoreD
8382
@Override
8483
public void deleteAsync(DataObject vo, AsyncCompletionCallback<CommandResult> callback) {
8584
DeleteCommand cmd = new DeleteCommand(vo.getUri());
86-
List<EndPoint> endPoints = null;
87-
EndPoint ep = endPoints.get(0);
85+
86+
EndPoint ep = selector.select(vo);
8887
AsyncRpcConext<CommandResult> context = new AsyncRpcConext<CommandResult>(callback);
8988
AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> caller = AsyncCallbackDispatcher.create(this);
9089
caller.setCallback(caller.getTarget().deleteCallback(null, null))
@@ -153,17 +152,15 @@ public Object createVolumeFromBaseImageAsyncCallback(AsyncCallbackDispatcher<Def
153152
@Override
154153
public void createAsync(DataObject vol,
155154
AsyncCompletionCallback<CreateCmdResult> callback) {
156-
List<EndPoint> endPoints = null;
157-
EndPoint ep = endPoints.get(0);
158-
CreateVolumeCommand createCmd = new CreateVolumeCommand(vol.getUri());
155+
EndPoint ep = selector.select(vol);
156+
CreateObjectCommand createCmd = new CreateObjectCommand(vol.getUri());
159157

160158
CreateVolumeContext<CommandResult> context = null;
161159
AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> caller = AsyncCallbackDispatcher.create(this);
162160
caller.setContext(context)
163161
.setCallback(caller.getTarget().createAsyncCallback(null, null));
164162

165163
ep.sendMessageAsync(createCmd, caller);
166-
167164
}
168165

169166
@Override

plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.apache.cloudstack.storage.command.CopyCmdAnswer;
3434
import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
3535
import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
36-
import org.apache.cloudstack.storage.command.CreateVolumeCommand;
36+
import org.apache.cloudstack.storage.command.CreateObjectCommand;
3737
import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
3838
import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
3939
import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
@@ -82,8 +82,8 @@ public Answer handleStorageCommands(StorageSubSystemCommand command) {
8282
return execute((CreatePrimaryDataStoreCmd) command);
8383
} else if (command instanceof CreateVolumeFromBaseImageCommand) {
8484
return execute((CreateVolumeFromBaseImageCommand)command);
85-
} else if (command instanceof CreateVolumeCommand) {
86-
return execute((CreateVolumeCommand) command);
85+
} else if (command instanceof CreateObjectCommand) {
86+
return execute((CreateObjectCommand) command);
8787
} else if (command instanceof DeleteVolumeCommand) {
8888
return execute((DeleteVolumeCommand)command);
8989
}
@@ -114,7 +114,7 @@ protected void deleteVDI(Connection conn, VDI vdi) throws BadServerResponse, Xen
114114
vdi.destroy(conn);
115115
}
116116

117-
protected CreateVolumeAnswer execute(CreateVolumeCommand cmd) {
117+
protected CreateVolumeAnswer execute(CreateObjectCommand cmd) {
118118
VolumeTO volume = null;
119119
PrimaryDataStoreTO primaryDataStore = volume.getDataStore();
120120
Connection conn = hypervisorResource.getConnection();

0 commit comments

Comments
 (0)