01: /*
02: * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
03: */
04: package com.tc.object.net;
05:
06: import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
07:
08: import com.tc.net.groups.NodeID;
09: import com.tc.net.protocol.tcm.MessageChannel;
10: import com.tc.stats.counter.Counter;
11: import com.tc.stats.counter.sampled.SampledCounterConfig;
12: import com.tc.stats.counter.sampled.SampledCounterManager;
13:
14: import java.util.Map;
15:
16: /**
17: * A helper class to make accessing channel specific stats objects a little
18: * easier. This class is sorta yucky and definitely will need to evolve
19: */
20: public class ChannelStatsImpl implements ChannelStats {
21:
22: private static final String DSO_STATS_MAP = "dso_stats_map";
23: private static final SampledCounterConfig DEFAULT_CONFIG = new SampledCounterConfig(
24: 1, 300, true, 0L);
25:
26: private final SampledCounterManager counterManager;
27: private final DSOChannelManager channelManager;
28:
29: public ChannelStatsImpl(SampledCounterManager counterManager,
30: DSOChannelManager channelManager) {
31: this .counterManager = counterManager;
32: this .channelManager = channelManager;
33: }
34:
35: public Counter getCounter(MessageChannel channel, String name) {
36: return getCounter(getStatsMap(channel), name);
37: }
38:
39: private Counter getCounter(Map statsMap, String name) {
40: Counter rv = (Counter) statsMap.get(name);
41: if (rv != null)
42: return rv;
43:
44: synchronized (statsMap) {
45: if (statsMap.containsKey(name)) {
46: return (Counter) statsMap.get(name);
47: }
48:
49: // XXX: We'll need a way to override this at some point, we'll probably
50: // want differing configs for the different
51: // counters, and not every counter needs to be one of the sampled type
52: // (probably)
53: rv = counterManager.createCounter(DEFAULT_CONFIG);
54: statsMap.put(name, rv);
55: return rv;
56: }
57:
58: }
59:
60: private static Map getStatsMap(MessageChannel channel) {
61: Map rv = (Map) channel.getAttachment(DSO_STATS_MAP);
62: if (rv != null) {
63: return rv;
64: }
65: channel.addAttachment(DSO_STATS_MAP,
66: new ConcurrentReaderHashMap(), false);
67: return (Map) channel.getAttachment(DSO_STATS_MAP);
68: }
69:
70: public void notifyTransaction(NodeID nodeID) {
71: try {
72: MessageChannel channel = channelManager
73: .getActiveChannel(nodeID);
74: getCounter(channel, TXN_RATE).increment();
75: } catch (NoSuchChannelException e) {
76: //
77: }
78: }
79:
80: }
|