DatabaseStateMachine: return value on conditional failure
Change-Id: I579652659ea7281013c341c6ea9df2003b90bcdd
Showing
1 changed file
with
12 additions
and
13 deletions
| ... | @@ -155,8 +155,7 @@ public class DatabaseStateMachine implements StateMachine { | ... | @@ -155,8 +155,7 @@ public class DatabaseStateMachine implements StateMachine { |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | 157 | ||
| 158 | - WriteStatus checkIfApplicable(WriteRequest request, | 158 | + WriteStatus checkIfApplicable(WriteRequest request, VersionedValue value) { |
| 159 | - VersionedValue value) { | ||
| 160 | 159 | ||
| 161 | switch (request.type()) { | 160 | switch (request.type()) { |
| 162 | case PUT: | 161 | case PUT: |
| ... | @@ -167,20 +166,24 @@ public class DatabaseStateMachine implements StateMachine { | ... | @@ -167,20 +166,24 @@ public class DatabaseStateMachine implements StateMachine { |
| 167 | return WriteStatus.OK; | 166 | return WriteStatus.OK; |
| 168 | } | 167 | } |
| 169 | return WriteStatus.PRECONDITION_VIOLATION; | 168 | return WriteStatus.PRECONDITION_VIOLATION; |
| 169 | + | ||
| 170 | case PUT_IF_VALUE: | 170 | case PUT_IF_VALUE: |
| 171 | case REMOVE_IF_VALUE: | 171 | case REMOVE_IF_VALUE: |
| 172 | if (value != null && Arrays.equals(value.value(), request.oldValue())) { | 172 | if (value != null && Arrays.equals(value.value(), request.oldValue())) { |
| 173 | return WriteStatus.OK; | 173 | return WriteStatus.OK; |
| 174 | } | 174 | } |
| 175 | return WriteStatus.PRECONDITION_VIOLATION; | 175 | return WriteStatus.PRECONDITION_VIOLATION; |
| 176 | + | ||
| 176 | case PUT_IF_VERSION: | 177 | case PUT_IF_VERSION: |
| 177 | case REMOVE_IF_VERSION: | 178 | case REMOVE_IF_VERSION: |
| 178 | if (value != null && request.previousVersion() == value.version()) { | 179 | if (value != null && request.previousVersion() == value.version()) { |
| 179 | return WriteStatus.OK; | 180 | return WriteStatus.OK; |
| 180 | } | 181 | } |
| 181 | return WriteStatus.PRECONDITION_VIOLATION; | 182 | return WriteStatus.PRECONDITION_VIOLATION; |
| 183 | + | ||
| 182 | case REMOVE: | 184 | case REMOVE: |
| 183 | return WriteStatus.OK; | 185 | return WriteStatus.OK; |
| 186 | + | ||
| 184 | default: | 187 | default: |
| 185 | break; | 188 | break; |
| 186 | } | 189 | } |
| ... | @@ -193,31 +196,27 @@ public class DatabaseStateMachine implements StateMachine { | ... | @@ -193,31 +196,27 @@ public class DatabaseStateMachine implements StateMachine { |
| 193 | 196 | ||
| 194 | // applicability check | 197 | // applicability check |
| 195 | boolean abort = false; | 198 | boolean abort = false; |
| 196 | - List<WriteStatus> validationResults = new ArrayList<>(batchRequest.batchSize()); | 199 | + List<WriteResult> results = new ArrayList<>(batchRequest.batchSize()); |
| 200 | + | ||
| 197 | for (WriteRequest request : batchRequest.getAsList()) { | 201 | for (WriteRequest request : batchRequest.getAsList()) { |
| 198 | Map<String, VersionedValue> table = state.getTable(request.tableName()); | 202 | Map<String, VersionedValue> table = state.getTable(request.tableName()); |
| 199 | if (table == null) { | 203 | if (table == null) { |
| 200 | - validationResults.add(WriteStatus.NO_SUCH_TABLE); | 204 | + results.add(new WriteResult(WriteStatus.NO_SUCH_TABLE, null)); |
| 201 | abort = true; | 205 | abort = true; |
| 202 | continue; | 206 | continue; |
| 203 | } | 207 | } |
| 204 | final VersionedValue value = table.get(request.key()); | 208 | final VersionedValue value = table.get(request.key()); |
| 205 | WriteStatus result = checkIfApplicable(request, value); | 209 | WriteStatus result = checkIfApplicable(request, value); |
| 206 | - validationResults.add(result); | 210 | + results.add(new WriteResult(result, value)); |
| 207 | if (result != WriteStatus.OK) { | 211 | if (result != WriteStatus.OK) { |
| 208 | abort = true; | 212 | abort = true; |
| 209 | } | 213 | } |
| 210 | } | 214 | } |
| 211 | 215 | ||
| 212 | - List<WriteResult> results = new ArrayList<>(batchRequest.batchSize()); | ||
| 213 | - | ||
| 214 | if (abort) { | 216 | if (abort) { |
| 215 | - for (WriteStatus validationResult : validationResults) { | 217 | + for (int i = 0; i < results.size(); ++i) { |
| 216 | - if (validationResult == WriteStatus.OK) { | 218 | + if (results.get(i).status() == WriteStatus.OK) { |
| 217 | - // aborted due to applicability check failure on other request | 219 | + results.set(i, new WriteResult(WriteStatus.ABORTED, null)); |
| 218 | - results.add(new WriteResult(WriteStatus.ABORTED, null)); | ||
| 219 | - } else { | ||
| 220 | - results.add(new WriteResult(validationResult, null)); | ||
| 221 | } | 220 | } |
| 222 | } | 221 | } |
| 223 | return results; | 222 | return results; | ... | ... |
-
Please register or login to post a comment