summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-07-05 16:06:56 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-07-05 16:06:56 +0200
commit0409e74ad21d1fccf3909f96bda64bacd54b102d (patch)
tree6c53453bbecc0965004cfac45b8870519c4b98e7 /node-repository
parentc84211d12966c9a3a7c62a1f0440064f52921d94 (diff)
Towards transactional application delete
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CountingCuratorTransaction.java51
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/EagerCountingCuratorTransaction.java45
4 files changed, 48 insertions, 55 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CountingCuratorTransaction.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CountingCuratorTransaction.java
deleted file mode 100644
index de7513de242..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CountingCuratorTransaction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.persistence;
-
-import com.yahoo.transaction.Transaction;
-import com.yahoo.vespa.curator.Curator;
-import com.yahoo.vespa.curator.recipes.CuratorCounter;
-import com.yahoo.vespa.curator.transaction.CuratorTransaction;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A curator transaction which increases a change counter on commit.
- * As this only ever does a single thing it needs no operations.
- */
-class CountingCuratorTransaction implements Transaction {
-
- private final CuratorCounter counter;
-
- public CountingCuratorTransaction(CuratorCounter counter) {
- this.counter = counter;
- }
-
- @Override
- public Transaction add(Operation operation) { return this; }
-
- @Override
- public Transaction add(List<Operation> operation) { return this; }
-
- @Override
- public List<Operation> operations() { return Collections.emptyList(); }
-
- @Override
- public void prepare() {
- // Increase the counter also if there are prepare errors to throw away the cached state
- // in case that state leads to the rollback
- counter.next();
- }
-
- @Override
- public void rollbackOrLog() { }
-
- @Override
- public void close() { }
-
- @Override
- public void commit() { }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java
index c7134de5ae6..b1fb7f53616 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java
@@ -73,7 +73,7 @@ public class CuratorDatabase {
*/
public CuratorTransaction newCuratorTransactionIn(NestedTransaction transaction) {
// Add a counting transaction first, to make sure we always invalidate the current state on any transaction commit
- transaction.add(new CountingCuratorTransaction(changeGenerationCounter), CuratorTransaction.class);
+ transaction.add(new EagerCountingCuratorTransaction(changeGenerationCounter), CuratorTransaction.class);
CuratorTransaction curatorTransaction = new CuratorTransaction(curator);
transaction.add(curatorTransaction);
return curatorTransaction;
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
index 3152db59427..2ac7358a05c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
@@ -7,7 +7,6 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.log.LogLevel;
import com.yahoo.path.Path;
import com.yahoo.transaction.NestedTransaction;
-import com.yahoo.transaction.Transaction;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.transaction.CuratorTransaction;
import com.yahoo.vespa.hosted.provision.Node;
@@ -101,7 +100,7 @@ public class CuratorDatabaseClient {
Path path = toPath(state, hostName);
NestedTransaction transaction = new NestedTransaction();
CuratorTransaction curatorTransaction = curatorDatabase.newCuratorTransactionIn(transaction);
- curatorTransaction.add(CuratorOperations.delete(path.getAbsolute()));
+ curatorTransaction.add(CuratorOperations.deleteOrThrow(path.getAbsolute()));
transaction.commit();
log.log(LogLevel.INFO, "Removed: " + state + " node " + hostName);
return true;
@@ -148,7 +147,7 @@ public class CuratorDatabaseClient {
toState.isAllocated() ? node.allocation() : Optional.empty(),
newNodeHistory(node, toState),
node.type());
- curatorTransaction.add(CuratorOperations.delete(toPath(node).getAbsolute()))
+ curatorTransaction.add(CuratorOperations.deleteOrThrow(toPath(node).getAbsolute()))
.add(CuratorOperations.create(toPath(toState, newNode.hostname()).getAbsolute(), nodeSerializer.toJson(newNode)));
writtenNodes.add(newNode);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/EagerCountingCuratorTransaction.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/EagerCountingCuratorTransaction.java
new file mode 100644
index 00000000000..6e940763449
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/EagerCountingCuratorTransaction.java
@@ -0,0 +1,45 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision.persistence;
+
+import com.yahoo.transaction.AbstractTransaction;
+import com.yahoo.transaction.Transaction;
+import com.yahoo.vespa.curator.recipes.CuratorCounter;
+
+/**
+ * A curator transaction of curator counting operations which increments during prepare
+ * such that the counter is also increased if there is a commit error.
+ */
+class EagerCountingCuratorTransaction extends AbstractTransaction<EagerCountingCuratorTransaction.CountingCuratorOperation> {
+
+ /** Creates a counting curator transaction containing a single increment operation */
+ public EagerCountingCuratorTransaction(CuratorCounter counter) {
+ add(new CountingCuratorOperation(counter));
+ }
+
+ @Override
+ public void prepare() {
+ for (CountingCuratorOperation operation : operations())
+ operation.next();
+ }
+
+ @Override
+ public void commit() { }
+
+ @Override
+ public void rollbackOrLog() { }
+
+ static class CountingCuratorOperation implements Transaction.Operation {
+
+ private final CuratorCounter counter;
+
+ public CountingCuratorOperation(CuratorCounter counter) {
+ this.counter = counter;
+ }
+
+ public void next() {
+ counter.next();
+ }
+
+ }
+
+}