private void Run() { RSLClient rslClient = new RSLClient(serviceIdentity, "KV", ps.Verbose); Thread.Sleep(3000); Random rng = new Random(); for (int requestNum = 1; true; ++requestNum) { KVRequest request = GetRandomRequest(rng, ps); byte[] requestBytes = request.Encode(); var startTime = HiResTimer.Ticks; byte[] replyBytes = rslClient.SubmitRequest(requestBytes, ps.Verbose); var endTime = HiResTimer.Ticks; KVReply reply = KVReply.Decode(replyBytes, 0); if (ps.PrintRequestsAndReplies) { Console.WriteLine("Received reply of type {0}", reply.ReplyType); if (reply is KVGetFoundReply gfr) { Console.WriteLine("Value obtained for get was {0}", gfr.Val); } } Console.WriteLine("#req {0} {1} {2}", id, requestNum, HiResTimer.TicksToMilliseconds(endTime - startTime)); } }
private void Run() { RSLClient rslClient = new RSLClient(serviceIdentity, "Counter", ps.Verbose); Thread.Sleep(3000); for (int requestNum = 1; true; ++requestNum) { var request = new IncrementRequest(); byte[] requestBytes = request.Encode(); var startTime = HiResTimer.Ticks; byte[] replyBytes = rslClient.SubmitRequest(requestBytes, ps.Verbose); var endTime = HiResTimer.Ticks; var reply = IncrementReply.Decode(replyBytes); if (ps.PrintReplies) { Console.WriteLine("Received increment reply with counter {0}", reply.counterValue); } Console.WriteLine("#req {0} {1} {2}", id, requestNum, HiResTimer.TicksToMilliseconds(endTime - startTime)); } }
public void Experiment() { ulong requestKey; int serverIdx = 0; scheduler = IoScheduler.CreateClient(serviceIdentity.Servers, ps.Verbose); byte[] myPublicKey = IoScheduler.GetCertificatePublicKey(scheduler.MyCert); ulong seqNum = 0; // Test the functionality of the Sharding if (ps.Workload == 'f') { // A delegation can delegate at most 61 keys, so make sure // there can't be that many keys in the range by having the // range be smaller than 61. ulong k_lo = 125; ulong k_hi = 175; requestKey = 150; var recipient = serviceIdentity.Servers[(serverIdx + 1) % serviceIdentity.Servers.Count()]; seqNum++; var msg = new GetRequestMessage(seqNum, myPublicKey, requestKey); this.Send(msg, serviceIdentity.Servers[serverIdx].PublicKey); ReceiveReply(serverIdx, myPublicKey, requestKey, false); seqNum++; Console.WriteLine("Sending a Shard request with a sequence number {0}", seqNum); var shardMessage = new ShardRequestMessage(seqNum, myPublicKey, k_lo, k_hi, recipient.PublicKey); this.Send(shardMessage, serviceIdentity.Servers[serverIdx].PublicKey); ReceiveReply(serverIdx, myPublicKey, requestKey, true); Thread.Sleep(5000); Console.WriteLine("Sending a GetRequest after a Shard, expect a redirect"); seqNum++; msg = new GetRequestMessage(seqNum, myPublicKey, requestKey); this.Send(msg, serviceIdentity.Servers[(serverIdx + 0) % serviceIdentity.Servers.Count()].PublicKey); ReceiveReply(serverIdx, myPublicKey, requestKey, false, expectRedirect: true); Thread.Sleep(5000); Console.WriteLine("Sending a GetRequest after a Shard to the second host, expect a reply"); // Must use sequence number 1 since this is the first message // to this server. msg = new GetRequestMessage(1, myPublicKey, requestKey); this.Send(msg, serviceIdentity.Servers[(serverIdx + 1) % serviceIdentity.Servers.Count()].PublicKey); ReceiveReply((serverIdx + 1) % serviceIdentity.Servers.Count(), myPublicKey, requestKey, false); Console.WriteLine("Successfully received reply"); return; } // Run an actual workload while (true) { seqNum++; var receivedReply = false; requestKey = seqNum % (ulong)ps.NumKeys; MessageBase msg; if (ps.Workload == 'g') { msg = new GetRequestMessage(seqNum, myPublicKey, requestKey); } else { msg = new SetRequestMessage(seqNum, myPublicKey, requestKey, (ulong)ps.ValueSize); } var startTime = HiResTimer.Ticks; this.Send(msg, serviceIdentity.Servers[serverIdx].PublicKey); // Wait for the reply while (!receivedReply) { byte[] bytes = Receive(); if (bytes == null) { //serverIdx = (serverIdx + 1) % serviceIdentity.Servers.Count(); //Console.WriteLine("#timeout; rotating to server {0}", serverIdx); Console.WriteLine("#timeout; retrying {0}", serverIdx); this.Send(msg, serviceIdentity.Servers[serverIdx].PublicKey); continue; } var endTime = HiResTimer.Ticks; if (bytes.Length == 16) { //Ignore acks } else if (bytes.Length >= 56) { var replySeqNum = ExtractBE64(bytes, offset: 8); if (ps.Verbose) { Console.WriteLine("Reply sequence number : {0}", replySeqNum); Console.WriteLine("Client {0}: Sending an ack with sequence number {1} to {2}", id, replySeqNum, serviceIdentity.Servers[serverIdx]); } if (seqNum % 100 == 0) { var ack_msg = new AckMessage(replySeqNum); this.Send(ack_msg, serviceIdentity.Servers[serverIdx].PublicKey); } int publicKeyLength = Convert.ToInt32(ExtractBE64(bytes, offset: 16)); if (bytes.Length < publicKeyLength + 40) { Console.WriteLine("ERROR - Received too-short message (size {0} not long enough for public key of length {1})", bytes.Length, publicKeyLength); } else { var replyKey = ExtractBE64(bytes, offset: 32 + publicKeyLength); // Need to send an ack if (ps.Verbose) { Console.WriteLine("Request key : {0}", requestKey); Console.WriteLine("Reply key : {0}", replyKey); Console.WriteLine("Got packet length: {0}", bytes.Length); } // key is the same as the sequence number if (replyKey == requestKey) { receivedReply = true; Console.WriteLine("#req {0} {1} {2}", id, seqNum, HiResTimer.TicksToMilliseconds(endTime - startTime)); } } } else { Console.WriteLine("Received packet of unexpected length {0}", bytes.Length); } } } }