Skip to content

Commit

Permalink
First working version of the network on a single machine
Browse files Browse the repository at this point in the history
Solving the problem of non communicating node by:
* Adding manually to the map the intial root context and its default
spaces beacuse they are created using a specific way.
* Cleaning topic naming
* And correcting preivous mistake for checking existing elements in
distributed collection
* Ensuring that topic are well initialized before sending events (just
by getting the correpsodning topic a first time before events sending)
* And ensuring hazelcast instances are waiting each others before
starting communications
* By correcting spaceUUID equality test that was using === that didn't
work
  • Loading branch information
ngaud committed Oct 27, 2020
1 parent fc43987 commit cf17e7d
Show file tree
Hide file tree
Showing 6 changed files with 243 additions and 231 deletions.
Expand Up @@ -4,8 +4,7 @@ Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.janusproject.network;singleton:=true
Bundle-Version: 0.12.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Export-Package: io.sarl.sre.network,
io.sarl.sre.network.boot,
Export-Package: io.sarl.sre.network.boot,
io.sarl.sre.network.services
Require-Bundle: io.sarl.core;bundle-version="0.12.0",
io.sarl.util;bundle-version="0.12.0",
Expand Down
@@ -1,2 +1 @@
io.sarl.sre.network.boot.NetworkModuleProvider

Expand Up @@ -20,9 +20,9 @@ import javax.inject.Inject

class HazelcastContextService extends MemoryBasedContextService {

/**
* Local Hazelcast instance
*/
/**
* Local Hazelcast instance
*/
var hazelcastInstance : HazelcastInstance;

/**
Expand All @@ -44,14 +44,35 @@ class HazelcastContextService extends MemoryBasedContextService {
@Inject
new(sreConfig : SreConfig, @KernelScope rootContext : Context, injector : Injector, factory : ContextFactory,
iHazelcastInstance : HazelcastInstance, distributedContextSpaceMapName : String, logger : LoggingService) {
super(rootContext, injector, factory)
hazelcastInstance = iHazelcastInstance
defaultSpaces = this.hazelcastInstance.getMap(sreConfig.boot.rootContextID.toString());
super(rootContext, injector, factory);

hazelcastInstance = iHazelcastInstance;
kernelLogger = logger.kernelLogger

/*kernelLogger.log(Level::INFO, "Creating HazelcastContextService")
kernelLogger.log(Level::INFO, "RootID from BootCOnfig: " + sreConfig.boot.rootContextID)
kernelLogger.log(Level::INFO, "RootSpaceID from BootCOnfig: " + sreConfig.boot.rootSpaceID)
kernelLogger.log(Level::INFO, "RootID from rootContext: " + rootContext.ID)
kernelLogger.log(Level::INFO, "RootSpaceID from rootContext: " + rootContext.defaultSpace.spaceID.ID)*/
kernelLogger.log(Level::INFO, "About to get map")
defaultSpaces = this.hazelcastInstance.getMap(sreConfig.boot.rootContextID.toString());

// Can't access to that rootContext.defaultSpace
// registering root context, the root context is created differently than other contexts using a call to the ContextFactory directly
kernelLogger.log(Level::INFO, "Registering Root Context on distributed map")
this.defaultSpaces.putIfAbsent(sreConfig.boot.rootContextID, sreConfig.boot.rootSpaceID);

kernelLogger.log(Level::INFO, "About to create listener")

var defaultSpacesListener : EntryListener<UUID, UUID> = new DefaultSpacesMapListener(this)
defaultSpacesListenerID = defaultSpaces.addEntryListener(defaultSpacesListener, true)
kernelLogger.log(Level::INFO, "End of Creating HazelcastContextService")

}

protected def newContextInstance(contextID : UUID, defaultSpaceID : UUID, owner : Agent) : Context {
kernelLogger.log(Level::INFO,
"From HazelcastContextService adding new Context " + contextID + " and its default space " + defaultSpaceID)
this.defaultSpaces.putIfAbsent(contextID, defaultSpaceID);

return super.newContextInstance(contextID, defaultSpaceID, owner)
Expand All @@ -64,45 +85,14 @@ class HazelcastContextService extends MemoryBasedContextService {

override onStart {
super.onStart
var defaultSpacesListerner = new EntryListener<UUID, UUID>() {

def entryAdded(^event : EntryEvent<UUID, UUID>) {
ensureDefaultSpaceDefinition(^event.key, ^event.value, null)
}

def entryUpdated(^event : EntryEvent<UUID, UUID>) {
//
}

def entryRemoved(^event : EntryEvent<UUID, UUID>) {
removeDefaultSpaceDefinition(^event.key, ^event.value)
}

def entryEvicted(^event : EntryEvent<UUID, UUID>) {
//
}

def entryExpired(^event : EntryEvent<UUID, UUID>) {
//
}

def mapCleared(^event : MapEvent) {
//
}

def mapEvicted(^event : MapEvent) {
//
}

}
defaultSpacesListenerID = defaultSpaces.addEntryListener(defaultSpacesListerner, true)
}

protected def ensureDefaultSpaceDefinition(contextID : UUID, defaultSpaceID : UUID, owner : Agent) {
kernelLogger.log(Level::INFO,
"Creating local space " + defaultSpaceID + " of the Context " + contextID + " following a network request")

if (getContext(contextID) === null) {
if (!this.contextInternalStructure.containsKey(contextID)) {
// Assuming the first request we got, is the one corresponding to the default space
super.createContext(contextID, defaultSpaceID, owner);
} else {
Expand Down Expand Up @@ -142,4 +132,42 @@ class HazelcastContextService extends MemoryBasedContextService {
defaultSpaces.removeEntryListener(defaultSpacesListenerID)
}

static class DefaultSpacesMapListener implements EntryListener<UUID, UUID> {
var hazelcastContextService : HazelcastContextService


new(iHazelcastContextService : HazelcastContextService) {
hazelcastContextService = iHazelcastContextService
}

def entryAdded(^event : EntryEvent<UUID, UUID>) {
hazelcastContextService.ensureDefaultSpaceDefinition(^event.key, ^event.value, null)
}

def entryUpdated(^event : EntryEvent<UUID, UUID>) {
//
}

def entryRemoved(^event : EntryEvent<UUID, UUID>) {
hazelcastContextService.removeDefaultSpaceDefinition(^event.key, ^event.value)
}

def entryEvicted(^event : EntryEvent<UUID, UUID>) {
//
}

def entryExpired(^event : EntryEvent<UUID, UUID>) {
//
}

def mapCleared(^event : MapEvent) {
//
}

def mapEvicted(^event : MapEvent) {
//
}

}

}

0 comments on commit cf17e7d

Please sign in to comment.