Tigris Data

Tigris Data

@tigrisdata.com

Tigris is a globally distributed S3-compatible object storage service that provides low latency anywhere in the world. | https://tigrisdata.com | Based in SFO

233 followers375 following453 posts

The core parts of relational databases are transactions, tables, and indices. At Tigris we use a non-relational database (FoundationDB) but still have indices. How did we do it? We made our own!

Hey all, we have more updates on objgit! Looks like it's taking off amidst other companies making git services for some reason. Again, really have to wonder what that's all about.

View full thread

Hey all, we have more updates on objgit! Looks like it's taking off amidst other companies making git services for some reason. Again, really have to wonder what that's all about.

View full thread

We want to make something for your private repos to stay that: private. You don't want to have to be woken up because some scraper decided your git repos were fresh tokens ripe for training.

We also want you to be able to SSH into and script your git server instead of having to hack around it with CI. Everything is sandboxed with userspace shells and WebAssembly. Webhooks? We got em. Example code is forthcoming.

Hey all, we have more updates on objgit! Looks like it's taking off amidst other companies making git services for some reason. Again, really have to wonder what that's all about.

Either way, we don't want to build another git forge with objgit, we want to build a git *server*. The idea is that a git server that grows with you instead of you having to grow around it.

Tigris is basically a database company that turned into an object storage company, so we have a lot of opinions about what you can do with them. We use FoundationDB as the backbone of our business. Wouldn't it be great to insert message queue items in the same transaction as inserting data?

View full thread

We fixed that by adding Kafka to the stack. Kafka has a...reputation for being a bit grotestue in the infrastructure side of things (the zookeeper can't even pet the animals 😔), but we've found that using it means we take write pressure off of FoundationDB so the servers stay up.

Tigris is basically a database company that turned into an object storage company, so we have a lot of opinions about what you can do with them. We use FoundationDB as the backbone of our business. Wouldn't it be great to insert message queue items in the same transaction as inserting data?

View full thread

In a slightly dystopian bent, workers own no jobs yet still will be happy as they lease them from the queue by pushing them forward into the future such that other workers don't try to pick them up.

Either way, this queue system has worked great for us but we ran into one small problem: customers love our product too much which means we hit a FoundationDB write pressure threshold just high enough it was causing production issues. Oops!

Tigris is basically a database company that turned into an object storage company, so we have a lot of opinions about what you can do with them. We use FoundationDB as the backbone of our business. Wouldn't it be great to insert message queue items in the same transaction as inserting data?

Obviously when we needed a message queue we started by reading a paper by Apple about how they turned FoundationDB into what basically amounts to Kafka. This gives us reliable delivery and scheduling in the same lines of code. It's kinda remarkable how simple it is: jobs identify when they are run.

If a job finishes instantly, that's great. The job reaches message queue enlightenment and re-enters the cosmic background radiation until its time is needed next. If not, the job is trapped in a near endless cycle of rebirth bouncing between workers until one doesn't crash this time, we hope.

If our objgit post was so good last time, where's objgit post 2? Today we have an update on the epic saga of Xe reinventing Git storage on top of object storage: making seek-native packfiles. What does this mean? Well, git is complicated. Huddle into this thread!

tigrisdata.comYou can run git on object storage if you re-make packfiles | Tigris Object StorageGit packfiles were designed for mmap and local disk, so pulling one object out of a bucket means guessing at a byte range. I wrote a new format instead.
View full thread

So Xe invented a new brave format that does store enough information to construct ranged get requests. This ended up making Git object storage on top of Tigris object storage upwards of 4.5-14.6 times faster than the old approach of badly adapting filesystem interfaces to Tigris.

If our objgit post was so good last time, where's objgit post 2? Today we have an update on the epic saga of Xe reinventing Git storage on top of object storage: making seek-native packfiles. What does this mean? Well, git is complicated. Huddle into this thread!

tigrisdata.comYou can run git on object storage if you re-make packfiles | Tigris Object StorageGit packfiles were designed for mmap and local disk, so pulling one object out of a bucket means guessing at a byte range. I wrote a new format instead.
View full thread

Those objects end up being fairly small, so you'd think "oh, Tigris is good at small objects, I can just put every object into Tigris and then everything will be fine forever with free happy puppies, right?" Turns out, not really because light is only so fast.

Git works around this by packing objects into packfiles. Packfiles are a bunch of objects concatentated together with an index telling you where to look to get any object in particular. The only downside is that Git packfile indices don't give enough information to construct ranged get requests.

If our objgit post was so good last time, where's objgit post 2? Today we have an update on the epic saga of Xe reinventing Git storage on top of object storage: making seek-native packfiles. What does this mean? Well, git is complicated. Huddle into this thread!

tigrisdata.comYou can run git on object storage if you re-make packfiles | Tigris Object StorageGit packfiles were designed for mmap and local disk, so pulling one object out of a bucket means guessing at a byte range. I wrote a new format instead.

A terrible way to think about Git is that it tracks the changes made to an empty folder and through those changes you reconstruct the history of your application's source code.

This is partially a lie because Git tracks the _entire file_ at any given point in history. Every copy of all of those versions of all of those files are stored in objects which are named after the checksum of their contents (content-aware storage).

An agent can run off a VM image that is larger than the disk it runs on. AgentENV by KVCache.AI keeps microVM disk images in object storage and pulls down only the blocks each machine actually needs. That is how image size stops being limited by local disk.

𝗪𝗵𝘆 𝗽𝘂𝘁 𝗮𝗴𝗲𝗻𝘁 𝘀𝗮𝗻𝗱𝗯𝗼𝘅 𝘀𝘁𝗮𝘁𝗲 𝗶𝗻 𝗼𝗯𝗷𝗲𝗰𝘁 𝘀𝘁𝗼𝗿𝗮𝗴𝗲? For one sandbox on one machine, a host mount is fine. It starts to matter 𝘄𝗵𝗲𝗻 𝘆𝗼𝘂 𝗿𝘂𝗻 𝗮 𝗳𝗹𝗲𝗲𝘁, where sandboxes are created and destroyed constantly and land on whichever node has room.

cubesandbox.comTigris Volume Integration Guide | CubeSandboxInstant, Concurrent, Secure & Lightweight Sandbox Service for AI Agents
View full thread

1. With a volume plugin, 𝗰𝗿𝗲𝗱𝗲𝗻𝘁𝗶𝗮𝗹𝘀 𝗻𝗲𝘃𝗲𝗿 𝗲𝗻𝘁𝗲𝗿 𝘁𝗵𝗲 𝘀𝗮𝗻𝗱𝗯𝗼𝘅 and isolation is stronger. The keys stay in a root-owned config on the host. 2. Since mounts are reference-counted per node, 𝗼𝗻𝗲 𝗱𝗮𝘁𝗮𝘀𝗲𝘁 𝘀𝗲𝗿𝘃𝗲𝘀 𝗺𝗮𝗻𝘆 𝘀𝗮𝗻𝗱𝗯𝗼𝘅𝗲𝘀. Model weights mount read-only into every agent on a box from a single copy.

𝗪𝗵𝘆 𝗽𝘂𝘁 𝗮𝗴𝗲𝗻𝘁 𝘀𝗮𝗻𝗱𝗯𝗼𝘅 𝘀𝘁𝗮𝘁𝗲 𝗶𝗻 𝗼𝗯𝗷𝗲𝗰𝘁 𝘀𝘁𝗼𝗿𝗮𝗴𝗲? For one sandbox on one machine, a host mount is fine. It starts to matter 𝘄𝗵𝗲𝗻 𝘆𝗼𝘂 𝗿𝘂𝗻 𝗮 𝗳𝗹𝗲𝗲𝘁, where sandboxes are created and destroyed constantly and land on whichever node has room.

cubesandbox.comTigris Volume Integration Guide | CubeSandboxInstant, Concurrent, Secure & Lightweight Sandbox Service for AI Agents

How does Tigris work? What are the moving parts? Today we have a transcript of our CTO Himank's talk about how Tigris works at a high level and how FoundationDB makes it possible.

Delete doesn't have to mean the data is gone. Tigris lets you un-delete your most precious objects and buckets if you(r agent) didn't really mean to actually remove it for others.

If you use RAGFlow by InfiniFlow to answer questions from your documents, everything it knows lives in its storage backend. By default, if you use MiniIO, RAGFlow re-reads your corpus every time you tune it.

@apache.org OpenDAL fully supports Tigris Data. This storage layer with one API across 50+ backends, in 17 languages. Tigris config is just three lines. Get the benefit of multi-region workers, with no cross-region egress charges and no per-region bucket topology to maintain.

1/ The era of manual install scripts for Blessed Frameworks™ is over. New post on `tigris init --agent` and why agent-native onboarding is becoming the baseline.

View full thread

8/ So tigris init has two doors. The wizard for humans in a shell, where installing to an agent is safe because the agent hasn't started. The --agent recipe in plain text, because text is the only thing that works reliably from inside a session.

1/ The era of manual install scripts for Blessed Frameworks™ is over. New post on `tigris init --agent` and why agent-native onboarding is becoming the baseline.

View full thread

6/ "Ask before creating access keys" beats "don't create access keys silently." Prohibitions get unreliable when they're buried far upstream of the action. But positive phrasing is a reliability technique. Magic adverbs are not a security mechanism.

7/ Lesson learned the hard way: agents can't install their own config. I shipped skills, the agent installed them, and then behaved like nothing changed. Skills are executable code and the agent can't tell your integration from a crypto miner.

1/ The era of manual install scripts for Blessed Frameworks™ is over. New post on `tigris init --agent` and why agent-native onboarding is becoming the baseline.

View full thread

4/ The agent needs none of that. Worst case it explores the repo and figures out how you build and deploy. Give it the goal, not the mechanism.

5/ Four things decide whether the prompt works: ask permission before acting, prefer heuristics over mandates, keep credentials out of the context window, phrase everything positively.

1/ The era of manual install scripts for Blessed Frameworks™ is over. New post on `tigris init --agent` and why agent-native onboarding is becoming the baseline.

2/ Your onboarding funnels people into two buckets: users of the framework you picked, and everyone else. Everyone else gets the API reference and good luck. I've been everyone else. I closed the tab.

3/ A portable setup script has to identify the language, the dependency manager, and which dependency manager wins when a project has three. Then be right about every OS and CI environment. Every failure is a support ticket.

If you use dlt by dltHub to move data, you can set up the pipeline to save your results into a cloud storage bucket that everything else reads from. Most teams put that bucket on AWS, right next to the pipeline. However, when something reads the data back, AWS charges an egress fee.