spanner: quieten permission denied errors during session preparation

In contexts such as read-only auth, the probes are expected to fail, and
the logging is rather noisy.

Change-Id: I4f581686c82bd5efe8055f8cfe688289e3f912bd
Reviewed-on: https://code-review.googlesource.com/c/gocloud/+/49311
Reviewed-by: Knut Olav Løite <koloite@gmail.com>
diff --git a/spanner/session.go b/spanner/session.go
index 239fc3f..42a8fea 100644
--- a/spanner/session.go
+++ b/spanner/session.go
@@ -1186,7 +1186,12 @@
 			if err != nil {
 				// Skip handling prepare error, session can be prepared in next
 				// cycle.
-				logf(hc.pool.sc.logger, "Failed to prepare session, error: %v", toSpannerError(err))
+				// Don't log about permission errors, which may be expected
+				// (e.g. using read-only auth).
+				serr := toSpannerError(err).(*Error)
+				if serr.Code != codes.PermissionDenied {
+					logf(hc.pool.sc.logger, "Failed to prepare session, error: %v", serr)
+				}
 			}
 			hc.pool.recycle(ws)
 			hc.pool.mu.Lock()
@@ -1314,7 +1319,12 @@
 			if err = s.prepareForWrite(prepareContext); err != nil {
 				cancel()
 				p.recycle(s)
-				logf(p.sc.logger, "Failed to prepare session, error: %v", toSpannerError(err))
+				// Don't log about permission errors, which may be expected
+				// (e.g. using read-only auth).
+				serr := toSpannerError(err).(*Error)
+				if serr.Code != codes.PermissionDenied {
+					logf(p.sc.logger, "Failed to prepare session, error: %v", serr)
+				}
 				continue
 			}
 			cancel()