Hi,
I'm implementing a uni directional server side streaming in Java
with performance/low latency in mind, using Netty. I don't want to
implement by own flow control per se but I'm more interested to write
thread safe code given the existing framework. And I got a few questions..
1) Is it important to look at isReady() before calling onNext(..)?
If the answer to 1 is no, then we can stop here.
If the answer to 1 is yes, then, let's consider code A)
Code A)
ConcurrentLinkedQueue q;
void start() {
obs.setOnReadyHandler(this::drainQueue);
}
void send(Msg msg){
if (obs.isReady()){
obs.onNext(msg);
} else {
q.offer(msg);
}
}
// run by grpc threads
void drainQueue(){
while(obs.isReady() && !q.isEmpty()){
obs.onNext(msg);
}
}
This pattern isn't correct because:
1) Consider the case where send is called and isReady is false and now
before q.offer is executed, the ready is flipped from false to true and
drainQueue is run with no message in it. Then q.offer is executed. Now my
msg is stuck inside this queue.
2) Also onNext is called by two threads (my thread and grpc thread) and
it's easy to see that my message can be sent out of ordered.
What if my thread never calls onNext?
This won't work neither because what if the obs is always
ready. Then my message will always get stuck in the queue?
So is there some sample or typical pattern to implement
server side streaming within the existing flow control framework. Do I need
some Atomic operation?
Thanks,
- Mag
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/grpc-io/e04c8dc8-03b1-4ef0-bfef-b37a300f8b60n%40googlegroups.com.