Replace |Empty| with |ShufflerResponse|.

It turns out that the so-called "well-known types" of protocol
buffers are not compatible with "Proto-Lite"--they require the
full heavy proto. But we want to use Proto-Lite on the client
device. So we cannot use |Empty| in the Shuffler API.

- I also took the opportunity to fix up some log levels.

Change-Id: I72ab149eeb10018952b086db0cd90aafe50b0ab6
diff --git a/encoder/shuffler_client.cc b/encoder/shuffler_client.cc
index a8bc4d5..80f893c 100644
--- a/encoder/shuffler_client.cc
+++ b/encoder/shuffler_client.cc
@@ -53,7 +53,7 @@
     temp_context.reset(new grpc::ClientContext());
     context = temp_context.get();
   }
-  google::protobuf::Empty resp;
+  shuffler::ShufflerResponse resp;
   return shuffler_stub_->Process(context, encrypted_message, &resp);
 }
 
diff --git a/shuffler/shuffler.proto b/shuffler/shuffler.proto
index 4a15578..8c4a92e 100644
--- a/shuffler/shuffler.proto
+++ b/shuffler/shuffler.proto
@@ -21,11 +21,13 @@
 option go_package = "shuffler";
 
 import "encrypted_message.proto";
-import "google/protobuf/empty.proto";
+
+message ShufflerResponse {
+}
 
 // Interface exported by the Shuffler service.
 service Shuffler {
   // Processes an incoming Envelope from the encoder.
   // The EncryptedMessage should contain the encryption of an |Envelope|.
-  rpc Process(EncryptedMessage) returns (google.protobuf.Empty) {}
+  rpc Process(EncryptedMessage) returns (ShufflerResponse) {}
 }
diff --git a/shuffler/src/dispatcher/dispatcher.go b/shuffler/src/dispatcher/dispatcher.go
index cc04479..35ec7c2 100644
--- a/shuffler/src/dispatcher/dispatcher.go
+++ b/shuffler/src/dispatcher/dispatcher.go
@@ -259,7 +259,7 @@
 			d.analyzerTransport.close()
 		}
 
-		glog.V(4).Infof("Dispatcher sleeping for [%v]...", waitTime)
+		glog.V(5).Infof("Dispatcher sleeping for [%v]...", waitTime)
 		time.Sleep(waitTime)
 
 		if shouldDisconnectWhileSleeping {
@@ -297,7 +297,7 @@
 		panic("Shuffler config is nil.")
 	}
 
-	glog.V(4).Infoln("Start dispatching ...")
+	glog.V(5).Infoln("Start dispatching ...")
 	keys, err := d.store.GetKeys()
 	if err != nil {
 		glog.Errorf("GetKeys() failed with error: %v", err)
@@ -326,7 +326,7 @@
 		// thresholding: We will not dispatch a bucket unless GetNumObservations()
 		// returns a value at least as large as the threshold.
 		bucketSize, err := d.store.GetNumObservations(key)
-		glog.V(4).Infof("Bucket size from store: [%d]", bucketSize)
+		glog.V(5).Infof("Bucket size from store: [%d]", bucketSize)
 		if err != nil {
 			glog.Errorf("GetNumObservations() failed for key: %v with error: %v", key, err)
 			continue
diff --git a/shuffler/src/receiver/receiver.go b/shuffler/src/receiver/receiver.go
index 4580d58..ab067c2 100644
--- a/shuffler/src/receiver/receiver.go
+++ b/shuffler/src/receiver/receiver.go
@@ -30,7 +30,6 @@
 	"time"
 
 	"github.com/golang/glog"
-	"github.com/golang/protobuf/ptypes/empty"
 	"golang.org/x/net/context"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
@@ -73,12 +72,15 @@
 // a random order. During dispatching, the records get sent to Analyzer and
 // deleted from Shuffler.
 func (s *ShufflerServer) Process(ctx context.Context,
-	encryptedMessage *cobalt.EncryptedMessage) (*empty.Empty, error) {
+	encryptedMessage *cobalt.EncryptedMessage) (*shuffler.ShufflerResponse, error) {
 	glog.V(4).Infoln("Process() is invoked.")
 	envelope, err := s.decryptEnvelope(encryptedMessage)
 	if err != nil {
 		return nil, err
 	}
+	if len(envelope.GetBatch()) == 0 {
+			return nil, grpc.Errorf(codes.InvalidArgument, "Empty envelope.")
+	}
 
 	// TODO(ukode): Some notes here for future development:
 	// Check the recipient first. If the request is intended for another Shuffler
@@ -97,7 +99,7 @@
 	}
 
 	glog.V(4).Infoln("Process() done, returning OK.")
-	return &empty.Empty{}, nil
+	return &shuffler.ShufflerResponse{}, nil
 }
 
 // Run serves incoming encoder requests and blocks forever unless a fatal error