github.com/pachyderm/pachyderm@v1.13.4/src/client/admin/v1_10/pfs/pfs.proto (about)

     1  syntax = "proto3";
     2  
     3  package pfs_1_10;
     4  option go_package = "github.com/pachyderm/pachyderm/src/client/admin/v1_10/pfs";
     5  
     6  import "google/protobuf/empty.proto";
     7  import "google/protobuf/timestamp.proto";
     8  import "google/protobuf/wrappers.proto";
     9  
    10  import "gogoproto/gogo.proto";
    11  
    12  import "client/admin/v1_10/auth/auth.proto";
    13  
    14  ////  PFS Data structures (stored in etcd)
    15  
    16  message Repo {
    17    string name = 1;
    18  }
    19  
    20  message Branch {
    21    Repo repo = 1;
    22    string name = 2;
    23  }
    24  
    25  message BranchInfo {
    26    Branch branch = 4;
    27    Commit head = 2;
    28    repeated Branch provenance = 3;
    29    repeated Branch subvenance = 5;
    30    repeated Branch direct_provenance = 6;
    31  
    32    // Deprecated field left for backward compatibility.
    33    string name = 1;
    34  }
    35  
    36  message BranchInfos {
    37    repeated BranchInfo branch_info = 1;
    38  }
    39  
    40  message File {
    41    Commit commit = 1;
    42    string path = 2;
    43  }
    44  
    45  message Block {
    46    string hash = 1;
    47  }
    48  
    49  message Object {
    50    string hash = 1;
    51  }
    52  
    53  message Tag {
    54    string name = 1;
    55  }
    56  
    57  // RepoInfo is the main data structure representing a Repo in etcd
    58  message RepoInfo {
    59    reserved 4;
    60    Repo repo = 1;
    61    google.protobuf.Timestamp created = 2;
    62    uint64 size_bytes = 3;
    63    string description = 5;
    64    repeated Branch branches = 7;
    65  
    66    // Set by ListRepo and InspectRepo if Pachyderm's auth system is active, but
    67    // not stored in etcd. To set a user's auth scope for a repo, use the
    68    // Pachyderm Auth API (in src/client/auth/auth.proto)
    69    RepoAuthInfo auth_info = 6;
    70  }
    71  
    72  // RepoAuthInfo includes the caller's access scope for a repo, and is returned
    73  // by ListRepo and InspectRepo but not persisted in etcd. It's used by the
    74  // Pachyderm dashboard to render repo access appropriately. To set a user's auth
    75  // scope for a repo, use the Pachyderm Auth API (in src/client/auth/auth.proto)
    76  message RepoAuthInfo {
    77    // The callers access level to the relevant repo (e.g. may be OWNER even if
    78    // the user isn't an OWNER of the repo, if they're an admin for the cluster)
    79    auth_1_10.Scope access_level = 1;
    80  }
    81  
    82  // These are the different places where a commit may be originated from
    83  enum OriginKind {
    84    USER = 0;
    85    AUTO = 1;
    86    FSCK = 2;
    87  }
    88  
    89  message CommitOrigin {
    90    OriginKind kind = 1;
    91  }
    92  // Commit is a reference to a commit (e.g. the collection of branches and the
    93  // collection of currently-open commits in etcd are collections of Commit
    94  // protos)
    95  message Commit {
    96    Repo repo = 1;
    97    string id = 2 [(gogoproto.customname) = "ID"];
    98  }
    99  
   100  // CommitRange represents chain of commits with Lower being an ancestor of
   101  // Upper or, in the case of a range of size 1, the same commit.
   102  message CommitRange {
   103    Commit lower = 1;
   104    Commit upper = 2;
   105  }
   106  
   107  // CommitProvenance keeps track of where (i.e. which branch) a certain commit
   108  // originated from. A commit's provenance consists of the commits of
   109  // the commits which are in its causal history.
   110  message CommitProvenance {
   111    Commit commit = 1;
   112    Branch branch = 2;
   113  }
   114  
   115  // CommitInfo is the main data structure representing a commit in etcd
   116  message CommitInfo {
   117    reserved 6, 10;
   118    Commit commit = 1;
   119    Branch branch = 15;
   120    CommitOrigin origin = 17;
   121    // description is a user-provided script describing this commit
   122    string description = 8;
   123    Commit parent_commit = 2;
   124    repeated Commit child_commits = 11;
   125    google.protobuf.Timestamp started = 3;
   126    google.protobuf.Timestamp finished = 4;
   127    uint64 size_bytes = 5;
   128  
   129    // the commits and their original branches on which this commit is provenant
   130    repeated CommitProvenance provenance = 16;
   131  
   132    // ReadyProvenance is the number of provenant commits which have been
   133    // finished, if ReadyProvenance == len(Provenance) then the commit is ready
   134    // to be processed by pps.
   135    int64 ready_provenance = 12;
   136  
   137    repeated CommitRange subvenance = 9;
   138    // this is the block that stores the serialized form of a tree that
   139    // represents the entire file system hierarchy of the repo at this commit
   140    // If this is nil, then the commit is either open (in which case 'finished'
   141    // will also be nil) or is the output commit of a failed job (in which case
   142    // 'finished' will have a value -- the end time of the job)
   143    Object tree = 7;
   144    repeated Object trees = 13;
   145    Object datums = 14;
   146  
   147    int64 subvenant_commits_success = 18;
   148    int64 subvenant_commits_failure = 19;
   149    int64 subvenant_commits_total = 20;
   150  }
   151  
   152  enum FileType {
   153    RESERVED = 0;
   154    FILE = 1;
   155    DIR = 2;
   156  }
   157  
   158  message FileInfo {
   159    File file = 1;
   160    FileType file_type = 2;
   161    uint64 size_bytes = 3;
   162    google.protobuf.Timestamp committed = 10;
   163    // the base names (i.e. just the filenames, not the full paths) of
   164    // the children
   165    repeated string children = 6;
   166    repeated Object objects = 8;
   167    repeated BlockRef blockRefs = 9;
   168    bytes hash = 7;
   169  }
   170  
   171  message ByteRange {
   172    uint64 lower = 1;
   173    uint64 upper = 2;
   174  }
   175  
   176  message BlockRef {
   177    Block block = 1;
   178    ByteRange range = 2;
   179  }
   180  
   181  message ObjectInfo {
   182    Object object = 1;
   183    BlockRef block_ref = 2;
   184  }
   185  
   186  message Compaction {
   187    repeated string prefixes = 1;
   188  }
   189  
   190  message Shard {
   191    PathRange range = 1;
   192  }
   193  
   194  message PathRange {
   195    string lower = 1;
   196    string upper = 2;
   197  }
   198  
   199  // PFS API
   200  
   201  message CreateRepoRequest {
   202    reserved 2;
   203    Repo repo = 1;
   204    string description = 3;
   205    bool update = 4;
   206  }
   207  
   208  message InspectRepoRequest {
   209    Repo repo = 1;
   210  }
   211  
   212  message ListRepoRequest {
   213    reserved 1;
   214  }
   215  
   216  message ListRepoResponse {
   217    repeated RepoInfo repo_info = 1;
   218  }
   219  
   220  message DeleteRepoRequest {
   221    Repo repo = 1;
   222    bool force = 2;
   223    bool all = 3;
   224  }
   225  
   226  // CommitState describes the states a commit can be in.
   227  // The states are increasingly specific, i.e. a commit that is FINISHED also counts as STARTED.
   228  enum CommitState {
   229    STARTED = 0; // The commit has been started, all commits satisfy this state.
   230    READY = 1; // The commit has been started, and all of its provenant commits have been finished.
   231    FINISHED = 2; // The commit has been finished.
   232  }
   233  
   234  message StartCommitRequest {
   235    reserved 2;
   236    // Parent.ID may be empty in which case the commit that Branch points to will be used as the parent.
   237    // If branch is empty, or if branch does not exist, the commit will have no parent.
   238    Commit parent = 1;
   239    // description is a user-provided string describing this commit
   240    string description = 4;
   241    string branch = 3;
   242    repeated CommitProvenance provenance = 5;
   243  }
   244  
   245  message BuildCommitRequest {
   246    reserved 2;
   247    Commit parent = 1;
   248    string branch = 4;
   249    repeated CommitProvenance provenance = 6;
   250    Object tree = 3;
   251    repeated Object trees = 7;
   252    Object datums = 8;
   253    // ID sets the ID of the created commit.
   254    string ID = 5;
   255    uint64 size_bytes = 9;
   256    // 'started' and 'finished' are set by Restore() when repopulating old
   257    // commits. If 'finished' is set, the commit being built is always marked
   258    // finished.
   259    google.protobuf.Timestamp started = 10;
   260    google.protobuf.Timestamp finished = 11;
   261  }
   262  
   263  message FinishCommitRequest {
   264    Commit commit = 1;
   265    // description is a user-provided string describing this commit. Setting this
   266    // will overwrite the description set in StartCommit
   267    string description = 2;
   268  
   269    Object tree = 3;
   270    repeated Object trees = 5;
   271    Object datums = 7;
   272    uint64 size_bytes = 6;
   273    // If set, 'commit' will be closed (its 'finished' field will be set to the
   274    // current time) but its 'tree' will be left nil.
   275    bool empty = 4;
   276  }
   277  
   278  message InspectCommitRequest {
   279    Commit commit = 1;
   280    // BlockState causes inspect commit to block until the commit is in the desired state.
   281    CommitState block_state = 2;
   282  }
   283  
   284  message ListCommitRequest {
   285    Repo repo = 1;
   286    Commit from = 2;
   287    Commit to = 3;
   288    uint64 number = 4;
   289    bool reverse = 5;  // Return commits oldest to newest
   290  }
   291  
   292  message CommitInfos {
   293    repeated CommitInfo commit_info = 1;
   294  }
   295  
   296  message CreateBranchRequest {
   297    Commit head = 1;
   298    // s_branch matches the field number and type of SetBranchRequest.Branch in
   299    // Pachyderm 1.6--so that operations (generated by pachyderm 1.6's
   300    // Admin.Export) can be deserialized by pachyderm 1.7 correctly
   301    string s_branch = 2;
   302    Branch branch = 3;
   303    repeated Branch provenance = 4;
   304  }
   305  
   306  message InspectBranchRequest {
   307    Branch branch = 1;
   308  }
   309  
   310  message ListBranchRequest {
   311    Repo repo = 1;
   312    bool reverse = 2; // Returns branches oldest to newest
   313  }
   314  
   315  message DeleteBranchRequest {
   316    Branch branch = 1;
   317    bool force = 2;
   318  }
   319  
   320  message DeleteCommitRequest {
   321    Commit commit = 1;
   322  }
   323  
   324  message FlushCommitRequest {
   325    repeated Commit commits = 1;
   326    repeated Repo to_repos = 2;
   327  }
   328  
   329  message SubscribeCommitRequest {
   330    Repo repo = 1;
   331    string branch = 2;
   332    CommitProvenance prov = 5;
   333    // only commits created since this commit are returned
   334    Commit from = 3;
   335    // Don't return commits until they're in (at least) the desired state.
   336    CommitState state = 4;
   337  }
   338  
   339  message GetFileRequest {
   340    File file = 1;
   341    int64 offset_bytes = 2;
   342    int64 size_bytes = 3;
   343  }
   344  
   345  enum Delimiter {
   346    NONE = 0;
   347    JSON = 1;
   348    LINE = 2;
   349    SQL = 3;
   350    CSV = 4;
   351  }
   352  
   353  // An OverwriteIndex specifies the index of objects from which new writes
   354  // are applied to.  Existing objects starting from the index are deleted.
   355  // We want a separate message for ObjectIndex because we want to be able to
   356  // distinguish between a zero index and a non-existent index.
   357  message OverwriteIndex {
   358    int64 index = 1;
   359  }
   360  
   361  message PutFileRequest {
   362    reserved 2, 4;
   363    File file = 1;
   364    bytes value = 3;
   365    string url = 5;
   366    // applies only to URLs that can be recursively walked, for example s3:// URLs
   367    bool recursive = 6;
   368    // Delimiter causes data to be broken up into separate files with File.Path
   369    // as a prefix.
   370    Delimiter delimiter = 7;
   371    // TargetFileDatums specifies the target number of datums in each written
   372    // file it may be lower if data does not split evenly, but will never be
   373    // higher, unless the value is 0.
   374    int64 target_file_datums = 8;
   375    // TargetFileBytes specifies the target number of bytes in each written
   376    // file, files may have more or fewer bytes than the target.
   377    int64 target_file_bytes = 9;
   378    // header_records is an option for splitting data when 'delimiter' is not NONE
   379    // (or SQL). It specifies the number of records that are converted to a
   380    // header and applied to all file shards.
   381    //
   382    // This is particularly useful for CSV files, where the first row often
   383    // contains column titles; if 'header_records' is set to one in that case,
   384    // the first row will be associated with the directory that contains the rest
   385    // of the split-up csv rows as files, and if any data is retrieved from that
   386    // directory by GetFile, it will appear to begin with that first row of
   387    // column labels (including in pipeline workers).
   388    //
   389    // Note that SQL files have their own logic for determining headers (their
   390    // header is not a number of records, but a collection of SQL commands that
   391    // create the relevant tables and such). This way, SQL files retrieved by
   392    // GetFile can be passed to psql, and they will set up the appropriate tables
   393    // before inserting the records in the files that were retrieved.
   394    int64 header_records = 11;
   395    // overwrite_index is the object index where the write starts from.  All
   396    // existing objects starting from the index are deleted.
   397    OverwriteIndex overwrite_index = 10;
   398  }
   399  
   400  // PutFileRecord is used to record PutFile requests in etcd temporarily.
   401  message PutFileRecord {
   402    int64 size_bytes = 1;
   403    string object_hash = 2;
   404    OverwriteIndex overwrite_index = 3;
   405    BlockRef block_ref = 4;
   406  }
   407  
   408  message PutFileRecords {
   409    bool split = 1;
   410    repeated PutFileRecord records = 2;
   411    bool tombstone = 3;
   412    PutFileRecord header = 4;
   413    PutFileRecord footer = 5;
   414  }
   415  
   416  message CopyFileRequest {
   417    File src = 1;
   418    File dst = 2;
   419    bool overwrite = 3;
   420  }
   421  
   422  message InspectFileRequest {
   423    File file = 1;
   424  }
   425  
   426  message ListFileRequest {
   427    // File is the parent directory of the files we want to list. This sets the
   428    // repo, the commit/branch, and path prefix of files we're interested in
   429    // If the "path" field is omitted, a list of files at the top level of the repo
   430    // is returned
   431    File file = 1;
   432  
   433    // Full indicates whether the result should include file contents, which may
   434    // be large (i.e. the list of children for directories, and the list of object
   435    // references for regular files)
   436    bool full = 2;
   437  
   438    // History indicates how many historical versions you want returned. Its
   439    // semantics are:
   440    // 0: Return the files as they are at the commit in `file`. FileInfo.File
   441    //    will equal File in this request.
   442    // 1: Return the files as they are in the last commit they were modified in.
   443    //    (This will have the same hash as if you'd passed 0, but
   444    //    FileInfo.File.Commit will be different.
   445    // 2: Return the above and the files as they are in the next-last commit they
   446    //    were modified in.
   447    // 3: etc.
   448    //-1: Return all historical versions.
   449    int64 history = 3;
   450  }
   451  
   452  message WalkFileRequest {
   453      File file = 1;
   454  }
   455  
   456  message GlobFileRequest {
   457    Commit commit = 1;
   458    string pattern = 2;
   459  }
   460  
   461  // FileInfos is the result of both ListFile and GlobFile
   462  message FileInfos {
   463    repeated FileInfo file_info = 1;
   464  }
   465  
   466  message DiffFileRequest {
   467    File new_file = 1;
   468    // OldFile may be left nil in which case the same path in the parent of
   469    // NewFile's commit will be used.
   470    File old_file = 2;
   471    bool shallow = 3;
   472  }
   473  
   474  message DiffFileResponse {
   475    repeated FileInfo new_files = 1;
   476    repeated FileInfo old_files = 2;
   477  }
   478  
   479  message DeleteFileRequest {
   480    File file = 1;
   481  }
   482  
   483  message FsckRequest {
   484    bool fix = 1;
   485  }
   486  
   487  message FsckResponse {
   488    string fix = 1;
   489    string error = 2;
   490  }
   491  
   492  // Messages specific to the new storage layer.
   493  
   494  message PutTarRequest {
   495    Commit commit = 1;
   496    bytes data = 2;
   497  }
   498  
   499  message GetTarRequest {
   500    File file = 1;
   501  }
   502  
   503  service API {
   504    // Repo rpcs
   505    // CreateRepo creates a new repo.
   506    // An error is returned if the repo already exists.
   507    rpc CreateRepo(CreateRepoRequest) returns (google.protobuf.Empty) {}
   508    // InspectRepo returns info about a repo.
   509    rpc InspectRepo(InspectRepoRequest) returns (RepoInfo) {}
   510    // ListRepo returns info about all repos.
   511    rpc ListRepo(ListRepoRequest) returns (ListRepoResponse) {}
   512    // DeleteRepo deletes a repo.
   513    rpc DeleteRepo(DeleteRepoRequest) returns (google.protobuf.Empty) {}
   514  
   515    // Commit rpcs
   516    // StartCommit creates a new write commit from a parent commit.
   517    rpc StartCommit(StartCommitRequest) returns (Commit) {}
   518    // FinishCommit turns a write commit into a read commit.
   519    rpc FinishCommit(FinishCommitRequest) returns (google.protobuf.Empty) {}
   520    // InspectCommit returns the info about a commit.
   521    rpc InspectCommit(InspectCommitRequest) returns (CommitInfo) {}
   522    // ListCommit returns info about all commits. This is deprecated in favor of
   523    // ListCommitStream.
   524    rpc ListCommit(ListCommitRequest) returns (CommitInfos) {}
   525    // ListCommitStream is like ListCommit, but returns its results in a GRPC stream
   526    rpc ListCommitStream(ListCommitRequest) returns (stream CommitInfo) {}
   527    // DeleteCommit deletes a commit.
   528    rpc DeleteCommit(DeleteCommitRequest) returns (google.protobuf.Empty) {}
   529    // FlushCommit waits for downstream commits to finish
   530    rpc FlushCommit(FlushCommitRequest) returns (stream CommitInfo) {}
   531    // SubscribeCommit subscribes for new commits on a given branch
   532    rpc SubscribeCommit(SubscribeCommitRequest) returns (stream CommitInfo) {}
   533    // BuildCommit builds a commit that's backed by the given tree
   534    rpc BuildCommit(BuildCommitRequest) returns (Commit) {}
   535  
   536    // CreateBranch creates a new branch
   537    rpc CreateBranch(CreateBranchRequest) returns (google.protobuf.Empty) {}
   538    // InspectBranch returns info about a branch.
   539    rpc InspectBranch(InspectBranchRequest) returns (BranchInfo) {}
   540    // ListBranch returns info about the heads of branches.
   541    rpc ListBranch(ListBranchRequest) returns (BranchInfos) {}
   542    // DeleteBranch deletes a branch; note that the commits still exist.
   543    rpc DeleteBranch(DeleteBranchRequest) returns (google.protobuf.Empty) {}
   544  
   545    // File rpcs
   546    // PutFile writes the specified file to pfs.
   547    rpc PutFile(stream PutFileRequest) returns (google.protobuf.Empty) {}
   548    // CopyFile copies the contents of one file to another.
   549    rpc CopyFile(CopyFileRequest) returns (google.protobuf.Empty) {}
   550    // GetFile returns a byte stream of the contents of the file.
   551    rpc GetFile(GetFileRequest) returns (stream google.protobuf.BytesValue) {}
   552    // InspectFile returns info about a file.
   553    rpc InspectFile(InspectFileRequest) returns (FileInfo) {}
   554    // ListFile returns info about all files. This is deprecated in favor of
   555    // ListFileStream
   556    rpc ListFile(ListFileRequest) returns (FileInfos) {}
   557    // ListFileStream is a streaming version of ListFile
   558    // TODO(msteffen): When the dash has been updated to use ListFileStream,
   559    // replace ListFile with this RPC (https://github.com/pachyderm/dash/issues/201)
   560    rpc ListFileStream(ListFileRequest) returns (stream FileInfo) {}
   561    // WalkFile walks over all the files under a directory, including children of children.
   562    rpc WalkFile(WalkFileRequest) returns (stream FileInfo) {}
   563    // GlobFile returns info about all files. This is deprecated in favor of
   564    // GlobFileStream
   565    rpc GlobFile(GlobFileRequest) returns (FileInfos) {}
   566    // GlobFileStream is a streaming version of GlobFile
   567    // TODO(msteffen): When the dash has been updated to use GlobFileStream,
   568    // replace GlobFile with this RPC (https://github.com/pachyderm/dash/issues/201)
   569    rpc GlobFileStream(GlobFileRequest) returns (stream FileInfo) {}
   570    // DiffFile returns the differences between 2 paths at 2 commits.
   571    rpc DiffFile(DiffFileRequest) returns (DiffFileResponse) {}
   572    // DeleteFile deletes a file.
   573    rpc DeleteFile(DeleteFileRequest) returns (google.protobuf.Empty) {}
   574  
   575    // DeleteAll deletes everything
   576    rpc DeleteAll(google.protobuf.Empty) returns (google.protobuf.Empty) {}
   577    // Fsck does a file system consistency check for pfs
   578    rpc Fsck(FsckRequest) returns (stream FsckResponse) {}
   579  
   580    // RPCs specific to the new storage layer.
   581    rpc PutTar(stream PutTarRequest) returns (google.protobuf.Empty) {}
   582    rpc GetTar(GetTarRequest) returns (stream google.protobuf.BytesValue) {}
   583  }
   584  
   585  message PutObjectRequest {
   586    bytes value = 1;
   587    repeated Tag tags = 2;
   588    Block block = 3;
   589  }
   590  
   591  message CreateObjectRequest {
   592    Object object = 1;
   593    BlockRef block_ref = 2;
   594  }
   595  
   596  message GetObjectsRequest {
   597    repeated Object objects = 1;
   598    uint64 offset_bytes = 2;
   599    // The number of bytes requested.
   600    uint64 size_bytes = 3;
   601    // The total amount of bytes in these objects.  It's OK if it's not
   602    // entirely accurate or if it's unknown (in which case it'd be set to 0).
   603    // It's used primarily as a hint for cache eviction.
   604    uint64 total_size = 4;
   605  }
   606  
   607  message PutBlockRequest {
   608    Block block = 1;
   609    bytes value = 2;
   610  }
   611  
   612  message GetBlockRequest {
   613    Block block = 1;
   614  }
   615  
   616  message GetBlocksRequest {
   617    repeated BlockRef blockRefs = 1;
   618    uint64 offset_bytes = 2;
   619    // The number of bytes requested.
   620    uint64 size_bytes = 3;
   621    // The total amount of bytes in these blocks.  It's OK if it's not
   622    // entirely accurate or if it's unknown (in which case it'd be set to 0).
   623    // It's used primarily as a hint for cache eviction.
   624    uint64 total_size = 4;
   625  }
   626  
   627  message ListBlockRequest {}
   628  
   629  message TagObjectRequest {
   630    Object object = 1;
   631    repeated Tag tags = 2;
   632  }
   633  
   634  message ListObjectsRequest {}
   635  
   636  message ListTagsRequest {
   637    string prefix = 1;
   638    bool include_object = 2;
   639  }
   640  
   641  message ListTagsResponse {
   642    Tag tag = 1;
   643    Object object = 2;
   644  }
   645  
   646  message DeleteObjectsRequest {
   647    repeated Object objects = 1;
   648  }
   649  
   650  message DeleteObjectsResponse {}
   651  
   652  message DeleteTagsRequest {
   653    repeated Tag tags = 1;
   654  }
   655  
   656  message DeleteTagsResponse {}
   657  
   658  message CheckObjectRequest {
   659    Object object = 1;
   660  }
   661  
   662  message CheckObjectResponse {
   663    bool exists = 1;
   664  }
   665  
   666  message Objects {
   667    repeated Object objects = 1;
   668  }
   669  
   670  message PutObjDirectRequest {
   671      string obj = 1;
   672      bytes value = 2;
   673  }
   674  
   675  message GetObjDirectRequest {
   676      string obj = 1;
   677  }
   678  
   679  service ObjectAPI {
   680    rpc PutObject(stream PutObjectRequest) returns (Object) {}
   681    rpc PutObjectSplit(stream PutObjectRequest) returns (Objects) {}
   682    rpc PutObjects(stream PutObjectRequest) returns (google.protobuf.Empty) {}
   683    rpc CreateObject(CreateObjectRequest) returns (google.protobuf.Empty) {}
   684    rpc GetObject(Object) returns (stream google.protobuf.BytesValue) {}
   685    rpc GetObjects(GetObjectsRequest) returns (stream google.protobuf.BytesValue) {}
   686    rpc PutBlock(stream PutBlockRequest) returns (google.protobuf.Empty) {}
   687    rpc GetBlock(GetBlockRequest) returns (stream google.protobuf.BytesValue) {}
   688    rpc GetBlocks(GetBlocksRequest) returns (stream google.protobuf.BytesValue) {}
   689    rpc ListBlock(ListBlockRequest) returns (stream Block) {}
   690    rpc TagObject(TagObjectRequest) returns (google.protobuf.Empty) {}
   691    rpc InspectObject(Object) returns (ObjectInfo) {}
   692    // CheckObject checks if an object exists in the blob store without
   693    // actually reading the object.
   694    rpc CheckObject(CheckObjectRequest) returns (CheckObjectResponse) {}
   695    rpc ListObjects(ListObjectsRequest) returns (stream ObjectInfo) {}
   696    rpc DeleteObjects(DeleteObjectsRequest) returns (DeleteObjectsResponse) {}
   697    rpc GetTag(Tag) returns (stream google.protobuf.BytesValue) {}
   698    rpc InspectTag(Tag) returns (ObjectInfo) {}
   699    rpc ListTags(ListTagsRequest) returns (stream ListTagsResponse) {}
   700    rpc DeleteTags(DeleteTagsRequest) returns (DeleteTagsResponse) {}
   701    rpc Compact(google.protobuf.Empty) returns (google.protobuf.Empty) {}
   702    // PutObjDirect puts an obj directly into object store, bypassing the content
   703    // addressing layer.
   704    rpc PutObjDirect(stream PutObjDirectRequest) returns (google.protobuf.Empty) {}
   705    // GetObjDirect gets an obj directly out of object store, bypassing the
   706    // content addressing layer.
   707    rpc GetObjDirect(GetObjDirectRequest) returns (stream google.protobuf.BytesValue) {}
   708  }
   709  
   710  message ObjectIndex {
   711    map<string, BlockRef> objects = 1;
   712    map<string, Object> tags = 2;
   713  }
   714