summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
21eed79)
Unlike the replay path, where we expect no successor, the forward
path may very well encounter a successor being present.
Move the assertion to replay path only, as that is where it catches
issues. The forward path automatically propagates the seal via its
use of sendRequest(), which is forwarded as needed and therefore
we only note the race via LOG.debug() and not assert it.
Change-Id: I6f95acc49800d456c049d19982c801015fd69420
JIRA: CONTROLLER-1885
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
- void sealOnly() {
- parent.onTransactionSealed(this);
- final boolean success = STATE_UPDATER.compareAndSet(this, OPEN, SEALED);
- Verify.verify(success, "Attempted to replay seal on %s", this);
+ /**
+ * Seal this transaction. If this method reports false, the caller needs to deal with propagating the seal operation
+ * towards the successor.
+ *
+ * @return True if seal operation was successful, false if this proxy has a successor.
+ */
+ boolean sealOnly() {
+ return sealState();
* @return True if seal operation was successful, false if this proxy has a successor.
*/
boolean sealAndSend(final Optional<Long> enqueuedTicks) {
* @return True if seal operation was successful, false if this proxy has a successor.
*/
boolean sealAndSend(final Optional<Long> enqueuedTicks) {
- parent.onTransactionSealed(this);
+ return sealState();
+ }
+ private boolean sealState() {
+ parent.onTransactionSealed(this);
// Transition internal state to sealed and detect presence of a successor
return STATE_UPDATER.compareAndSet(this, OPEN, SEALED);
}
// Transition internal state to sealed and detect presence of a successor
return STATE_UPDATER.compareAndSet(this, OPEN, SEALED);
}
+ return super.sealOnly();
*/
package org.opendaylight.controller.cluster.databroker.actors.dds;
*/
package org.opendaylight.controller.cluster.databroker.actors.dds;
+import static com.google.common.base.Verify.verify;
+
import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
// Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions
// until we know what we are going to do.
if (markSealed()) {
// Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions
// until we know what we are going to do.
if (markSealed()) {
+ if (!sealOnly()) {
+ LOG.debug("Proxy {} has a successor, which should receive seal through a separate request", this);
+ }
}
final TransactionRequest<?> tmp;
}
final TransactionRequest<?> tmp;
// Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions
// until we know what we are going to do.
if (markSealed()) {
// Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions
// until we know what we are going to do.
if (markSealed()) {
+ verify(sealOnly(), "Attempted to replay seal on %s", this);
}
final TransactionRequest<?> tmp;
}
final TransactionRequest<?> tmp;