public void offerToQueue(Point p) {
        // @todo -- THIS IS FLAWED, this call WILL drop point data when the queue is
        // full
        // WE CANNOT (???) BLOCK (i.e. swap to queue.put(p)) BECAUSE THE "DATA LOADING
        // THREAD" IS THE SAME AS THE "DATA PROCESSING THREAD"
        // ARE YOU SURE? The one data pulling task would block at offerToQueue while the
        // other threads would continue processing data and emptying queues
        boolean addedToQueue = queue.offer(p);

        numPointsIngested++;

        if (!addedToQueue) {
            long curCount = failCounter.incrementAndGet();

            if (curCount == failBreadCrumbTrigger) {
                makeOverflowBreadcrumb(failBreadCrumbTrigger);
                failBreadCrumbTrigger *= 10;

                throw new IllegalStateException("Failed to add Point to SwimLane " + failBreadCrumbTrigger / 10);
            }
        }
    }
@Test
    public void swimLaneEmitsBreadcrumbsOnOverflow() {

        SwimLane lane = new SwimLane(simpleStreamingKpi(), 1);
        Point point = Point.builder().latLong(0.0, 1.0).time(EPOCH).build();

        //these files should be made when the swim lane rejects data because the queue was full
        File warn1 = new File(OVER_FLOW_FILEPREFIX + 1 + ".txt");
        File warn10 = new File(OVER_FLOW_FILEPREFIX + 10 + ".txt");
        File warn100 = new File(OVER_FLOW_FILEPREFIX + 100 + ".txt");

        int exceptionCount = 0;

        assertThat(warn1.exists(), is(false));
        assertThat(warn10.exists(), is(false));
        assertThat(warn100.exists(), is(false));
        assertThat(exceptionCount, is(0));

        lane.offerToQueue(point); //accept 1st point

        assertThat(warn1.exists(), is(false));
        assertThat(warn10.exists(), is(false));
        assertThat(warn100.exists(), is(false));
        assertThat(exceptionCount, is(0));

        try {
            lane.offerToQueue(point); //drop this point
        } catch (IllegalStateException ise) {
            exceptionCount++;
        }

        assertThat(warn1.exists(), is(true));
        assertThat(warn10.exists(), is(false));
        assertThat(warn100.exists(), is(false));
        assertThat(exceptionCount, is(1));

        for (int i = 0; i < 10; i++) {
            try {
                lane.offerToQueue(point);  //drop 10 more points
            } catch (IllegalStateException ise) {
                exceptionCount++;
            }
        }

        assertThat(warn1.exists(), is(true));
        assertThat(warn10.exists(), is(true));
        assertThat(warn100.exists(), is(false));
        assertThat(exceptionCount, is(2));

        for (int i = 0; i < 100; i++) {
            try {
                lane.offerToQueue(point);  //drop 100 more points
            } catch (IllegalStateException ise) {
                exceptionCount++;
            }
        }

        assertThat(warn1.exists(), is(true));
        assertThat(warn10.exists(), is(true));
        assertThat(warn100.exists(), is(true));
        assertThat(exceptionCount, is(3));

        warn1.delete();
        warn10.delete();
        warn100.delete();
    }