Search in sources :

Example 1 with SentinalPacket

use of edu.umass.cs.gnsserver.gnsapp.packet.admin.SentinalPacket in project GNS by MobilityFirst.

the class AdminListener method handlePacket.

/**
   * Handle an incoming admin packet.
   *
   * @param incomingJSON
   * @param incomingSocket
   * @param handler
   */
public void handlePacket(JSONObject incomingJSON, Socket incomingSocket, ClientRequestHandlerInterface handler) {
    try {
        switch(Packet.getPacketType(incomingJSON)) {
            case DUMP_REQUEST:
                DumpRequestPacket<String> dumpRequestPacket = new DumpRequestPacket<>(incomingJSON, handler.getGnsNodeConfig());
                if (dumpRequestPacket.getPrimaryNameServer() == null) {
                    // OUTGOING - multicast it to all the nameservers
                    int id = dumpRequestPacket.getId();
                    ClientCommandProcessorConfig.getLogger().info("ListenerAdmin: Dump request from local server");
                    JSONObject json = dumpRequestPacket.toJSONObject();
                    Set<String> serverIds = handler.getNodeConfig().getActiveReplicas();
                    //Set<NodeIDType> serverIds = handler.getGnsNodeConfig().getNodeIDs();
                    replicationMap.put(id, serverIds.size());
                    Packet.multicastTCP(handler.getGnsNodeConfig(), serverIds, json, 2, PortOffsets.SERVER_ADMIN_PORT, null);
                    ClientCommandProcessorConfig.getLogger().log(Level.INFO, "ListenerAdmin: Multicast out to {0} hosts for {1} --> {2}", new Object[] { serverIds.size(), id, dumpRequestPacket.toString() });
                } else {
                    // INCOMING - send it out to original requester
                    DumpRequestPacket<String> incomingPacket = new DumpRequestPacket<>(incomingJSON, handler.getGnsNodeConfig());
                    int incomingId = incomingPacket.getId();
                    handler.getAdmintercessor().handleIncomingDumpResponsePackets(incomingJSON, handler);
                    ClientCommandProcessorConfig.getLogger().log(Level.FINEST, "ListenerAdmin: Relayed response for {0} --> {1}", new Object[] { incomingId, dumpRequestPacket.toJSONObject() });
                    int remaining = replicationMap.get(incomingId);
                    remaining -= 1;
                    if (remaining > 0) {
                        replicationMap.put(incomingId, remaining);
                    } else {
                        ClientCommandProcessorConfig.getLogger().log(Level.INFO, "ListenerAdmin: Saw last response for {0}", incomingId);
                        replicationMap.remove(incomingId);
                        SentinalPacket sentinelPacket = new SentinalPacket(incomingId);
                        handler.getAdmintercessor().handleIncomingDumpResponsePackets(sentinelPacket.toJSONObject(), handler);
                    }
                }
                break;
            case ADMIN_REQUEST:
                AdminRequestPacket incomingPacket = new AdminRequestPacket(incomingJSON);
                switch(incomingPacket.getOperation()) {
                    // deliberately nothing here for now
                    default:
                        ClientCommandProcessorConfig.getLogger().log(Level.SEVERE, "Unknown admin request in packet: {0}", incomingJSON);
                        break;
                }
                break;
            case ADMIN_RESPONSE:
                // forward any admin response packets recieved from NSs back to client
                AdminResponsePacket responsePacket = new AdminResponsePacket(incomingJSON);
                handler.getAdmintercessor().handleIncomingAdminResponsePackets(responsePacket.toJSONObject());
                break;
            default:
                ClientCommandProcessorConfig.getLogger().log(Level.SEVERE, "Unknown packet type in packet: {0}", incomingJSON);
                break;
        }
    } catch (JSONException | IllegalArgumentException | SecurityException | ParseException e) {
        ClientCommandProcessorConfig.getLogger().log(Level.WARNING, "Ignoring error handling packets: {0}", e);
        e.printStackTrace();
    }
}
Also used : SentinalPacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.SentinalPacket) AdminRequestPacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.AdminRequestPacket) JSONException(org.json.JSONException) DumpRequestPacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.DumpRequestPacket) AdminResponsePacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.AdminResponsePacket) JSONObject(org.json.JSONObject) ParseException(java.text.ParseException)

Example 2 with SentinalPacket

use of edu.umass.cs.gnsserver.gnsapp.packet.admin.SentinalPacket in project GNS by MobilityFirst.

the class Admintercessor method handleIncomingDumpResponsePackets.

/**
   * Processes incoming Dump packets.
   *
   * @param json
   * @param handler
   */
public void handleIncomingDumpResponsePackets(JSONObject json, ClientRequestHandlerInterface handler) {
    try {
        switch(Packet.getPacketType(json)) {
            case DUMP_REQUEST:
                try {
                    DumpRequestPacket<String> dumpResponse = new DumpRequestPacket<>(json, handler.getGnsNodeConfig());
                    int id = dumpResponse.getId();
                    // grab or make a new recordsMap
                    Map<String, TreeSet<NameRecord>> recordsMap = dumpStorage.get(id);
                    if (recordsMap == null) {
                        recordsMap = new TreeMap<>();
                        dumpStorage.put(id, recordsMap);
                    }
                    // pull the records out of the dump response and put them in dumpStorage
                    JSONArray jsonArray = dumpResponse.getJsonArray();
                    String serverID = dumpResponse.getPrimaryNameServer();
                    TreeSet<NameRecord> records = new TreeSet<>();
                    for (int i = 0; i < jsonArray.length(); i++) {
                        records.add(new NameRecord(null, jsonArray.getJSONObject(i)));
                    }
                    recordsMap.put(serverID, records);
                } catch (JSONException e) {
                    ClientCommandProcessorConfig.getLogger().log(Level.WARNING, "JSON error during dump reponse processing: {0}", e);
                }
                break;
            case SENTINAL:
                // put the records in dumpResult and let the folks waiting know they are ready
                try {
                    SentinalPacket sentinal = new SentinalPacket(json);
                    int id = sentinal.getId();
                    ClientCommandProcessorConfig.getLogger().log(Level.FINER, "Processing sentinel for {0}", id);
                    synchronized (dumpMonitor) {
                        dumpResult.put(id, dumpStorage.get(id));
                        dumpStorage.remove(id);
                        dumpMonitor.notifyAll();
                    }
                } catch (JSONException e) {
                    ClientCommandProcessorConfig.getLogger().log(Level.WARNING, "JSON error during dump sentinel processing: {0}", e);
                }
                break;
        }
    } catch (JSONException e) {
        ClientCommandProcessorConfig.getLogger().log(Level.WARNING, "JSON error while getting packet type: {0}", e);
    }
}
Also used : DumpRequestPacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.DumpRequestPacket) NameRecord(edu.umass.cs.gnsserver.gnsapp.recordmap.NameRecord) SentinalPacket(edu.umass.cs.gnsserver.gnsapp.packet.admin.SentinalPacket) TreeSet(java.util.TreeSet) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException)

Aggregations

DumpRequestPacket (edu.umass.cs.gnsserver.gnsapp.packet.admin.DumpRequestPacket)2 SentinalPacket (edu.umass.cs.gnsserver.gnsapp.packet.admin.SentinalPacket)2 JSONException (org.json.JSONException)2 AdminRequestPacket (edu.umass.cs.gnsserver.gnsapp.packet.admin.AdminRequestPacket)1 AdminResponsePacket (edu.umass.cs.gnsserver.gnsapp.packet.admin.AdminResponsePacket)1 NameRecord (edu.umass.cs.gnsserver.gnsapp.recordmap.NameRecord)1 ParseException (java.text.ParseException)1 TreeSet (java.util.TreeSet)1 JSONArray (org.json.JSONArray)1 JSONObject (org.json.JSONObject)1