final long now = getNow();
earlyWriteCleanup(now);
markRecordStoreExpirable(ttl);
Record record = records.get(key);
if (record == null) {
value = mapServiceContext.interceptPut(name, null, value);
value = mapDataStore.add(key, value, now);
record = createRecord(key, value, ttl, now);
records.put(key, record);
updateSizeEstimator(calculateRecordHeapCost(record));
} else {
value = mapServiceContext.interceptPut(name, record.getValue(), value);
value = mapDataStore.add(key, value, now);
onStore(record);
updateSizeEstimator(-calculateRecordHeapCost(record));
setRecordValue(record, value, now);
updateSizeEstimator(calculateRecordHeapCost(record));