Yuta HIGUCHI

DatabaseStateMachine: return value on conditional failure

Change-Id: I579652659ea7281013c341c6ea9df2003b90bcdd
...@@ -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;
......