Я нашел интересные коды операций записи, глядя на SpannerIO, и хочу понять причины.
При записи (WriteToSpannerFn
) и REPORT_FAILURES
режим сбоя, кажется, пытается записать неудачные мутации дважды.
Я думаю, что это для регистрации исключений каждой мутации.Это правильное предположение, и есть ли обходной путь?
Ниже я удалил некоторые строки для простоты.
public void processElement(ProcessContext c) {
Iterable<MutationGroup> mutations = c.element();
boolean tryIndividual = false;
try {
Iterable<Mutation> batch = Iterables.concat(mutations);
spannerAccessor.getDatabaseClient().writeAtLeastOnce(batch);
} catch (SpannerException e) {
if (failureMode == FailureMode.REPORT_FAILURES) {
tryIndividual = true;
} else {
...
}
}
if (tryIndividual) {
for (MutationGroup mg : mutations) {
try {
spannerAccessor.getDatabaseClient().writeAtLeastOnce(mg);
} catch (SpannerException e) {
LOG.warn("Failed to submit the mutation group", e);
c.output(failedTag, mg);
}
}
}
}