X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fcontrol%2Ftransaction.go;h=df4d7db4147a34c101a05330b2d5a3184bb5dd74;hb=a9bf76cb8dec6e52e7699edf1631c214647f8beb;hp=2cc68b1def108891fbd71705c24abc7451d576c3;hpb=60bfcf92de9e13b60acf1fd3e18bfaeb6a2d389b;p=ric-plt%2Fsubmgr.git diff --git a/pkg/control/transaction.go b/pkg/control/transaction.go index 2cc68b1..df4d7db 100644 --- a/pkg/control/transaction.go +++ b/pkg/control/transaction.go @@ -24,55 +24,69 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "strconv" "sync" + "time" ) //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -type TransactionXappKey struct { - RmrEndpoint - Xid string // xapp xid in req -} - -func (key *TransactionXappKey) String() string { - return key.RmrEndpoint.String() + "/" + key.Xid +type TransactionIf interface { + String() string + Release() + SendEvent(interface{}, time.Duration) (bool, bool) + WaitEvent(time.Duration) (interface{}, bool) } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- + type Transaction struct { - mutex sync.Mutex - tracker *Tracker //tracker instance - Subs *Subscription //related subscription - RmrEndpoint RmrEndpoint //xapp endpoint - Mtype int //type of initiating message - Xid string //xapp xid in req - Meid *xapp.RMRMeid //meid transaction related - SubReqMsg *e2ap.E2APSubscriptionRequest //SubReq TODO: maybe own transactions per type - SubRespMsg *e2ap.E2APSubscriptionResponse //SubResp TODO: maybe own transactions per type - SubFailMsg *e2ap.E2APSubscriptionFailure //SubFail TODO: maybe own transactions per type - SubDelReqMsg *e2ap.E2APSubscriptionDeleteRequest //SubDelReq TODO: maybe own transactions per type - Payload []byte //packed message to optimize retransmissions - PayloadLen int //packed message len to optimize retransmissions - RespReceived bool - ForwardRespToXapp bool + mutex sync.Mutex // + Seq uint64 //transaction sequence + tracker *Tracker //tracker instance + Meid *xapp.RMRMeid //meid transaction related + ReqId RequestId // + Mtype int //Encoded message type to be send + Payload *e2ap.PackedData //Encoded message to be send + EventChan chan interface{} } func (t *Transaction) String() string { - t.mutex.Lock() - defer t.mutex.Unlock() - var subId string = "?" - if t.Subs != nil { - subId = strconv.FormatUint(uint64(t.Subs.Seq), 10) + return "trans(" + strconv.FormatUint(uint64(t.Seq), 10) + "/" + t.Meid.RanName + "/" + t.ReqId.String() + ")" +} + +func (t *Transaction) SendEvent(event interface{}, waittime time.Duration) (bool, bool) { + if waittime > 0 { + select { + case t.EventChan <- event: + return true, false + case <-time.After(waittime): + return false, true + } + return false, false + } + t.EventChan <- event + return true, false +} + +func (t *Transaction) WaitEvent(waittime time.Duration) (interface{}, bool) { + if waittime > 0 { + select { + case event := <-t.EventChan: + return event, false + case <-time.After(waittime): + return nil, true + } } - return subId + "/" + t.RmrEndpoint.String() + "/" + t.Xid + event := <-t.EventChan + return event, false } -func (t *Transaction) GetXid() string { +func (t *Transaction) GetReqId() *RequestId { t.mutex.Lock() defer t.mutex.Unlock() - return t.Xid + return &t.ReqId } func (t *Transaction) GetMtype() int { @@ -90,38 +104,94 @@ func (t *Transaction) GetMeid() *xapp.RMRMeid { return nil } -func (t *Transaction) GetSrc() string { +func (t *Transaction) GetPayload() *e2ap.PackedData { t.mutex.Lock() defer t.mutex.Unlock() - return t.RmrEndpoint.String() + return t.Payload } -func (t *Transaction) CheckResponseReceived() bool { +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +type TransactionSubs struct { + Transaction // +} + +func (t *TransactionSubs) String() string { + return "transsubs(" + t.Transaction.String() + ")" +} + +func (t *TransactionSubs) Release() { t.mutex.Lock() - defer t.mutex.Unlock() - if t.RespReceived == false { - t.RespReceived = true - return false + xapp.Logger.Debug("RELEASE %s", t.String()) + t.tracker = nil + t.mutex.Unlock() +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +type TransactionXappKey struct { + RmrEndpoint + Xid string // xapp xid in req +} + +func (key *TransactionXappKey) String() string { + return "transkey(" + key.RmrEndpoint.String() + "/" + key.Xid + ")" +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +type TransactionXapp struct { + Transaction // + XappKey *TransactionXappKey // +} + +func (t *TransactionXapp) String() string { + var transkey string = "transkey(N/A)" + if t.XappKey != nil { + transkey = t.XappKey.String() } - return true + return "transxapp(" + t.Transaction.String() + "/" + transkey + ")" } -func (t *Transaction) RetryTransaction() { +func (t *TransactionXapp) GetEndpoint() *RmrEndpoint { t.mutex.Lock() defer t.mutex.Unlock() - t.RespReceived = false + if t.XappKey != nil { + return &t.XappKey.RmrEndpoint + } + return nil } -func (t *Transaction) Release() { +func (t *TransactionXapp) GetXid() string { t.mutex.Lock() defer t.mutex.Unlock() - if t.Subs != nil { - t.Subs.UnSetTransaction(t) + if t.XappKey != nil { + return t.XappKey.Xid } - if t.tracker != nil { - xappkey := TransactionXappKey{t.RmrEndpoint, t.Xid} - t.tracker.UnTrackTransaction(xappkey) + return "" +} + +func (t *TransactionXapp) GetSrc() string { + t.mutex.Lock() + defer t.mutex.Unlock() + if t.XappKey != nil { + return t.XappKey.RmrEndpoint.String() } - t.Subs = nil + return "" +} + +func (t *TransactionXapp) Release() { + t.mutex.Lock() + xapp.Logger.Debug("RELEASE %s", t.String()) + tracker := t.tracker + xappkey := t.XappKey t.tracker = nil + t.mutex.Unlock() + + if tracker != nil && xappkey != nil { + tracker.UnTrackTransaction(*xappkey) + } }