| 239 | |
| 240 | |
| 241 | Future<Option<string>> GroupProcess::data(const Group::Membership& membership) |
| 242 | { |
| 243 | if (error.isSome()) { |
| 244 | return Failure(error.get()); |
| 245 | } else if (state != READY) { |
| 246 | Data* data = new Data(membership); |
| 247 | pending.datas.push(data); |
| 248 | return data->promise.future(); |
| 249 | } |
| 250 | |
| 251 | // TODO(benh): Only attempt if the pending queue is empty so that a |
| 252 | // client can assume a happens-before ordering of operations (i.e., |
| 253 | // the first request will happen before the second, etc). |
| 254 | |
| 255 | Result<Option<string>> result = doData(membership); |
| 256 | |
| 257 | if (result.isNone()) { // Try again later. |
| 258 | Data* data = new Data(membership); |
| 259 | pending.datas.push(data); |
| 260 | return data->promise.future(); |
| 261 | } else if (result.isError()) { |
| 262 | return Failure(result.error()); |
| 263 | } |
| 264 | |
| 265 | return result.get(); |
| 266 | } |
| 267 | |
| 268 | |
| 269 | Future<set<Group::Membership>> GroupProcess::watch( |