protected void process(ByteBuffer frame) throws HyracksDataException { boolean frameProcessed = false; while (!frameProcessed) { try { if (!bufferingEnabled) { coreOperator.nextFrame(frame); // synchronous mBuffer.sendReport(frame); } else { DataBucket bucket = pool.getDataBucket(); if (bucket != null) { if (frame != null) { bucket.reset(frame); // created a copy here bucket.setContentType(ContentType.DATA); } else { bucket.setContentType(ContentType.EOD); } bucket.setDesiredReadCount(1); mBuffer.sendMessage(bucket); mBuffer.sendReport(frame); nProcessed++; } else { if (fpa.spillToDiskOnCongestion()) { if (frame != null) { boolean spilled = spiller.processMessage(frame); if (spilled) { setMode(Mode.SPILL); } else { reportUnresolvableCongestion(); } } } else if (fpa.discardOnCongestion()) { boolean discarded = discarder.processMessage(frame); if (!discarded) { reportUnresolvableCongestion(); } } else if (fpa.throttlingEnabled()) { setThrottlingEnabled(true); } else { reportUnresolvableCongestion(); } } } frameProcessed = true; } catch (Exception e) { if (feedPolicyAccessor.continueOnSoftFailure()) { frame = exceptionHandler.handleException(e, frame); if (frame == null) { frameProcessed = true; if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning( "Encountered exception! " + e.getMessage() + "Insufficient information, Cannot extract failing tuple"); } } } else { if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning( "Ingestion policy does not require recovering from tuple. Feed would terminate"); } mBuffer.close(false); throw new HyracksDataException(e); } } } }