Nice catch. The max idle time is actually used on the server as well. But it does not really work, because the default are different:
server: maxIdleTime = 2*conf.getInt("ipc.client.connection.maxidletime", 1000);
client: maxIdleTime = conf.getInt("hbase.ipc.client.connection.maxidletime", 10000); //10s
So it means that the server disconnects any client that have not spoken for 2 seconds; while the client pings every 10 seconds.
not as well that one is prefixed by 'hbase.' while the other is not. In 2008 they were sharing the same name then it diverged.
I suppose the code on the server doesn't do much because of this:
protected int thresholdIdleConnections;
thresholdIdleConnections is defaulted to 4000. Likely it never happens, and if it was happening it would not work because of the difference in default values.
I suppose the best way of doing this is: "order the connection not used for at least x seconds, kills some of the oldest".
But, we can say as well that if we're satisfied with the way the server behaves today, we can remove the ping on the client without changing anything in the server: the behavior won't change.