public void setValue(RecordKey skey, RecordUpdate supdate)
{
checkActive();
// (1) write our repl log entry
DateTime now = DateTime.Now;
long logstamp = id_gen.nextTimestamp();
RecordKey logkey = new RecordKey()
.appendKeyPart("_logs")
.appendKeyPart(ctx.server_guid)
.appendKeyPart(new RecordKeyType_Long(logstamp));
// (1.1) pack the key/value together into the log entry
byte[] packed_update;
{
MemoryStream writer = new MemoryStream();
// TODO: this seems like a really inefficient way to write out a key
ISegmentBlockEncoder encoder = new SegmentBlockBasicEncoder();
encoder.setStream(writer);
encoder.add(skey, supdate);
encoder.flush();
packed_update = writer.ToArray();
}
RecordUpdate logupdate = RecordUpdate.WithPayload(packed_update);
Console.WriteLine("writing log entry: {0} -> [ {1} = {2} ]",
logkey, skey, supdate);
next_stage.setValue(logkey, logupdate);
// (2) trigger the repl notifier that there is a new entry to push
pusher.wakeUpLogSleepers();
// (2) write the record key
Console.WriteLine("writing data entry: {0} = {1}",
skey, supdate);
RecordKey private_record_key = new RecordKey()
.appendKeyPart("_data");
foreach (var part in skey.key_parts) {
private_record_key.appendKeyPart(part);
}
next_stage.setValue(private_record_key, supdate);
}