{"id":25953917,"url":"https://github.com/arthur-x/retain","last_synced_at":"2026-05-14T07:32:52.779Z","repository":{"id":59138515,"uuid":"533231607","full_name":"arthur-x/Retain","owner":"arthur-x","description":"A cloud file storage service that allows syncing files across multiple nodes.","archived":false,"fork":false,"pushed_at":"2022-09-12T08:55:38.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-04T15:46:32.781Z","etag":null,"topics":["cloud-storage-services"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arthur-x.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-09-06T08:31:16.000Z","updated_at":"2023-05-29T06:36:41.000Z","dependencies_parsed_at":"2022-09-13T02:20:15.621Z","dependency_job_id":null,"html_url":"https://github.com/arthur-x/Retain","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/arthur-x/Retain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur-x%2FRetain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur-x%2FRetain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur-x%2FRetain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur-x%2FRetain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arthur-x","download_url":"https://codeload.github.com/arthur-x/Retain/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur-x%2FRetain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33015250,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloud-storage-services"],"created_at":"2025-03-04T15:37:56.649Z","updated_at":"2026-05-14T07:32:52.764Z","avatar_url":"https://github.com/arthur-x.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Retain\n\nRetain is a cloud file storage service that lets you sync files across multiple nodes, supporting creation, modification, deletion and fetching specific versions of a file (in progress). Retain is an ongoing extension of the CSE 224 project *Surfstore*.\n\n## Usage\n1. Download and unzip the release. On Linux, run your server using this:\n```shell\nbin/retainServe -s \u003cserviceType\u003e -p \u003cport\u003e -l -d (blockStoreAddr*)\n```\nHere, `service` should be one of three values: meta, block, or both. This is used to specify the service provided by the server. `port` defines the port number that the server listens to (default=8080). `-l` configures the server to only listen on localhost. `-d` configures the server to output log statements. Lastly, (blockStoreAddr\\*) is the BlockStore address that the server is configured with. If `service=both` then the blockStoreAddr should be the `ip:port` of this server.\n\n2. Run your client using this:\n```shell\nbin/retainSync -d \u003chost:port\u003e \u003cbaseDir\u003e \u003cblockSize\u003e\n```\n\n### Examples\n```shell\nbin/retainServe -s both -p 8081 -l localhost:8081\n```\nThis starts a server that listens only to localhost on port 8081 and services both the BlockStore and MetaStore interface.\n\n```shell\nRun the commands below on separate terminals (or nodes)\n\u003e bin/retainServe -s block -p 8081 -l\n\u003e bin/retainServe -s meta -l localhost:8081\n```\nThe first line starts a server that services only the BlockStore interface and listens only to localhost on port 8081. The second line starts a server that services only the MetaStore interface, listens only to localhost on port 8080, and references the BlockStore we created as the underlying BlockStore. (Note: if these are on separate nodes, then you should use the public ip address and remove `-l`)\n\nFrom a new terminal (or a new node), choose a base directory with some files in it.\n```shell\n\u003e mkdir dataA\n\u003e cp ~/pic.jpg dataA/ \n\u003e bin/retainSync server_addr:port dataA 4096\n```\nThis would sync pic.jpg to the server hosted on `server_addr:port`, using `dataA` as the base directory, with a block size of 4096 bytes.\n\nFrom another terminal (or a new node), run the client to sync with the server.\n```shell\n\u003e mkdir dataB\n\u003e bin/retainSync server_addr:port dataB 4096\n\u003e ls dataB/\npic.jpg index.txt\n```\nWe observe that pic.jpg has been synced to this client.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthur-x%2Fretain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farthur-x%2Fretain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthur-x%2Fretain/lists"}