copy pointer struct from own method

I’m writing my own session handler

session.go

var (
    p   *pool
)

type (
    Session struct {
        sid         string
        lock        sync.Mutex
        closed      bool
        expires     int64
        data        session_data
    }
    
    sessions        map[string]*Session
    
    session_data    map[string]any
)

func init(){
    p = &pool{
        sessions: sessions{},
    }
}

//  Start session and lock for other concurrent requests to read data from the same session
func Start(w http.ResponseWriter, r *http.Request) *Session {
    s, expired := p.get(sid);
    if expired {
        p.delete(sid)
        return nil
    }
    if s != nil {
        return s
    }
}

//  Get session data
func (s *Session) Data() session_data {
    return s.data
}

//  Close session for further writes and release read lock
func (s *Session) Close(){
    if s.Closed() {
        return false
    }
    s.closed    = true;
    
    /*
        How to make this object a copy and detach it from the "pool" ?
    */
    
    s.lock.Unlock()
    return true
}

pool.go

type pool struct {
    lock            sync.RWMutex
    sessions        sessions
}

func (p *pool) get(sid string) (*Session, bool){
    p.lock.RLock()
    defer p.lock.RUnlock()
    s, ok := p.sessions[sid]
    if !ok {
        return nil, false
    }
    s.lock.Lock()
    //  Check if session is expired
    if time_unix() > s.expires {
        s.lock.Unlock()
        return nil, true
    }
    return s, false
}

func (p *pool) set(sid string, s *Session){
    p.lock.Lock()
    defer p.lock.Unlock()
    p.sessions[sid] = s
}

Current design:
There is a mutex on both *pool and *Session. The mutex on the *Session ensures the same session ID can not be fetched from the pool as long it’s already opened.

After the session is closed and the mutex is unlocked the session data is still available.

Problem:
For concurrency performance you want to close the session as quick as possible. After the session is closed the user might still want to fetch the session data. If the user in the meantime has opened the same session in a new request and writes updates then the data in the first request will have inconsistent data.

How is it possible to copy the *Session struct after the session is closed to ensure the data always is consistent and not will be affected from other concurrency requests?

The design (as far I have tested with -race) there should not be any issues. It’s only if the session data is fetched for read-only purposes after it is closed and the session has been opened and modified from another request.

Or is my design “bad” design?

Example:

  • Request A: Starts and closes session
  • Request B: Opens the same session id and writes to the session
  • Request A: Fetches the data with s.Data() but now the data is inconsistent

How to detach the *Session struct from the pool by making the pointer a copy of the one in the session pool?

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật