Viewing: api.md

# `rustreapi`

## Creating Files

### `OpenOptions`

```mermaid
classDiagram
    class OpenOptions {
        -bool read
        -bool write
        -bool append
        -bool truncate
        -bool create
        -bool create_new
        -mode_t mode
        -Option~Layout~ layout
        -i32 stripe_size
        -i32 stripe_offset
        -i32 stripe_count
        -i32 stripe_pattern
        -Option~String~ pool
        -bool lov_delay
        -Option~i32~ mdt
        +new() OpenOptions
        +read(bool) OpenOptions
        +write(bool) OpenOptions
        +create(bool) OpenOptions
        +open(Path) Result~File~
        +volatile(Path) Result~File~
    }

    class Fid {
        +to_lu_fid() lu_fid
    }

    class Layout {
        +as_lu_layout() *mut llapi_layout
    }

    OpenOptions --> Layout: uses
    OpenOptions --> File: creates
```

## Opening a File

A sequence diagram of the file open process:

```mermaid
sequenceDiagram
    participant C as Client
    participant O as OpenOptions
    participant L as Layout/Param
    participant A as LustreAPI
    C ->> O: create OpenOptions
    C ->> O: configure options
    C ->> O: open(path)
    alt Has Layout
        O ->> L: Get layout
        O ->> A: llapi_layout_file_open()
    else No Layout
        O ->> L: Create stripe parameter
        O ->> A: llapi_file_open_param()
    end
    A ->> O: Return file descriptor
    O ->> C: Return File
```

## HSM Copytool

This API divides the `lustreapi` copytool into two parts.

- Receive action lists from the Coordinator
- Process actions and send result to the Coordinator

### Receiving Actions

The `Copytool` object wraps a connection to the `HSM` coordinators in each of
the `MDTs.` If the non-blocking option is used when creating the `Copytool,`
then the `raw_fd` can be used to poll in asynchronous code. The `receive()`
method must still be used to fetch the actions, and it will return `EWOUDLBLOCK`
when there are no actions available.

```mermaid
sequenceDiagram
    participant Client
    participant CopytoolBuilder
    participant Copytool
    participant LustreCoordinator
    participant ActionList
    participant ActionItem
    Client ->> Copytool: builder()
    Copytool ->> CopytoolBuilder: default()
    Client ->> CopytoolBuilder: archives([archive_ids])
    Client ->> CopytoolBuilder: non_blocking(true/false)
    Client ->> CopytoolBuilder: register(mount_dir)
    CopytoolBuilder ->> LustreCoordinator: llapi_hsm_copytool_register()
    LustreCoordinator -->> CopytoolBuilder: hsm_copytool_private
    CopytoolBuilder -->> Client: Copytool
    Note over Client: For polling
    Client ->> Copytool: raw_fd()
    Copytool ->> LustreCoordinator: llapi_hsm_copytool_get_fd()
    Copytool -->> Client: RawDescriptor
    Note over Client: Wait for events (polling)
    Client ->> Copytool: receive()
    Copytool ->> LustreCoordinator: llapi_hsm_copytool_recv()
    LustreCoordinator -->> Copytool: hsm_action_list
    Copytool -->> Client: ActionList
    Client ->> ActionList: iter()
    ActionList -->> Client: ActionIterator
    loop For each action
        ActionList ->> ActionItem: next()
        ActionItem -->> Client: ActionItem
        Note over Client: Process action
    end
```

### Data Mover

```mermaid
sequenceDiagram
    participant Client
    participant MoverBuilder
    participant Mover
    participant ProgressBuilder
    participant ActionProgress
    participant LustreCoordinator
    Client ->> MoverBuilder: builder()
    Client ->> MoverBuilder: register(mount_dir)
    MoverBuilder ->> LustreCoordinator: llapi_hsm_mover_register()
    MoverBuilder -->> Client: Mover

    alt Process Action Successfully
        Client ->> ProgressBuilder: action_begin(mover, action_item, flags)
        ProgressBuilder ->> LustreCoordinator: llapi_hsm_action_begin()
        ProgressBuilder -->> Client: ActionProgress
        Client ->> ActionProgress: dfid()
        LustreCoordinator -->> Client: Fid
        Client ->> ActionProgress: data_file()
        LustreCoordinator -->> Client: File
        Note over Client: Process file data
        Client ->> ActionProgress: progress(extent, total, flags)
        ActionProgress ->> LustreCoordinator: llapi_hsm_action_progress()
        Client ->> ActionProgress: end(extent, HP_FLAG_COMPLETED, 0)
        ActionProgress ->> LustreCoordinator: llapi_hsm_action_end()
    else Report Error
        Client ->> ProgressBuilder: action_error(mover, action_item, retry, err_code)
        ProgressBuilder ->> LustreCoordinator: llapi_hsm_action_begin()
        LustreCoordinator -->> ProgressBuilder: ActionProgress
        ProgressBuilder ->> LustreCoordinator: llapi_hsm_action_end()
        ProgressBuilder -->> Client: Result<()>
    end

    Note over Mover: When done
    Client ->> Mover: drop()
    Mover ->> LustreCoordinator: llapi_hsm_mover_unregister()
```