| 108 | } |
| 109 | |
| 110 | void BufferedTupleStream::CheckConsistencyFast(const ReadIterator& read_it) const { |
| 111 | // All the below checks should be O(1). |
| 112 | DCHECK(has_write_iterator() || write_page_ == nullptr); |
| 113 | if (write_page_ != nullptr) { |
| 114 | CheckPageConsistency(write_page_); |
| 115 | DCHECK(write_page_->is_pinned()); |
| 116 | DCHECK(write_page_->retrieved_buffer.Load()); |
| 117 | const BufferHandle* write_buffer; |
| 118 | Status status = write_page_->GetBuffer(&write_buffer); |
| 119 | DCHECK(status.ok()); // Write buffer should never have been unpinned. |
| 120 | DCHECK_GE(write_ptr_, write_buffer->data()); |
| 121 | DCHECK_EQ(write_end_ptr_, write_buffer->data() + write_page_->len()); |
| 122 | DCHECK_GE(write_end_ptr_, write_ptr_); |
| 123 | } |
| 124 | DCHECK(read_it.is_valid() || read_it.read_page_ == pages_.end()); |
| 125 | if (read_it.read_page_ != pages_.end()) { |
| 126 | CheckPageConsistency(&*read_it.read_page_); |
| 127 | if (!read_it.read_page_->attached_to_output_batch) { |
| 128 | DCHECK(read_it.read_page_->is_pinned()); |
| 129 | DCHECK(read_it.read_page_->retrieved_buffer.Load()); |
| 130 | // Can't check read buffer without affecting behaviour, because a read may be in |
| 131 | // flight and this would required blocking on that write. |
| 132 | DCHECK_GE(read_it.read_end_ptr_, read_it.read_ptr_); |
| 133 | } |
| 134 | } |
| 135 | DCHECK(&read_it == &read_it_ || !read_it_.attach_on_read_) |
| 136 | << "External read iterators cannot coexist with attach_on_read mode"; |
| 137 | if (&read_it == &read_it_ && NeedReadReservation()) { |
| 138 | DCHECK_EQ(default_page_len_, read_page_reservation_.GetReservation()) |
| 139 | << DebugString(); |
| 140 | } else if (!read_page_reservation_.is_closed()) { |
| 141 | DCHECK_EQ(0, read_page_reservation_.GetReservation()); |
| 142 | } |
| 143 | if (NeedWriteReservation()) { |
| 144 | DCHECK_EQ(default_page_len_, write_page_reservation_.GetReservation()); |
| 145 | } else if (!write_page_reservation_.is_closed()) { |
| 146 | DCHECK_EQ(0, write_page_reservation_.GetReservation()); |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | void BufferedTupleStream::CheckPageConsistency(const Page* page) const { |
| 151 | if (page->attached_to_output_batch) { |