[ 
https://issues.apache.org/jira/browse/HDDS-10634?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sumit Agrawal updated HDDS-10634:
---------------------------------
    Fix Version/s: 1.5.0
       Resolution: Fixed
           Status: Resolved  (was: Patch Available)

> Recon - listKeys API for listing of OBS , FSO and Legacy bucket keys with 
> filters
> ---------------------------------------------------------------------------------
>
>                 Key: HDDS-10634
>                 URL: https://issues.apache.org/jira/browse/HDDS-10634
>             Project: Apache Ozone
>          Issue Type: Sub-task
>          Components: Ozone Recon
>            Reporter: Devesh Kumar Singh
>            Assignee: Devesh Kumar Singh
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.5.0
>
>
> New API:
> api/v1/namespace/listKeys?startPrefix=/volume1/obs-bucket/&limit=105
> h5. Default values of API parameters if not provided:
>  # replicationType - empty/null, so effectively will list all types of keys.
>  # creationTime - empty string and filter will not be applied, so list out 
> keys irrespective of age.
>  # keySize - 0 bytes, which means all keys greater than zero bytes will be 
> listed, effectively all.
>  # startPrefix - /
>  # prevKey - ""
>  # limit - 1000
>  
> h5. Behavior of API:
> Now lets consider, we have following OBS, LEGACY and FSO bucket key/files 
> namespace tree structure
> {{For OBS Bucket}}
>  * /volume1/obs-bucket/key1
>  * /volume1/obs-bucket/key1/key2
>  * /volume1/obs-bucket/key1/key2/key3
>  * /volume1/obs-bucket/key4
>  * /volume1/obs-bucket/key5
>  * /volume1/obs-bucket/key6
> {{For LEGACY Bucket}}
>  * /volume1/legacy-bucket/key
>  * /volume1/legacy-bucket/key1/key2
>  * /volume1/legacy-bucket/key1/key2/key3
>  * /volume1/legacy-bucket/key4
>  * /volume1/legacy-bucket/key5
>  * /volume1/legacy-bucket/key6
> {{For FSO Bucket}}
>  * /volume1/fso-bucket/dir1/dir2/dir3
>  * /volume1/fso-bucket/dir1/testfile
>  * /volume1/fso-bucket/dir1/file1
>  * /volume1/fso-bucket/dir1/dir2/testfile
>  * /volume1/fso-bucket/dir1/dir2/file1
>  * /volume1/fso-bucket/dir1/dir2/dir3/testfile
>  * /volume1/fso-bucket/dir1/dir2/dir3/file1
> *Input Request for OBS bucket:*
>  \{{ 
> `api/v1/keys/listKeys?startPrefix=/volume1/obs-bucket&limit=2&replicationType=RATIS`}}
>  
> *Output Response:*
>  {{{
> "status": "OK",
> "path": "/volume1/obs-bucket",
> "replicatedDataSize": 20971520,
> "unReplicatedDataSize": 20971520,
> "keyCount": 2,
> "lastKey": "/volume1/obs-bucket/key1/key2",
> "keys": [
> {
> "key": "/volume1/obs-bucket/key1",
> "path": "key1",
> "inStateSince": 1715174266126,
> "size": 10485760,
> "replicatedSize": 10485760,
> "replicationInfo":
> { "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" }
> ,
> "creationTime": 1715174266126,
> "modificationTime": 1715174267480,
> "isKey": true
> },
> {
> "key": "/volume1/obs-bucket/key1/key2",
> "path": "key1/key2",
> "inStateSince": 1715174269510,
> "size": 10485760,
> "replicatedSize": 10485760,
> "replicationInfo":
> { "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" }
> ,
> "creationTime": 1715174269510,
> "modificationTime": 1715174270410,
> "isKey": true
> }
> ]
> }}}
>  
> *Input Request for FSO bucket:*
>  \{{ 
> `api/v1/keys/listKeys?startPrefix=/volume1/fso-bucket&limit=2&replicationType=RATIS`}}
>  
> *Output Response:*
>  {{{
> "status": "OK",
> "path": "/volume1/fso-bucket",
> "replicatedDataSize": 62914560,
> "unReplicatedDataSize": 20971520,
> "keyCount": 2,
> "lastKey": 
> "/-9223372036854775552/-9223372036854775040/-9223372036854774525/testfile",
> "keys": [
> {
> "key": 
> "/-9223372036854775552/-9223372036854775040/-9223372036854774525/file1",
> "path": "file1",
> "inStateSince": 1715174237440,
> "size": 10485760,
> "replicatedSize": 31457280,
> "replicationInfo":
> { "replicationFactor": "THREE", "requiredNodes": 3, "replicationType": 
> "RATIS" }
> ,
> "creationTime": 1715174237440,
> "modificationTime": 1715174238161,
> "isKey": true
> },
> {
> "key": 
> "/-9223372036854775552/-9223372036854775040/-9223372036854774525/testfile",
> "path": "testfile",
> "inStateSince": 1715174234840,
> "size": 10485760,
> "replicatedSize": 31457280,
> "replicationInfo":
> { "replicationFactor": "THREE", "requiredNodes": 3, "replicationType": 
> "RATIS" }
> ,
> "creationTime": 1715174234840,
> "modificationTime": 1715174235562,
> "isKey": true
> }
> ]
> }}}
>  
> *Input Request for Legacy bucket:*
>  \{{ 
> `api/v1/keys/listKeys?startPrefix=/volume1/legacy-bucket&limit=2&replicationType=RATIS`}}
>  
> *Output Response:*
>  {{{
> "status": "OK",
> "path": "/volume1/legacy-bucket",
> "replicatedDataSize": 52428800,
> "unReplicatedDataSize": 52428800,
> "keyCount": 2,
> "lastKey": "/volume1/legacy-bucket/key1/key2",
> "keys": [
> {
> "key": "/volume1/legacy-bucket/key1",
> "path": "key1",
> "inStateSince": 1715174303702,
> "size": 10485760,
> "replicatedSize": 10485760,
> "replicationInfo":
> { "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" }
> ,
> "creationTime": 1715174303702,
> "modificationTime": 1715174304619,
> "isKey": true
> },
> {
> "key": "/volume1/legacy-bucket/key1/key2",
> "path": "key1/key2",
> "inStateSince": 1715174306641,
> "size": 41943040,
> "replicatedSize": 41943040,
> "replicationInfo":
> { "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" }
> ,
> "creationTime": 1715174306641,
> "modificationTime": 1715174307994,
> "isKey": true
> }
> ]
> }}}
> h5.     
> This mean, API will apply filters like *{{replicationType}}* , *{{keySize}}*  
> and *{{creationTime}}*  on set of records returned after *{{startPrefix}}* 
> and number of records returned based *limit* value specified.  Pagination 
> support will be based on *prevKey* and *limit.*
> *Pagination:*
> Now lets say we have total 6 records for a given set of filters and params 
> passed and client wants to fetch in total 3 pages , each page 2 records. If 
> each page we will retrieve 2 items, so till we get empty last key, we'll 
> continue to fetch and empty last key signifies the last page.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to