mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
The bulk-checkin subsystem provides a mechanism to write blobs directly
to a packfile via `index_blob_bulk_checkin()`. If there is an ongoing
transaction when invoked, objects written via this function are stored
in the same packfile. The packfile is not flushed until the transaction
itself is flushed. If there is no transaction, the single object is
written to a packfile and immediately flushed. This complicates
`index_blob_bulk_checkin()` as it cannot reliably use the provided
transaction to get the associated repository.
Update `index_blob_bulk_checkin()` to assume that a valid transaction is
always provided. Callers are now expected to ensure a transaction is set
up beforehand. With this simplification, `deflate_blob_bulk_checkin()`
is no longer needed as a standalone internal function and is combined
with `index_blob_bulk_checkin()`. The single call site in
`object-file.c:index_fd()` is updated accordingly. Due to how
`{begin,end}_odb_transaction()` handles nested transactions, a new
transaction is only created and committed if there is not already an
ongoing transaction.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
62 lines
2.3 KiB
C
62 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2011, Google Inc.
|
|
*/
|
|
#ifndef BULK_CHECKIN_H
|
|
#define BULK_CHECKIN_H
|
|
|
|
#include "object.h"
|
|
#include "odb.h"
|
|
|
|
struct odb_transaction;
|
|
|
|
void prepare_loose_object_bulk_checkin(struct odb_transaction *transaction);
|
|
void fsync_loose_object_bulk_checkin(struct odb_transaction *transaction,
|
|
int fd, const char *filename);
|
|
|
|
/*
|
|
* This writes the specified object to a packfile. Objects written here
|
|
* during the same transaction are written to the same packfile. The
|
|
* packfile is not flushed until the transaction is flushed. The caller
|
|
* is expected to ensure a valid transaction is setup for objects to be
|
|
* recorded to.
|
|
*
|
|
* This also bypasses the usual "convert-to-git" dance, and that is on
|
|
* purpose. We could write a streaming version of the converting
|
|
* functions and insert that before feeding the data to fast-import
|
|
* (or equivalent in-core API described above). However, that is
|
|
* somewhat complicated, as we do not know the size of the filter
|
|
* result, which we need to know beforehand when writing a git object.
|
|
* Since the primary motivation for trying to stream from the working
|
|
* tree file and to avoid mmaping it in core is to deal with large
|
|
* binary blobs, they generally do not want to get any conversion, and
|
|
* callers should avoid this code path when filters are requested.
|
|
*/
|
|
int index_blob_bulk_checkin(struct odb_transaction *transaction,
|
|
struct object_id *oid, int fd, size_t size,
|
|
const char *path, unsigned flags);
|
|
|
|
/*
|
|
* Tell the object database to optimize for adding
|
|
* multiple objects. end_odb_transaction must be called
|
|
* to make new objects visible. Transactions can be nested,
|
|
* and objects are only visible after the outermost transaction
|
|
* is complete or the transaction is flushed.
|
|
*/
|
|
struct odb_transaction *begin_odb_transaction(struct object_database *odb);
|
|
|
|
/*
|
|
* Make any objects that are currently part of a pending object
|
|
* database transaction visible. It is valid to call this function
|
|
* even if no transaction is active.
|
|
*/
|
|
void flush_odb_transaction(struct odb_transaction *transaction);
|
|
|
|
/*
|
|
* Tell the object database to make any objects from the
|
|
* current transaction visible if this is the final nested
|
|
* transaction.
|
|
*/
|
|
void end_odb_transaction(struct odb_transaction *transaction);
|
|
|
|
#endif
|