                     return false;
                 }
 
+                uint32 insert_idx_D = table.find_insertion_point(keys.D);
+                assert(insert_idx_D < LOCAL_TABLE_SIZE);
+
                 ret = update(insert_idx_D, keys.D, fractional_error_D);
                 if (ret == false)
                 {
-                    //printf("overflow! rollback at read index %u event index %u\n", read_index, cigar_event_index);
-
+//                    printf("[B %d T %d] overflow! rollback at read index %u event index %u event D insert index %d\n", blockIdx.x, threadIdx.x, read_index, cigar_event_index, insert_idx_D);
+
+//                    printf("[B %d T %d] rolling back I (index %d)\n", blockIdx.x, threadIdx.x, insert_idx_I);
                     rollback(insert_idx_I, keys.I, fractional_error_I);
+//                    printf("[B %d T %d] rolling back M (index %d)\n", blockIdx.x, threadIdx.x, insert_idx_M);
                     rollback(insert_idx_M, keys.M, fractional_error_M);
 
                     // mark for rollback from here

                }
            } else {
                // MODE == Rollback
                rollback(insert_idx_M, keys.M, fractional_error_M);
                rollback(insert_idx_I, keys.I, fractional_error_I);
                rollback(insert_idx_D, keys.D, fractional_error_D);
            }
        }

            covariate_key_set keys = covariate_chain::encode(ctx, batch, read_index, read_bp_offset, cigar_event_index);

            //        printf("locating key %x...\n", key);

            //        if (table->exists(insert_idx) && table->table[insert_idx].key == key)
            //            printf("... found at index %d (%x)\n", insert_idx, table->table[insert_idx].key);
