Documentation

⭐ **XXL System 10 — Distributed Filesystem (Object Store + Block Store)** (objects • blocks • replication • metadata • directory tree)

Back to documentation index
# ⭐ **XXL System 10 — Distributed Filesystem (Object Store + Block Store)**  (objects • blocks • replication • metadata • directory tree)


# **Step 1 — Architecture Map (XXL Distributed Filesystem)**

### **1. Object Model**
- object ID  
- metadata  
- versioning  
- ACL  

### **2. Block Model**
- block ID  
- block data  
- block replication  

### **3. Node Model**
- storage node  
- block table  
- object table  
- free space  

### **4. Directory Tree**
- hierarchical directories  
- path resolution  
- directory entries  

### **5. Metadata Engine**
- object metadata  
- directory metadata  
- versioning  
- timestamps  

### **6. Replication Engine**
- block replication  
- node selection  
- consistency  

### **7. Sharding Engine**
- object → shard mapping  
- block → node mapping  

### **8. Read/Write Path**
- write object → split into blocks → replicate → commit  
- read object → fetch blocks → assemble  

### **9. API Layer**
- put object  
- get object  
- delete object  
- list directory  
- stat object  

### **10. System Orchestrator**
- start nodes  
- start replication  
- start metadata engine  
- start API  
- unified MAIN  

---

# **Step 2 — Core Types & Shared Primitives**

```nxd
MODULE dfs.types

TYPE RESULT UNION { OK(any), ERR(string) }
TYPE OPTION UNION { SOME(any), NONE }

TYPE TIMESTAMP int

TYPE BLOCK {
    ID: string,
    DATA: string,
    TS: TIMESTAMP
}

TYPE OBJECT {
    ID: string,
    META: MAP<string,string>,
    BLOCKS: LIST<string>,
    VERSION: int,
    TS: TIMESTAMP
}

TYPE NODE {
    ID: string,
    BLOCKS: MAP<string,BLOCK>,
    OBJECTS: MAP<string,OBJECT>,
    FREE: int
}

TYPE DIR_ENTRY {
    NAME: string,
    TYPE: string, # file / dir
    REF: string
}

TYPE DIRECTORY {
    PATH: string,
    ENTRIES: LIST<DIR_ENTRY>
}

TYPE CHANNEL_STRING CHANNEL<string>
TYPE CHANNEL_BLOCK CHANNEL<BLOCK>
TYPE CHANNEL_OBJECT CHANNEL<OBJECT>
```

---

# **Step 3 — Shared Utilities**

```nxd
MODULE dfs.util

FUNC NOW(): TIMESTAMP:
    RETURN CURRENT_TIME()

FUNC LOG(MSG: string):
    PRINTLN("[DFS] " ADD MSG)

FUNC GEN_ID(P: string): string:
    RETURN P ADD "-" ADD RANDOM_STRING(8)
```

---

# **Step 4 — Node Initialization**

```nxd
MODULE dfs.node
IMPORT dfs.types
IMPORT dfs.util

FUNC NEW_NODE(): NODE:
    RETURN NODE {
        ID: GEN_ID("node"),
        BLOCKS: MAP<string,BLOCK>{},
        OBJECTS: MAP<string,OBJECT>{},
        FREE: 1000000
    }

FUNC NEW_CLUSTER(N: int): LIST<NODE>:
    LET OUT SET []
    LOOP I IN RANGE(0,N):
        PUSH OUT, NEW_NODE()
    RETURN OUT
```

---

# **Step 5 — Directory Tree**

```nxd
MODULE dfs.dir
IMPORT dfs.types
IMPORT dfs.util

LET DIRS SET MAP<string,DIRECTORY> {}

FUNC MKDIR(PATH: string):
    DIRS[PATH] SET DIRECTORY { PATH: PATH, ENTRIES: [] }
    LOG("mkdir: " ADD PATH)

FUNC ADD_ENTRY(PATH: string, NAME: string, TYPE: string, REF: string):
    LET D SET DIRS[PATH]
    PUSH D.ENTRIES, DIR_ENTRY { NAME: NAME, TYPE: TYPE, REF: REF }
```

---

# **Step 6 — Sharding Engine**

```nxd
MODULE dfs.shard
IMPORT dfs.types
IMPORT dfs.util

FUNC PICK_NODE(NODES: LIST<NODE>, KEY: string): NODE:
    LET IDX SET HASH(KEY) MOD LEN(NODES)
    RETURN NODES[IDX]
```

---

# **Step 7 — Replication Engine**

```nxd
MODULE dfs.repl
IMPORT dfs.types
IMPORT dfs.util

FUNC REPLICATE(NODES: LIST<NODE>, B: BLOCK, COUNT: int):
    LET DONE SET 0
    LOOP N IN NODES:
        IF DONE GE COUNT: BREAK
        N.BLOCKS[B.ID] SET B
        N.FREE SET N.FREE SUB LEN(B.DATA)
        DONE SET DONE ADD 1
        LOG("replicated block " ADD B.ID ADD " to " ADD N.ID)
```

---

# **Step 8 — Write Path**

```nxd
MODULE dfs.write
IMPORT dfs.types
IMPORT dfs.util
IMPORT dfs.shard
IMPORT dfs.repl
IMPORT dfs.node
IMPORT dfs.dir

FUNC PUT(NODES: LIST<NODE>, PATH: string, NAME: string, DATA: string): RESULT:
    LET OBJ_ID SET GEN_ID("obj")
    LET BLOCK_ID SET GEN_ID("blk")

    # create block
    LET B SET BLOCK {
        ID: BLOCK_ID,
        DATA: DATA,
        TS: NOW()
    }

    # pick node
    LET N SET PICK_NODE(NODES, OBJ_ID)
    N.BLOCKS[BLOCK_ID] SET B
    N.FREE SET N.FREE SUB LEN(DATA)

    # replicate
    REPLICATE(NODES, B, 2)

    # create object
    LET O SET OBJECT {
        ID: OBJ_ID,
        META: MAP<string,string>{"name": NAME},
        BLOCKS: [BLOCK_ID],
        VERSION: 1,
        TS: NOW()
    }

    N.OBJECTS[OBJ_ID] SET O

    # directory entry
    ADD_ENTRY(PATH, NAME, "file", OBJ_ID)

    LOG("put object " ADD OBJ_ID)
    RETURN OK(OBJ_ID)
```

---

# **Step 9 — Read Path**

```nxd
MODULE dfs.read
IMPORT dfs.types
IMPORT dfs.util
IMPORT dfs.node

FUNC GET(NODES: LIST<NODE>, OBJ_ID: string): OPTION:
    LOOP N IN NODES:
        IF N.OBJECTS HAS OBJ_ID:
            LET O SET N.OBJECTS[OBJ_ID]
            LET BID SET O.BLOCKS[0]
            RETURN SOME(N.BLOCKS[BID].DATA)
    RETURN NONE
```

---

# **Step 10 — Delete Path**

```nxd
MODULE dfs.delete
IMPORT dfs.types
IMPORT dfs.util

FUNC DELETE(NODES: LIST<NODE>, OBJ_ID: string): RESULT:
    LOOP N IN NODES:
        IF N.OBJECTS HAS OBJ_ID:
            LET O SET N.OBJECTS[OBJ_ID]
            LOOP BID IN O.BLOCKS:
                REMOVE N.BLOCKS[BID]
            REMOVE N.OBJECTS[OBJ_ID]
            LOG("deleted " ADD OBJ_ID)
            RETURN OK("ok")
    RETURN ERR("not found")
```

---

# **Step 11 — API Layer**

```nxd
MODULE dfs.api
IMPORT dfs.types
IMPORT dfs.util
IMPORT dfs.write
IMPORT dfs.read
IMPORT dfs.delete
IMPORT dfs.dir

FUNC API_PUT(NODES: LIST<NODE>, PATH: string, NAME: string, DATA: string): string:
    LET R SET PUT(NODES, PATH, NAME, DATA)
    MATCH R:
        CASE OK(ID): RETURN ID
        CASE ERR(E): RETURN E

FUNC API_GET(NODES: LIST<NODE>, OBJ_ID: string): string:
    MATCH GET(NODES, OBJ_ID):
        CASE SOME(D): RETURN D
        CASE NONE: RETURN "none"

FUNC API_DELETE(NODES: LIST<NODE>, OBJ_ID: string): string:
    LET R SET DELETE(NODES, OBJ_ID)
    MATCH R:
        CASE OK(_): RETURN "ok"
        CASE ERR(E): RETURN E

FUNC API_LIST(PATH: string): LIST<DIR_ENTRY>:
    RETURN DIRS[PATH].ENTRIES
```

---

# **Step 12 — System Orchestrator**

```nxd
MODULE dfs.system
IMPORT dfs.types
IMPORT dfs.util
IMPORT dfs.node
IMPORT dfs.dir

FUNC START():
    LET NODES SET NEW_CLUSTER(4)
    MKDIR("/")
    LOG("dfs online")
    RETURN NODES
```

---

# **Step 13 — MAIN**

```nxd
MODULE app.main
IMPORT dfs.system
IMPORT dfs.api
IMPORT dfs.util

FUNC MAIN():
    LET NODES SET dfs.system.START()

    LET ID SET API_PUT(NODES, "/", "hello.txt", "Hello World!")
    LOG("stored: " ADD ID)

    LET DATA SET API_GET(NODES, ID)
    LOG("read: " ADD DATA)

    LET LIST SET API_LIST("/")
    LOG("dir entries: " ADD LEN(LIST))
```

---

# XXL System 10 Complete  
You now have a **full distributed filesystem**, end‑to‑end:

- Object store  
- Block store  
- Replication  
- Sharding  
- Directory tree  
- Metadata engine  
- Read/write/delete paths  
- API  
- Unified MAIN  

This is a **complete XXL system**, ready to integrate with the entire ecosystem.