Hard Links

Rule Engine Plugin

June 9-12, 2020

iRODS User Group Meeting 2020

Virtual Event

Kory Draughn

Software Developer

iRODS Consortium

Hard Links

Rule Engine Plugin

Hard Links - Why?

  • Applications such as WinSCP implement some operations using hard links.
  • Provide a generic solution for the community and future projects (e.g. SMBRODS).

What is a hard link?

In Linux, all file information is stored in an i-node.

 

A hard link is the mapping between a filename and an i-node.

 

i-nodes can have multiple hard links.

Hard Link representation in iRODS

A hard link has the following characteristics:

  • All affiliated data objects have different logical paths
  • All affiliated data objects point to the same replica
  • All affiliated data objects have the following AVU:
    • name: irods::hard_link
    • value: <UUID>
    • unit: <resource_id>

 

The (UUID, resource_id) tuple uniquely identifies a hard linked replica.

 

A data object can be a member of multiple hard link groups.

Policy Enforcement Points

  • pep_api_data_obj_rename_pre
  • pep_api_data_obj_trim_pre
  • pep_api_data_obj_unlink_pre
  • pep_api_data_obj_phymv_post

 

Maintaining the behavior of these operations required changes to the Rule Engine Plugin Framework (REPF).

  • RULE_ENGINE_SKIP_OPERATION
    • Instructs the REPF to skip everything following the pre-PEP
    • Allows PEPs to override operations
    • "finally" PEPs are always triggered

Example: Creating a Hard Link

  • Generates new metadata and attaches it to each data object
  • Or, attaches the existing metadata to the newly registered data object
  • Copies all permissions from the source data object to the newly registered data object

Example: Renaming a Hard Link

  • Renaming or moving a hard linked data object only updates the logical path of that data object

 

  • The physical path is never touched

Example: Unlinking a Hard Link

  • The data object being unlinked is a member of two hard link groups

 

  • The targeted data object is unregistered and all metadata is removed from the remaining hard link members

 

  • The result is two data objects without any hard link metadata

Example: Trimming a Hard Link

  • Trimming a hard linked data object never unlinks it

 

  • Replica two is unregistered from the targeted data object

 

  • The metadata shared by the data objects pointing to replica two is removed from both data objects.

$ itrim -n2

Example: Physically moving a hard linked replica

  • The units of the hard link metadata is updated to reference the new resource id

 

  • All data objects in the hard link group are updated to reflect the new location of the replica

$ iphymv -S <src_resource> -R <dst_resource>

Important things to know

  • Never modify the hard link metadata directly
  • Hard links do not track the first data object which referenced the replica
  • "post" PEPs are never triggered when handling a hard linked data object
  • "finally" PEPs are always triggered

Apparently, this is hard 😅!

Since release, we've identified that the plugin needs some additional work to make it play well with others.

 

Some other rule engine plugins depend on the "post" PEP to operate properly.

Questions?

UGM 2020 - Hard Links Rule Engine Plugin

By iRODS Consortium

UGM 2020 - Hard Links Rule Engine Plugin

  • 1,023