Hi SeungUck,
Mark is exactly right. When we talk about a "blocking" query execution stage, we mean that the algorithm requires retrieval of all the results from the child stage before it can begin returning results. A "blocking query plan" is a plan that includes at least one blocking execution stage. This has nothing to do with locking or latching; that is, when we say a query plan is "blocking", it does not mean that the execution is waiting on a lock manager lock or otherwise sleeping on an operating system wait queue. (In fact, a .find() operation will request an intent shared, or MODE_IS, lock on the collection at the beginning of the operation. Once this lock is granted, there is no further locking and minimal further latching involved in the query engine layer.)
The blocking stages currently implemented in the MongoDB query engine, as you mentioned, are SORT and AND_HASH. SORT does an in-memory sort of the result set, and therefore must buffer the entire result set before sorting it and then returning the results. AND_HASH is hash-based index intersection. It must retrieve all of the results from its first child index scan in order to construct a hash table. The results from the second child index scan are then used to probe this hash table; hits are returned to the parent stage and misses are thrown out.
Non-blocking plans are referred to as "fully pipelined". This means that as soon as the high-level query-running code starts requesting query results in order to copy into the outgoing network message, the matching results can stream through a pipeline of query stages (all the way from the storage-engine access stages at the leaves to the higher-level stages like PROJECTION or LIMIT).
Hope that helps, and happy to answer any further questions.
Best,
Dave