• Steven Allen's avatar
    remove ThreadSafeDatastore · 9f529bc3
    Steven Allen authored
    It's a lie! We:
    
    1. Assume that our datastores are thread-safe all over the place, not bothering
       to check for this interface.
    2. Implement this interface for, e.g., the mount datastore that _may not_ be
       thread-safe (depending on the sub-datastores).
    
    Basically, there's no sane way to to do something like this in go. What we
    _want_ is:
    
    ```rust
    pub trait ThreadSafe {}
    
    struct MyWrapper<D: Datastore> { ... }
    
    impl<D: Datastore> ThreadSafe for MyWrapper<D> where D: ThreadSafe {}
    ```
    
    Actually, we don't even need this because rust has already done all the hard
    work with the `Sync` trait.
    
    ....
    
    But we're using go which barely has types.
    
    ---
    
    For completeness, it's actually possible to do this in go:
    
    ```go
    type threadSafeMixin struct{}
    func (threadSafeMixin) ThreadSafe() {}
    
    func NewWrapper(d Datastore) Datastore {
      if _, ok := d.(ThreadSafe) {
        return &struct{myWrapper, threadSafeMixin}{myWrapper{d}, threadSafeMixin{}}
      }
      return &myWrapper{d}
    }
    ```
    
    Let's not.
    9f529bc3
mount.go 6.5 KB