X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fcontrol%2Ftransaction.go;h=a0a260f5f20df41d76d0e830824d75c67a2c5df2;hb=422d018f94aedd9f4c001176b5ff06c786de28eb;hp=9adaeca6067090c1cfeb99fef9f11263fa9cb5e1;hpb=31797b49985822f1d402501f16ab2794838bebba;p=ric-plt%2Fsubmgr.git diff --git a/pkg/control/transaction.go b/pkg/control/transaction.go index 9adaeca..a0a260f 100644 --- a/pkg/control/transaction.go +++ b/pkg/control/transaction.go @@ -20,13 +20,75 @@ package control import ( - "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/packer" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "strconv" "sync" + "time" ) +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- + +type TransactionBase struct { + mutex sync.Mutex // + Seq uint64 // + tracker *Tracker //tracker instance + Meid *xapp.RMRMeid //meid transaction related + Mtype int //Encoded message type to be send + Payload *packer.PackedData //Encoded message to be send + EventChan chan interface{} +} + +func (t *TransactionBase) 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 *TransactionBase) WaitEvent(waittime time.Duration) (interface{}, bool) { + if waittime > 0 { + select { + case event := <-t.EventChan: + return event, false + case <-time.After(waittime): + return nil, true + } + } + event := <-t.EventChan + return event, false +} + +func (t *TransactionBase) GetMtype() int { + t.mutex.Lock() + defer t.mutex.Unlock() + return t.Mtype +} + +func (t *TransactionBase) GetMeid() *xapp.RMRMeid { + t.mutex.Lock() + defer t.mutex.Unlock() + if t.Meid != nil { + return t.Meid + } + return nil +} + +func (t *TransactionBase) GetPayload() *packer.PackedData { + t.mutex.Lock() + defer t.mutex.Unlock() + return t.Payload +} + //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- @@ -43,30 +105,16 @@ func (key *TransactionXappKey) String() string { // //----------------------------------------------------------------------------- type Transaction struct { - mutex sync.Mutex - tracker *Tracker //tracker instance - Subs *Subscription //related subscription - RmrEndpoint RmrEndpoint //xapp endpoint - 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 - SubDelRespMsg *e2ap.E2APSubscriptionDeleteResponse //SubDelResp TODO: maybe own transactions per type - SubDelFailMsg *e2ap.E2APSubscriptionDeleteFailure //SubDelFail TODO: maybe own transactions per type - Mtype int //Encoded message type to be send - Payload *packer.PackedData //Encoded message to be send - RespReceived bool - ForwardRespToXapp bool + TransactionBase // + XappKey *TransactionXappKey // } func (t *Transaction) StringImpl() string { - var subId string = "?" - if t.Subs != nil { - subId = strconv.FormatUint(uint64(t.Subs.Seq), 10) + var transkey string = "transkey(N/A)" + if t.XappKey != nil { + transkey = t.XappKey.String() } - return "trans(" + t.RmrEndpoint.String() + "/" + t.Xid + "/" + t.Meid.RanName + "/" + subId + ")" + return "trans(" + strconv.FormatUint(uint64(t.Seq), 10) + "/" + t.Meid.RanName + "/" + transkey + ")" } func (t *Transaction) String() string { @@ -75,62 +123,42 @@ func (t *Transaction) String() string { return t.StringImpl() } -func (t *Transaction) GetXid() string { +func (t *Transaction) GetEndpoint() *RmrEndpoint { t.mutex.Lock() defer t.mutex.Unlock() - return t.Xid -} - -func (t *Transaction) GetMtype() int { - t.mutex.Lock() - defer t.mutex.Unlock() - return t.Mtype -} - -func (t *Transaction) GetMeid() *xapp.RMRMeid { - t.mutex.Lock() - defer t.mutex.Unlock() - if t.Meid != nil { - return t.Meid + if t.XappKey != nil { + return &t.XappKey.RmrEndpoint } return nil } -func (t *Transaction) GetSrc() string { - t.mutex.Lock() - defer t.mutex.Unlock() - return t.RmrEndpoint.String() -} - -func (t *Transaction) CheckResponseReceived() bool { +func (t *Transaction) GetXid() string { t.mutex.Lock() defer t.mutex.Unlock() - if t.RespReceived == false { - t.RespReceived = true - return false + if t.XappKey != nil { + return t.XappKey.Xid } - return true + return "" } -func (t *Transaction) RetryTransaction() { +func (t *Transaction) GetSrc() string { t.mutex.Lock() defer t.mutex.Unlock() - t.RespReceived = false + if t.XappKey != nil { + return t.XappKey.RmrEndpoint.String() + } + return "" } func (t *Transaction) Release() { t.mutex.Lock() - subs := t.Subs + xapp.Logger.Debug("Transaction: Release %s", t.StringImpl()) tracker := t.tracker - xappkey := TransactionXappKey{t.RmrEndpoint, t.Xid} - t.Subs = nil + xappkey := t.XappKey t.tracker = nil t.mutex.Unlock() - if subs != nil { - subs.UnSetTransaction(t) - } - if tracker != nil { - tracker.UnTrackTransaction(xappkey) + if tracker != nil && xappkey != nil { + tracker.UnTrackTransaction(*xappkey) } }