fragmentBuilder.setFutureStatements(estBuilder);
}
// Get the TransactionWorkRequest.Builder for the remote HStoreSite
// We will use this store our serialized input dependencies
TransactionWorkRequestBuilder requestBuilder = tmp_transactionRequestBuilders[target_site];
if (requestBuilder == null) {
requestBuilder = tmp_transactionRequestBuilders[target_site] = new TransactionWorkRequestBuilder();
}
TransactionWorkRequest.Builder builder = requestBuilder.getBuilder(ts, doneNotifications);
// Also keep track of what Statements they are executing so that we know
// we need to send over the wire to them.
requestBuilder.addParamIndexes(fragmentBuilder.getParamIndexList());
// Input Dependencies
if (fragmentBuilder.getNeedsInput()) {
if (debug.val)
LOG.debug(String.format("%s - Retrieving input dependencies at partition %d",
ts, this.partitionId));
tmp_removeDependenciesMap.clear();
for (int i = 0, cnt = fragmentBuilder.getInputDepIdCount(); i < cnt; i++) {
this.getFragmentInputs(ts, fragmentBuilder.getInputDepId(i), tmp_removeDependenciesMap);
} // FOR
for (Entry<Integer, List<VoltTable>> e : tmp_removeDependenciesMap.entrySet()) {
if (requestBuilder.hasInputDependencyId(e.getKey())) continue;
if (debug.val)
LOG.debug(String.format("%s - Attaching %d input dependencies to be sent to %s",
ts, e.getValue().size(), HStoreThreadManager.formatSiteName(target_site)));
for (VoltTable vt : e.getValue()) {
this.fs.clear();
try {
this.fs.writeObject(vt);
builder.addAttachedDepId(e.getKey().intValue());
builder.addAttachedData(ByteString.copyFrom(this.fs.getBBContainer().b));
} catch (Exception ex) {
String msg = String.format("Failed to serialize input dependency %d for %s", e.getKey(), ts);
throw new ServerFaultException(msg, ts.getTransactionId());
}
if (debug.val)
LOG.debug(String.format("%s - Storing %d rows for InputDependency %d to send " +
"to partition %d [bytes=%d]",
ts, vt.getRowCount(), e.getKey(), fragmentBuilder.getPartitionId(),
CollectionUtil.last(builder.getAttachedDataList()).size()));
} // FOR
requestBuilder.addInputDependencyId(e.getKey());
} // FOR
this.fs.getBBContainer().discard();
}
builder.addFragments(fragmentBuilder);
} // FOR (tasks)
// Bad mojo! We need to throw a MispredictionException so that the VoltProcedure
// will catch it and we can propagate the error message all the way back to the HStoreSite
if (need_restart) {
if (trace.val)
LOG.trace(String.format("Aborting %s because it was mispredicted", ts));
// This is kind of screwy because we don't actually want to send the touched partitions
// histogram because VoltProcedure will just do it for us...
throw new MispredictionException(txn_id, null);
}
// Stick on the ParameterSets that each site needs into the TransactionWorkRequest
for (int target_site = 0; target_site < tmp_transactionRequestBuilders.length; target_site++) {
TransactionWorkRequestBuilder builder = tmp_transactionRequestBuilders[target_site];
if (builder == null || builder.isDirty() == false) {
continue;
}
assert(builder != null);
builder.addParameterSets(parameterSets);
// Bombs away!
this.hstore_coordinator.transactionWork(ts, target_site, builder.build(), this.request_work_callback);
if (debug.val)
LOG.debug(String.format("%s - Sent Work request to remote site %s",
ts, HStoreThreadManager.formatSiteName(target_site)));
} // FOR