Hole at the edge leaves empty faces (boolean difference)
Boolean will break if there are intersecting edges at the cut. In this case there are the edges on both sides of the cylinder and edges of the object you are cutting. They are intersecting and Blender doesn't know what to do with them.

You can fix it by moving the cylinder by a small amount so there are no intersecting edges. If you want exactly half of the cylinder you can rotate the cylinder around z axis by a tiny amount.

It would be create it the boolean modifier was smart enough to reroute the intersecting edges. Maybe it will come sometime in the future but at the moment there will be many cases where you have to fix bad booleans by hand.