* Register a reference to a buffer with the WAL record being constructed. * This must be called for every page that the WAL-logged operation modifies. */
| 226 | * This must be called for every page that the WAL-logged operation modifies. |
| 227 | */ |
| 228 | void |
| 229 | XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags) |
| 230 | { |
| 231 | registered_buffer *regbuf; |
| 232 | |
| 233 | /* NO_IMAGE doesn't make sense with FORCE_IMAGE */ |
| 234 | Assert(!((flags & REGBUF_FORCE_IMAGE) && (flags & (REGBUF_NO_IMAGE)))); |
| 235 | Assert(begininsert_called); |
| 236 | |
| 237 | if (block_id >= max_registered_block_id) |
| 238 | { |
| 239 | if (block_id >= max_registered_buffers) |
| 240 | elog(ERROR, "too many registered buffers"); |
| 241 | max_registered_block_id = block_id + 1; |
| 242 | } |
| 243 | |
| 244 | regbuf = ®istered_buffers[block_id]; |
| 245 | |
| 246 | BufferGetTag(buffer, ®buf->rnode, ®buf->forkno, ®buf->block); |
| 247 | regbuf->page = BufferGetPage(buffer); |
| 248 | regbuf->flags = flags; |
| 249 | regbuf->rdata_tail = (XLogRecData *) ®buf->rdata_head; |
| 250 | regbuf->rdata_len = 0; |
| 251 | |
| 252 | /* |
| 253 | * Check that this page hasn't already been registered with some other |
| 254 | * block_id. |
| 255 | */ |
| 256 | #ifdef USE_ASSERT_CHECKING |
| 257 | { |
| 258 | int i; |
| 259 | |
| 260 | for (i = 0; i < max_registered_block_id; i++) |
| 261 | { |
| 262 | registered_buffer *regbuf_old = ®istered_buffers[i]; |
| 263 | |
| 264 | if (i == block_id || !regbuf_old->in_use) |
| 265 | continue; |
| 266 | |
| 267 | Assert(!RelFileNodeEquals(regbuf_old->rnode, regbuf->rnode) || |
| 268 | regbuf_old->forkno != regbuf->forkno || |
| 269 | regbuf_old->block != regbuf->block); |
| 270 | } |
| 271 | } |
| 272 | #endif |
| 273 | |
| 274 | regbuf->in_use = true; |
| 275 | } |
| 276 | |
| 277 | /* |
| 278 | * Like XLogRegisterBuffer, but for registering a block that's not in the |
no test coverage detected