Examples
The following examples use the configuration as shown on the /usage.html usage usage page especially related to the target-names.
Note to import the dependency for the jSCSI initiator and the snapshot-repo of sonatype in your pom.
<dependencies>>
...
<dependency>
<groupId>org.jscsi</groupId>
<artifactId>initiator</artifactId>
<version>2.2-SNAPSHOT</version>
</dependency>
</dependencies>
...
<repositories>
...
<repository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
</repositories>
Example 1
In this example, a simple login and logout is performed. If any failure occurs within the access to the target (more concise if testing-xen2-disk1 is neither loaded nor available), an exception is thrown.
public class SimpleLoginLogout {
public static void main(final String[] args) throws NoSuchSessionException, TaskExecutionException,ConfigurationException {
//init of the target
String target = "testing-xen2-disk1";
Initiator initiator = new Initiator(Configuration.create());
//creating session, performing login on target
initiator.createSession(target);
//closing the session
initiator.closeSession(target);
}
}
Example 2
The following example denotes a normal read-/write-operation including a check of the data.
public class SingleThreadedReadWrite {
public static void main(final String[] args) throws NoSuchSessionException, TaskExecutionException, ConfigurationException {
//init of test structures
int numBlocks = 50;
int address = 12345;
ByteBuffer writeData = ByteBuffer.allocate(512 * numBlocks);
ByteBuffer readData = ByteBuffer.allocate(512 * numBlocks);
Random random = new Random(System.currentTimeMillis());
random.nextBytes(writeData.array());
//init of initiator and the session
String target = "testing-xen2-disk1";
Initiator initiator = new Initiator(Configuration.create());
initiator.createSession(target);
//writing the data single threaded
initiator.write(target, writeData, address,writeData.capacity());
//reading the data single threaded
initiator.read(target, readData, address, readData.capacity());
//closing the session
initiator.closeSession(target);
//correctness check
if(!Arrays.equals(writeData.array(),readData.array())){
throw new IllegalStateException("Data read must be equal to the data written");
}
}
}
Example 3
Extending the former example, the read and write has the ability to occur within non-blocking operations making sense especially when working within multiple targets.
public class MultiThreadedReadWrite {
public static void main(final String[] args) throws NoSuchSessionException, TaskExecutionException, ConfigurationException, InterruptedException, ExecutionException {
//init of test structures
int numBlocks = 50;
int address = 12345;
final ByteBuffer writeData1 = ByteBuffer.allocate(512 * numBlocks);
final ByteBuffer readData1 = ByteBuffer.allocate(512 * numBlocks);
final ByteBuffer writeData2 = ByteBuffer.allocate(512 * numBlocks);
final ByteBuffer readData2 = ByteBuffer.allocate(512 * numBlocks);
Random random = new Random(System.currentTimeMillis());
random.nextBytes(writeData1.array());
random.nextBytes(writeData2.array());
//init of initiator and the session
String target1 = "testing-xen2-disk1";
String target2 = "testing-xen2-disk2";
Initiator initiator = new Initiator(Configuration.create());
initiator.createSession(target1);
initiator.createSession(target2);
//writing the first target multithreaded
final Future<Void> write1 = initiator.multiThreadedWrite(target1, writeData1, address, writeData1.capacity());
//writing the second target multithreaded
final Future<Void> write2 = initiator.multiThreadedWrite(target2, writeData2, address, writeData2.capacity());
//Blocking until writes are concluded
write1.get();
write2.get();
//Getting the data from the first target multithreaded
final Future<Void> read1 = initiator.multiThreadedRead(target1, readData1, address, readData1.capacity());
//Getting the data from the second target multithreaded
final Future<Void> read2 = initiator.multiThreadedRead(target2, readData2, address, readData2.capacity());
//Blocking until reads are concluded
read1.get();
read2.get();
//closing the targets
initiator.closeSession(target1);
initiator.closeSession(target2);
//correctness check
if(!Arrays.equals(writeData1.array(),readData1.array()) || !Arrays.equals(writeData2.array(),readData2.array())){
throw new IllegalStateException("Data read must be equal to the data written");
}
}
}
