mirror of
https://github.com/apache/druid.git
synced 2025-02-10 12:05:00 +00:00
Merge pull request #681 from metamx/fix-rt
fix some rt cleanup and failure edge cases
This commit is contained in:
commit
56f1d924e3
@ -312,6 +312,22 @@ public class RealtimePlumber implements Plumber
|
|||||||
{
|
{
|
||||||
final Interval interval = sink.getInterval();
|
final Interval interval = sink.getInterval();
|
||||||
|
|
||||||
|
// use a file to indicate that pushing has completed
|
||||||
|
final File persistDir = computePersistDir(schema, interval);
|
||||||
|
final File mergedTarget = new File(persistDir, "merged");
|
||||||
|
final File isPushedMarker = new File(persistDir, "isPushedMarker");
|
||||||
|
|
||||||
|
if (!isPushedMarker.exists()) {
|
||||||
|
removeSegment(sink, mergedTarget);
|
||||||
|
if (mergedTarget.exists()) {
|
||||||
|
log.wtf("Merged target[%s] exists?!", mergedTarget);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.info("Already pushed sink[%s]", sink);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (FireHydrant hydrant : sink) {
|
for (FireHydrant hydrant : sink) {
|
||||||
synchronized (hydrant) {
|
synchronized (hydrant) {
|
||||||
if (!hydrant.hasSwapped()) {
|
if (!hydrant.hasSwapped()) {
|
||||||
@ -322,12 +338,6 @@ public class RealtimePlumber implements Plumber
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final File mergedTarget = new File(computePersistDir(schema, interval), "merged");
|
|
||||||
if (mergedTarget.exists()) {
|
|
||||||
log.info("Skipping already-merged sink: %s", sink);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
List<QueryableIndex> indexes = Lists.newArrayList();
|
List<QueryableIndex> indexes = Lists.newArrayList();
|
||||||
for (FireHydrant fireHydrant : sink) {
|
for (FireHydrant fireHydrant : sink) {
|
||||||
@ -351,6 +361,14 @@ public class RealtimePlumber implements Plumber
|
|||||||
);
|
);
|
||||||
|
|
||||||
segmentPublisher.publishSegment(segment);
|
segmentPublisher.publishSegment(segment);
|
||||||
|
|
||||||
|
if (!isPushedMarker.createNewFile()) {
|
||||||
|
log.makeAlert("Failed to create marker file for [%s]", schema.getDataSource())
|
||||||
|
.addData("interval", sink.getInterval())
|
||||||
|
.addData("partitionNum", segment.getShardSpec().getPartitionNum())
|
||||||
|
.addData("marker", isPushedMarker)
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.makeAlert(e, "Failed to persist merged index[%s]", schema.getDataSource())
|
log.makeAlert(e, "Failed to persist merged index[%s]", schema.getDataSource())
|
||||||
@ -360,9 +378,6 @@ public class RealtimePlumber implements Plumber
|
|||||||
// We're trying to shut down, and this segment failed to push. Let's just get rid of it.
|
// We're trying to shut down, and this segment failed to push. Let's just get rid of it.
|
||||||
// This call will also delete possibly-partially-written files, so we don't need to do it explicitly.
|
// This call will also delete possibly-partially-written files, so we don't need to do it explicitly.
|
||||||
abandonSegment(truncatedTime, sink);
|
abandonSegment(truncatedTime, sink);
|
||||||
} else {
|
|
||||||
// Delete any possibly-partially-written files, so we can try again on the next push cycle.
|
|
||||||
removeMergedSegment(sink);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -649,7 +664,7 @@ public class RealtimePlumber implements Plumber
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
segmentAnnouncer.unannounceSegment(sink.getSegment());
|
segmentAnnouncer.unannounceSegment(sink.getSegment());
|
||||||
removeMergedSegment(sink);
|
removeSegment(sink, computePersistDir(schema, sink.getInterval()));
|
||||||
log.info("Removing sinkKey %d for segment %s", truncatedTime, sink.getSegment().getIdentifier());
|
log.info("Removing sinkKey %d for segment %s", truncatedTime, sink.getSegment().getIdentifier());
|
||||||
sinks.remove(truncatedTime);
|
sinks.remove(truncatedTime);
|
||||||
sinkTimeline.remove(
|
sinkTimeline.remove(
|
||||||
@ -798,16 +813,16 @@ public class RealtimePlumber implements Plumber
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeMergedSegment(final Sink sink)
|
private void removeSegment(final Sink sink, final File target)
|
||||||
{
|
{
|
||||||
final File mergedTarget = new File(computePersistDir(schema, sink.getInterval()), "merged");
|
if (target.exists()) {
|
||||||
if (mergedTarget.exists()) {
|
|
||||||
try {
|
try {
|
||||||
log.info("Deleting Index File[%s]", mergedTarget);
|
log.info("Deleting Index File[%s]", target);
|
||||||
FileUtils.deleteDirectory(mergedTarget);
|
FileUtils.deleteDirectory(target);
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.makeAlert(e, "Unable to remove merged segment for dataSource[%s]", schema.getDataSource())
|
log.makeAlert(e, "Unable to remove file for dataSource[%s]", schema.getDataSource())
|
||||||
|
.addData("file", target)
|
||||||
.addData("interval", sink.getInterval())
|
.addData("interval", sink.getInterval())
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user