diff --git a/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java b/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java index c72b814fddc5c412836d2c007d6d9f28542a13af..3122eb8f53dcb9bd92a2f62c69d4236494ea81bd 100644 --- a/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java +++ b/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java @@ -86,15 +86,15 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti @Override public void beforeAPICall(Worker<TransactionConnection> worker, Request request) throws Exception { - boolean isOnePhaseTransaction = worker.isInteractiveSessionMode(); - boolean isTwoPhaseTransaction = worker.isTransactionManagerMode(); - // handle only transactional calls - if (!isOnePhaseTransaction && !isTwoPhaseTransaction) + if (!worker.isInteractiveSessionMode()) { return; } + boolean isOnePhaseTransaction = !worker.isTransactionManagerMode(); + boolean isTwoPhaseTransaction = worker.isTransactionManagerMode(); + if ((isOnePhaseTransaction && request.getMethod().equals("commit")) || (isTwoPhaseTransaction && request.getMethod().equals("prepare"))) { List<String> paths = new ArrayList<>(); @@ -128,11 +128,8 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti @Override public void afterAPICall(Worker<TransactionConnection> worker, Request request) throws Exception { - boolean isOnePhaseTransaction = worker.isInteractiveSessionMode(); - boolean isTwoPhaseTransaction = worker.isTransactionManagerMode(); - // handle only non-transactional calls - if (isOnePhaseTransaction || isTwoPhaseTransaction) + if (worker.isInteractiveSessionMode()) { return; } @@ -287,7 +284,7 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti ownerPath = ownerPath.substring(storageRoot.length()); } - Pattern compile = Pattern.compile("/\\d+/.+/../../../(\\d+-\\d+)/.*"); + Pattern compile = Pattern.compile("/\\d+/.+/../../../(.+)/.*"); Matcher matcher = compile.matcher(ownerPath); if (matcher.matches()) diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java index 885c1b21a67a36c98df7bdb1e217e2a92c1099b6..5b75316efe259e57af7ef37c3cccd02c84489443 100644 --- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java +++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java @@ -67,6 +67,10 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest private static final String OPENBIS_DUMMY_SERVER_PATH = "/"; + private static final String TRANSACTION_MANAGER_KEY = "5678"; + + private static final String INTERACTIVE_SESSION_KEY = "1234"; + private static final String SHARE_1 = "1"; private static final String SHARE_2 = "2"; @@ -474,8 +478,6 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest // no more datasets get created on subsequent writes assertEquals(1, dataSetCreations.size()); - assertEquals(ownerWithoutFiles, dataSetCreations.get(0).getCode()); - assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId()); } @Test @@ -500,6 +502,104 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA)); } + @Test + public void write_createsDataSetInAS_1PCTransaction() throws Exception + { + login(); + + String ownerWithoutFiles = UUID.randomUUID().toString(); + + List<DataSetCreation> dataSetCreations = new ArrayList<>(); + + dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) -> + { + switch (methodName) + { + case "createDataSets": + dataSetCreations.addAll((List<DataSetCreation>) methodArguments[1]); + return List.of(new DataSetPermId(ownerWithoutFiles)); + } + + return getDefaultOperationExecutor().executeOperation(methodName, methodArguments); + }); + + UUID transactionId = UUID.randomUUID(); + afsClient.setInteractiveSessionKey(INTERACTIVE_SESSION_KEY); + + afsClient.begin(transactionId); + assertEquals(0, dataSetCreations.size()); + + afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA)); + assertEquals(0, dataSetCreations.size()); + + afsClient.commit(); + + // dataset gets created on commit + assertEquals(1, dataSetCreations.size()); + assertEquals(ownerWithoutFiles.toUpperCase(), dataSetCreations.get(0).getCode()); + assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId()); + + UUID transactionId2 = UUID.randomUUID(); + + afsClient.begin(transactionId2); + afsClient.write(ownerWithoutFiles, FILE_B, 0L, DATA, IOUtils.getMD5(DATA)); + afsClient.commit(); + + // no more datasets get created on subsequent writes + assertEquals(1, dataSetCreations.size()); + } + + @Test + public void write_createsDataSetInAS_2PCTransaction() throws Exception + { + login(); + + String ownerWithoutFiles = UUID.randomUUID().toString(); + + List<DataSetCreation> dataSetCreations = new ArrayList<>(); + + dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) -> + { + switch (methodName) + { + case "createDataSets": + dataSetCreations.addAll((List<DataSetCreation>) methodArguments[1]); + return List.of(new DataSetPermId(ownerWithoutFiles)); + } + + return getDefaultOperationExecutor().executeOperation(methodName, methodArguments); + }); + + UUID transactionId = UUID.randomUUID(); + afsClient.setTransactionManagerKey(TRANSACTION_MANAGER_KEY); + afsClient.setInteractiveSessionKey(INTERACTIVE_SESSION_KEY); + + afsClient.begin(transactionId); + assertEquals(0, dataSetCreations.size()); + + afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA)); + assertEquals(0, dataSetCreations.size()); + + afsClient.prepare(); + + // dataset gets created on prepare + assertEquals(1, dataSetCreations.size()); + assertEquals(ownerWithoutFiles.toUpperCase(), dataSetCreations.get(0).getCode()); + assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId()); + + afsClient.commit(); + + UUID transactionId2 = UUID.randomUUID(); + + afsClient.begin(transactionId2); + afsClient.write(ownerWithoutFiles, FILE_B, 0L, DATA, IOUtils.getMD5(DATA)); + afsClient.prepare(); + afsClient.commit(); + + // no more datasets get created on subsequent writes + assertEquals(1, dataSetCreations.size()); + } + @Test public void move_failsDueToMissingPermissions() throws Exception {