Commit 8f751f16 authored by mohammad.salama's avatar mohammad.salama

Initial commit

parents
<component name="ArtifactManager">
<artifact type="jar" name="AutoHealer:jar">
<output-path>$PROJECT_DIR$/out/artifacts/AutoHealer_jar</output-path>
<root id="archive" name="Registration&amp;Discovery-AutoHealer.jar">
<element id="module-output" name="Registration&amp;Discovery-AutoHealer" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-aarch_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.94.Final/netty-handler-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.94.Final/netty-buffer-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-aarch_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.94.Final/netty-codec-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/yetus/audience-annotations/0.12.0/audience-annotations-0.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper-jute/3.9.1/zookeeper-jute-3.9.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.94.Final/netty-common-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-windows-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.94.Final/netty-transport-classes-epoll-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-classes/2.0.61.Final/netty-tcnative-classes-2.0.61.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.94.Final/netty-transport-native-unix-common-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper/3.9.1/zookeeper-3.9.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.94.Final/netty-resolver-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.94.Final/netty-transport-native-epoll-4.1.94.Final-linux-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.94.Final/netty-transport-4.1.94.Final.jar" path-in-jar="/" />
</root>
</artifact>
</component>
\ No newline at end of file
<component name="ArtifactManager">
<artifact type="jar" build-on-make="true" name="TransientWorker:jar">
<output-path>$PROJECT_DIR$/out/artifacts/TransientWorker_jar</output-path>
<root id="archive" name="Registration&amp;Discovery-AutoHealer.jar">
<element id="module-output" name="Registration&amp;Discovery-AutoHealer" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.94.Final/netty-transport-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.94.Final/netty-transport-classes-epoll-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-windows-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.94.Final/netty-transport-native-epoll-4.1.94.Final-linux-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.94.Final/netty-codec-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.94.Final/netty-resolver-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.94.Final/netty-handler-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper-jute/3.9.1/zookeeper-jute-3.9.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-classes/2.0.61.Final/netty-tcnative-classes-2.0.61.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.94.Final/netty-transport-native-unix-common-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.94.Final/netty-common-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-aarch_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper/3.9.1/zookeeper-3.9.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/yetus/audience-annotations/0.12.0/audience-annotations-0.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.94.Final/netty-buffer-4.1.94.Final.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-aarch_64.jar" path-in-jar="/" />
</root>
</artifact>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="Registration&amp;Discovery-AutoHealer" />
<module name="Service-Registration-and-Discovery" />
<module name="Distributed-Search" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17 (2)" project-jdk-type="JavaSDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ArtifactsWorkspaceSettings">
<artifacts-to-build>
<artifact name="AutoHealer:jar" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="b8bcd35c-99f3-44c8-a866-59f81c3c8bd0" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="useMavenConfig" value="true" />
</MavenGeneralSettings>
</option>
</component>
<component name="ProjectId" id="2alzLRJERmY1shFTTsZBezTaHit" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;jdk.selected.JAVA_MODULE&quot;: &quot;17 (2)&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/HIAST/FIY/FS/Distributed Systems/Lab/8/apache-maven-3.9.5&quot;,
&quot;project.structure.last.edited&quot;: &quot;Modules&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;reference.settings.project.maven.repository.indices&quot;
}
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\HIAST\FIY\FS\Distributed Systems\Lab\8\Distributed-Search\src\main\java\GRPC" />
<recent name="D:\HIAST\FIY\FS\Distributed Systems\Lab\8\Distributed-Search\src\main\java\GRPC\GRPCConnection" />
<recent name="D:\HIAST\FIY\FS\Distributed Systems\Lab\8\Distributed-Search\src\main\java\SearchWebApp\WebClient" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="SearchWebApp.WebServer" />
<recent name="" />
</key>
</component>
<component name="RunManager">
<configuration name="test" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="generalTesting.test" />
<module name="Distributed-Search" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="generalTesting.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<recent_temporary>
<list>
<item itemvalue="Application.test" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="SvnConfiguration">
<configuration>C:\Users\M_Salameh\AppData\Roaming\Subversion</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="b8bcd35c-99f3-44c8-a866-59f81c3c8bd0" name="Changes" comment="" />
<created>1704907897408</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1704907897408</updated>
</task>
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Service-Registration-and-Discovery</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<grpc.version>1.40.1</grpc.version>
<os.classifier>windows-x86_64</os.classifier>
<protobuf.version>3.18.0</protobuf.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.classifier}</pluginArtifact>
<protoSourceRoot>src/main/java/GRPC</protoSourceRoot>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>${protobuf.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-api</artifactId>
<version>1.54.0</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package AutoHealerAndClusterSearch;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class Application implements Watcher
{
private static final String address = "192.168.184.10:2181";
private static final int SESSION_TIMEOUT = 3000; //dead client
private static final int DEFAULT_PORT = 54321;
private ZooKeeper zooKeeper;
public static int numberOfInstances;
public static String pathToFile = "";
private final Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
/*int currentServerPort = args.length == 3 ? Integer.parseInt(args[0]) : DEFAULT_PORT;
numberOfInstances = args.length == 3 ? Integer.parseInt(args[1]) : 4;
String IP = args.length == 3 ? args[2] : "M_Salameh@127.0.0.1";*/
String IP = args.length == 1 ? args[0] : "127.0.0.1";
pathToFile = System.getProperty("user.dir") + "Worker.jar";
Application application = new Application();
ZooKeeper zooKeeper = application.connectToZookeeper();
ServiceRegistry serviceRegistry = new ServiceRegistry(zooKeeper , numberOfInstances , pathToFile);
OnElectionAction onElectionAction = new OnElectionAction(serviceRegistry, DEFAULT_PORT);
LeaderElection leaderElection = new LeaderElection(zooKeeper, onElectionAction);
leaderElection.volunteerForLeadership(IP);
leaderElection.reelectLeader();
application.run();
application.close();
}
public ZooKeeper connectToZookeeper() throws IOException {
this.zooKeeper = new ZooKeeper(address, SESSION_TIMEOUT, this);
return zooKeeper;
}
public void run() throws InterruptedException {
synchronized (zooKeeper) {
zooKeeper.wait();
}
}
private void close() throws InterruptedException {
this.zooKeeper.close();
}
@Override
public void process(WatchedEvent watchedEvent) {
switch (watchedEvent.getType()) {
case None:
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
logger.info("Successfully connected to Zookeeper");
} else if (watchedEvent.getState() == Event.KeeperState.Disconnected) {
synchronized (zooKeeper) {
logger.warn("Disconnected from Zookeeper");
zooKeeper.notifyAll();
}
} else if (watchedEvent.getState() == Event.KeeperState.Closed) {
logger.info("Closed Successfully");
}
break;
}
}
}
package AutoHealerAndClusterSearch;
import ObjectExchangeInCluster.Request;
import ObjectExchangeInCluster.Response;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.*;
public class Coordinator
{
private ZooKeeper zooKeeper;
///private static final String WORKERS_ZNODES_PATH = "/workers";
private static final String PHYSICAL_ZNODES_PATH = "/physical_nodes";
///private static final String COORDINATOR_ZNODE_PATH = "/coordinator_node";
private int REQUEST_RECEIVE_PORT = 12345;
private int CLUSTER_PORT = 54321;
private String FILES_DIRECTORY = "";
private final Logger logger = LoggerFactory.getLogger(Coordinator.class);
public Coordinator(ZooKeeper zooKeeper)
{
this.zooKeeper = zooKeeper;
FILES_DIRECTORY = System.getProperty(("user.dir") + "/SearchFiles");
}
public void start() throws IOException, InterruptedException, KeeperException
{
ServerSocket serverSocket = new ServerSocket(REQUEST_RECEIVE_PORT);
System.out.println("Server started on port " + REQUEST_RECEIVE_PORT);
logger.info("Server started on port " + REQUEST_RECEIVE_PORT);
while (true)
{
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected: " + clientSocket.getInetAddress());
logger.info("New client connected: " + clientSocket.getInetAddress());
Thread clientThread = new Thread(() ->
{
Response responseMap = handleClient(clientSocket);
sendResponsesToClient(clientSocket, responseMap);
});
clientThread.start();
}
}
private Response sendRequestToNode(Request request, String ipAddress)
{
Response response = null;
try (Socket socket = new Socket(ipAddress, CLUSTER_PORT))
{
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(request);
// Receive the response
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
response = (Response) objectInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return response;
}
private void sendResponsesToClient(Socket clientSocket, Response response)
{
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
/*for (Map.Entry<Serializable, Serializable> entry : responseMap.entrySet()) {
objectOutputStream.writeObject(entry.getValue());
}*/
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private Request extractRequest(Socket clientSocket) throws IOException, ClassNotFoundException
{
ObjectInputStream objectInputStream = new ObjectInputStream(clientSocket.getInputStream());
Request request = (Request) objectInputStream.readObject();
return request;
}
private Response handleClient(Socket clientSocket)
{
try
{
Request request = extractRequest(clientSocket);
List<Response> responses = spreadQuery(request);
processResultsAndPrepareAnswer(responses);
}
catch (IOException | InterruptedException | ClassNotFoundException | KeeperException e)
{
/**
* retry the responses ???
* */
e.printStackTrace();
}
catch (ExecutionException e)
{
throw new RuntimeException(e);
}
return null;
}
/**
* response from cluster node is tree-map where the keys are words
* and values are list of pair<fileName,Number Of Appearance of the word in it>
* we now must calculate the importance of each file for every word we got
* */
private void processResultsAndPrepareAnswer(List<Response> responses)
{
return;
}
private int countFilesInDirectory()
{
File directory = new File(FILES_DIRECTORY);
File[] files = directory.listFiles();
int fileCount = 0;
if (files != null) {
for (File file : files) {
if (file.isFile()) {
fileCount++;
}
}
}
return fileCount;
}
/**
* this method broadcasts the query for all nodes in the cluster
* and tells them what files are every node responsible for !!
* and try to distribute responsibility as much as possible !!!
* then receive response from every node
* response is tree-map here the keys are words
* and values are list of pair<fileName,Number Of Appearance of the word in it>
* */
public List<Response> spreadQuery(Request request) throws InterruptedException, KeeperException, IOException, ExecutionException
{
List<String> physicalZnodes = zooKeeper.getChildren(PHYSICAL_ZNODES_PATH, false);
int totalFilesNumber = countFilesInDirectory();
int filesNumberforNode = (totalFilesNumber + physicalZnodes.size()-1)/physicalZnodes.size();
int remaining = totalFilesNumber;
int index = 0;
int filesOffset=0;
ExecutorService executorService = Executors.newFixedThreadPool(physicalZnodes.size());
List<Callable<Response>> tasks = new ArrayList<>();
///distributing Files for NODES!!!
while (remaining > 0)
{
String physicalZnode = physicalZnodes.get(index);
Stat stat = zooKeeper.exists(PHYSICAL_ZNODES_PATH + "/" + physicalZnodes.get(index), false);
if (stat == null) {
logger.warn("Physical Node : " + physicalZnode + " is dowm!");
physicalZnodes.remove(index);
///nodes size ==0 ??
filesNumberforNode = (totalFilesNumber + physicalZnodes.size() - 1) / physicalZnodes.size();
continue;
}
String ipAddress = new String(
zooKeeper.getData(
PHYSICAL_ZNODES_PATH + "/" + physicalZnodes.get(index),
false, stat)
);
tasks.add(() -> sendRequestToNode(request, ipAddress));
index = (1 + index) % physicalZnodes.size();
filesOffset = (filesOffset + filesNumberforNode) % totalFilesNumber;
remaining -= filesNumberforNode;
}
List<Future<Response>> futures = executorService.invokeAll(tasks);
List<Response> responses = new ArrayList<>();
for (int i = 0; i < futures.size(); i++)
{
Response response = futures.get(i).get();
responses.add(response);
}
executorService.shutdown();
return responses;
}
/*private List<String> getIPAdressesInCluster() throws InterruptedException, KeeperException
{
List<String> nodes = zooKeeper.getChildren(PHYSICAL_ZNODES_PATH , false);
List<String> ipList = new ArrayList<>();
for (String node : nodes)
{
String fullName = PHYSICAL_ZNODES_PATH + "/" + node;
Stat stat = zooKeeper.exists(fullName , false);
if (stat == null)
{
nodes.remove(node);
continue;
}
String data = new String(zooKeeper.getData(fullName , false , stat));
data = data.split("@")[1];
ipList.add(data);
}
return ipList;
}*/
}
package AutoHealerAndClusterSearch;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
public class LeaderElection implements Watcher {
private static final String ELECTION_NAMESPACE = "/election";
private String currentZnodeName;
private ZooKeeper zooKeeper;
private final Logger logger = LoggerFactory.getLogger(LeaderElection.class);
private String IP = "";
private OnElectionCallback onElectionCallback;
public LeaderElection(ZooKeeper zooKeeper, OnElectionCallback onElectionCallback)
{
this.zooKeeper = zooKeeper;
this.onElectionCallback = onElectionCallback;
}
public void volunteerForLeadership(String IP) throws InterruptedException, KeeperException, UnknownHostException {
String znodePrefix = ELECTION_NAMESPACE + "/c_";
this.IP = IP;
String znodeFullPath = zooKeeper.create(znodePrefix, IP.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
//System.out.println(znodeFullPath);
logger.info("My Node under Election is" + znodeFullPath);
this.currentZnodeName = znodeFullPath.replace(ELECTION_NAMESPACE + "/", "");
}
public void reelectLeader() throws InterruptedException, KeeperException {
String predecessorName = "";
Stat predecessorStat = null;
//this while to guarantee get predecessor even if it deleted just before zookeeper.exist
while (predecessorStat == null)
{
List<String> children = zooKeeper.getChildren(ELECTION_NAMESPACE, false);
Collections.sort(children);
String smallestChild = children.get(0); //the first element
if (smallestChild.equals(currentZnodeName))
{
logger.info("I am LEADER");
onElectionCallback.onElectedToBeLeader(IP);
return;
}
else
{
logger.info("I am NOT LEADER");
int predecessorIndex = children.indexOf(currentZnodeName) - 1;
predecessorName = children.get(predecessorIndex);
predecessorStat = zooKeeper.exists(ELECTION_NAMESPACE + "/" + predecessorName, this);
}
}
onElectionCallback.onWorker(IP);
logger.info("Watching znode " + predecessorName + " in ELECTION");
}
@Override
public void process(WatchedEvent watchedEvent) {
switch (watchedEvent.getType())
{
case NodeDeleted:
try
{
reelectLeader();
}
catch (InterruptedException | KeeperException e)
{
logger.error("Can Not Handle Node Deletion in Election");
throw new RuntimeException(e);
}
break;
}
}
}
package AutoHealerAndClusterSearch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
public class NodeSorting
{
private static final Logger logger = LoggerFactory.getLogger(NodeSorting.class);
private static class Pair
{
String node;
int tasksNo;
// Constructor
public Pair(String x, int y) {
this.node = x;
this.tasksNo = y;
}
@Override
public String toString()
{
return "node : " + this.node +" has : " + tasksNo + " workers !!";
}
}
public static List<String> sort(List<byte[]> workers , List<String> Nodes)
{
Map<String , Integer> map = new HashMap<>();
//System.out.println("physical nodes are : " + Nodes);
logger.info("physical nodes are : " + Nodes);
for (byte[] worker : workers)
{
String s = new String(worker);
if (!Nodes.contains(s)) continue;
int x = map.getOrDefault(s , 0);
map.put(s , x+1);
}
for (String node : Nodes)
{
int x = map.getOrDefault(node , 0);
map.put(node , x);
}
List<Pair> temp = new ArrayList<>();
for (Map.Entry<String , Integer> el : map.entrySet())
{
Pair pair = new Pair(el.getKey() , el.getValue());
temp.add(pair);
}
Comparator<Pair> comparator = new Comparator<>()
{
@Override
public int compare(Pair p1, Pair p2)
{
return p1.tasksNo - p2.tasksNo;
}
};
List<String> ans = new ArrayList<>();
Collections.sort(temp, comparator);
for (Pair pair : temp)
{
ans.add(pair.node);
}
return ans;
}
}
package AutoHealerAndClusterSearch;
import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OnElectionAction implements OnElectionCallback
{
private final Logger logger = LoggerFactory.getLogger(OnElectionAction.class);
private final ServiceRegistry serviceRegistry;
private final int port;
public OnElectionAction(ServiceRegistry serviceRegistry, int port)
{
this.serviceRegistry = serviceRegistry;
this.port = port;
}
@Override
public void onElectedToBeLeader(String IP)
{
serviceRegistry.unregisterFromCluster();
try
{
serviceRegistry.registerToCoordinator(IP);
}
catch (InterruptedException | KeeperException e)
{
logger.error("Could Not Register to be Coordinator");
throw new RuntimeException(e);
}
serviceRegistry.registerForUpdates();
}
@Override
public void onWorker(String IP)
{
try
{
serviceRegistry.registerToCluster(IP);
}
catch (InterruptedException | KeeperException e)
{
logger.error("Could Not Register To Cluster");
e.printStackTrace();
}
}
}
package AutoHealerAndClusterSearch;
public interface OnElectionCallback {
void onElectedToBeLeader(String IP);
void onWorker(String IP);
}
package AutoHealerAndClusterSearch;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ServiceRegistry implements Watcher
{
private static final String WORKERS_ZNODES_PATH = "/workers";
private static final String PHYSICAL_ZNODES_PATH = "/physical_nodes";
private static final String COORDINATOR_ZNODE_PATH = "/coordinator_node";
private final Logger logger = LoggerFactory.getLogger(ServiceRegistry.class);
private String pathToProgram = "";
private final ZooKeeper zooKeeper;
private Coordinator coordinator = null;
private String currentZnode = null;
private List<String> allServiceAddresses = null;
private int numberOfInstances;
public ServiceRegistry(ZooKeeper zooKeeper , int numberOfInstances , String pathToProgram)
{
this.zooKeeper = zooKeeper;
this.numberOfInstances = numberOfInstances;
this.pathToProgram = pathToProgram;
createServiceRegistryZnode();
}
private void createServiceRegistryZnode()
{
try
{
if (zooKeeper.exists(WORKERS_ZNODES_PATH, false) == null) {
zooKeeper.create(WORKERS_ZNODES_PATH, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
if (zooKeeper.exists(PHYSICAL_ZNODES_PATH, false) == null) {
zooKeeper.create(PHYSICAL_ZNODES_PATH, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
if (zooKeeper.exists(COORDINATOR_ZNODE_PATH, false) == null) {
zooKeeper.create(COORDINATOR_ZNODE_PATH, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
catch (KeeperException | InterruptedException e)
{
logger.error("Could NOT Create Service Registry Znode");
e.printStackTrace();
}
}
public void registerToCluster(String metadata) throws KeeperException, InterruptedException {
if (this.currentZnode != null)
{
logger.info("Already registered to service registry");
return;
}
this.currentZnode = zooKeeper.create(PHYSICAL_ZNODES_PATH + "/physical_node_", metadata.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
logger.info("Registered to service registry");
}
public void registerToCoordinator(String metadata) throws InterruptedException, KeeperException
{
this.currentZnode = zooKeeper.create(COORDINATOR_ZNODE_PATH + "/coordinator_", metadata.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
logger.info("Registered to be Coordinator and I am Master !");
coordinator = new Coordinator(this.zooKeeper);
}
public void registerForUpdates() {
try
{
masterJob();
}
catch (KeeperException | InterruptedException | IOException e)
{
logger.error("Could Not Do LEADER JOB !");
e.printStackTrace();
}
}
public void unregisterFromCluster()
{
try
{
if (currentZnode != null && zooKeeper.exists(currentZnode, false) != null) {
zooKeeper.delete(currentZnode, -1);
}
}
catch (KeeperException | InterruptedException e)
{
logger.error("Could Not UN-Register From Cluster !!");
e.printStackTrace();
}
}
private synchronized void masterJob() throws InterruptedException, KeeperException, IOException {
updateAddresses();
//launchWorkersIfNecessary();
}
private void updateAddresses() throws KeeperException, InterruptedException
{
List<String> workerZnodes = zooKeeper.getChildren(PHYSICAL_ZNODES_PATH, false);
List<String> addresses = new ArrayList<>(workerZnodes.size());
for (String workerZnode : workerZnodes) {
String workerFullPath = PHYSICAL_ZNODES_PATH + "/" + workerZnode;
Stat stat = zooKeeper.exists(workerFullPath, false);
if (stat == null) {
continue;
}
byte[] addressBytes = zooKeeper.getData(workerFullPath, false, stat);
String address = new String(addressBytes);
addresses.add(address);
}
this.allServiceAddresses = Collections.unmodifiableList(addresses);
logger.info("The cluster addresses are: " + this.allServiceAddresses);
}
@Override
public void process(WatchedEvent watchedEvent)
{
switch (watchedEvent.getType())
{
case NodeChildrenChanged:
{
try
{
masterJob();
}
catch (InterruptedException | KeeperException | IOException e)
{
logger.error("Could NOT Handle Node Children Changed Event!");
throw new RuntimeException(e);
}
}
}
}
/*private void launchWorkersIfNecessary() throws KeeperException, InterruptedException, IOException
{
List<String> physicalZnodes = zooKeeper.getChildren(PHYSICAL_ZNODES_PATH, this);
List<String> workers = zooKeeper.getChildren(WORKERS_ZNODES_PATH, this);
for (String worker : workers)
{
Stat stat = zooKeeper.exists(WORKERS_ZNODES_PATH + "/" + worker, false);
if (stat == null) {
workers.remove(worker);
continue;
}
String node = new String(zooKeeper.getData(WORKERS_ZNODES_PATH + "/" + worker, false, stat));
if (!physicalZnodes.contains(node))
{
workers.remove(worker);
}
}
List<String> sortedWorkers = NodeSorting.sort(getOriginalNodes(workers), physicalZnodes);
while (workers.size() > numberOfInstances)
{
Stat stat = zooKeeper.exists(WORKERS_ZNODES_PATH + "/" + workers.get(0), false);
if (stat == null) {
workers.remove(0);
continue;
}
zooKeeper.delete(WORKERS_ZNODES_PATH + "/" + workers.get(0) , -1);
}
int neededInstances = numberOfInstances - workers.size();
if (neededInstances <= 0) return;
int index = 0;
int size = sortedWorkers.size();
while (neededInstances>0
&& size>0)
{
Stat stat = zooKeeper.exists(PHYSICAL_ZNODES_PATH + "/" + sortedWorkers.get(index), false);
if (stat == null)
{
sortedWorkers.remove(index);
size--;
continue;
}
startNewWorker(sortedWorkers.get(index));
neededInstances--;
index = (index + 1) % size;
}
}*/
/*private List<byte[]> getOriginalNodes(List<String> workers) throws InterruptedException, KeeperException {
List<byte[]> ans = new ArrayList<>();
for (String worker : workers)
{
Stat stat = zooKeeper.exists(WORKERS_ZNODES_PATH+"/"+worker ,false);
if (stat == null) continue;
ans.add(zooKeeper.getData(WORKERS_ZNODES_PATH+"/"+worker,false,stat ));
}
return ans;
}*/
/*private void startNewWorker(String physicalNode) throws IOException, InterruptedException, KeeperException
{
String remoteUser = new String(zooKeeper.getData(PHYSICAL_ZNODES_PATH+"/"+physicalNode , false, null));
String remoteJarFilePath = "/root/AutoHealer/Worker.jar"; //+ file.getName();
logger.info("Sending To : " + remoteUser);
String sshCommand = "ssh " + remoteUser + " \"java -jar " + remoteJarFilePath + " " +physicalNode+"\"";
System.out.println(sshCommand);
Runtime.getRuntime().exec(sshCommand);
//long pid=Runtime.getRuntime().exec(sshCommand).pid();
//System.out.println(pid);
}*/
}
package AutoHealerAndClusterSearch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
public class TransientWorker {
private static final String ZOOKEEPER_ADDRESS = "192.168.184.10:2181";
private static final int SESSION_TIMEOUT = 3000;
private final Logger logger = LoggerFactory.getLogger(TransientWorker.class);
// Parent Znode where each worker stores an ephemeral child to indicate it is alive
private static final String WORKERS_ZNODES_PATH = "/workers";
private static final float CHANCE_TO_FAIL = 0.001F;
private final Random random = new Random();
private ZooKeeper zooKeeper;
private String filesLocation;
private String myName = "";
/// regex is used to know how the information will be concatenated to encode them to onw string
/// like : nodenum + regex+somehting+regex....
private String regex = "^";
public void connectToZookeeper() throws IOException {
this.zooKeeper = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, event -> {
});
}
public void work(String nodeNum, String query, int numberOfFilesToScan, int filesOffset) throws KeeperException, InterruptedException {
filesLocation = System.getProperty("user.dir") + "/SearchFiles";
addChildZnode(nodeNum, numberOfFilesToScan, filesOffset);
logger.info(myName + " is Working and responsible for " + numberOfFilesToScan + " Files");
List<String> myFiles = getMyFiles(numberOfFilesToScan, filesOffset);
double score = getScore(query, myFiles);
/// send them to coordinator
}
private void addChildZnode(String nodeNumber, int numberOfFilesToScan, int filesOffset) throws KeeperException, InterruptedException {
String info = nodeNumber + regex + numberOfFilesToScan + regex + filesOffset;
myName = zooKeeper.create(WORKERS_ZNODES_PATH + "/worker_",
info.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
}
private List<String> getMyFiles(int numberOfFilesToScan, int filesOffset)
{
List<String> fileNames = new ArrayList<>();
try (DirectoryStream<Path> stream =
Files.newDirectoryStream(Paths.get(filesLocation))) {
for (Path file : stream) {
if (Files.isRegularFile(file)) {
fileNames.add(file.getFileName().toString());
}
}
} catch (IOException e)
{
logger.error("Can not Access Files");
e.printStackTrace();
}
int startIndex = Math.min(filesOffset, fileNames.size());
int endIndex = Math.min(filesOffset + numberOfFilesToScan, fileNames.size());
return fileNames.subList(startIndex, endIndex);
}
private double getScore(String query, List<String> myFiles)
{
String[] wordsToCount = query.split(".");
Map<String , BigInteger> numberOfWordsInFile = new HashMap<>();
Map<String, Integer> wordFrequency = new HashMap<>();
Map<String, Integer> fileCount = new HashMap<>();
Path filePath = Paths.get(filesLocation);
try (BufferedReader reader = new BufferedReader(new FileReader(filePath.toFile())))
{
Set<String> uniqueWords = new HashSet<>();
String line;
while ((line = reader.readLine()) != null)
{
String[] words = line.split(" ");
for (String word : words) {
if (Arrays.asList(wordsToCount).contains(word))
{
wordFrequency.put(word, wordFrequency.getOrDefault(word, 0) + 1);
uniqueWords.add(word);
}
}
}
for (String word : uniqueWords)
{
fileCount.put(word, fileCount.getOrDefault(word, 0) + 1);
}
return 0.0;
}
catch (IOException e)
{
logger.error("Could not Read Files , Path Problem!");
e.printStackTrace();
return 0.0;
}
}
}
package AutoHealerAndClusterSearch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class TransientWorkerApplication
{
private static final Logger logger = LoggerFactory.getLogger(TransientWorkerApplication.class);
public static void main(String[] args)
{
/**
*
* String sshCommand = "ssh " + remoteUser + " \"java -jar " +
* remoteJarFilePath + " " +
* physicalNode+ " " + ///arg[0]
* modifiedQuery + " " + ///arg[1]
* numberOfFilesToScan + " "+ ///arg[2]
* filesOffset+"\""; ///arg[3]
* */
TransientWorker worker = new TransientWorker();
String nodeNum = args[0];
String query = args[1];
int numberOfFilesToScan = Integer.parseInt(args[2]);
int filesOffset = Integer.parseInt(args[3]);
try
{
worker.connectToZookeeper();
}
catch (IOException e)
{
logger.warn("Cannot Connect To ZooKeeper");
throw new RuntimeException(e);
}
try
{
worker.work(nodeNum , query , numberOfFilesToScan , filesOffset);
}
catch (Exception e)
{
logger.error("Worker Shut Down");
System.exit(1);
}
}
}
package GRPC;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.List;
import java.util.concurrent.TimeUnit;
/*
public class SearchClient {
private final ManagedChannel channel;
private final SearchServiceGrpc.SearchServiceBlockingStub blockingStub;
public SearchClient(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
blockingStub = SearchServiceGrpc.newBlockingStub(channel);
}
public void search(String query) {
SearchRequest request = SearchRequest.newBuilder()
.setQuery(query)
.build();
SearchResponse response = blockingStub.search(request);
List<String> results = response.getResultsList();
System.out.println("Received search results:");
for (String result : results) {
System.out.println(result);
}
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException
{
SearchClient searchClient = new SearchClient("localhost", 50051);
searchClient.search("example query");
searchClient.shutdown();
}
}*/
\ No newline at end of file
package GRPC;
import io.grpc.Server;
import io.grpc.ServerBuilder;
/*import io.grpc.stub.StreamObserver;
import com.example.grpc.search_service.SearchRequest;
import com.example.grpc.search_service.SearchResponse;
import com.example.grpc.search_service.SearchServiceGrpc;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SearchServer {
private Server server;
private void start() throws IOException {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new SearchServiceImpl())
.build()
.start();
System.out.println("Server started on port " + port);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutting down server...");
SearchServer.this.stop();
}));
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
SearchServer searchServer = new SearchServer();
searchServer.start();
searchServer.blockUntilShutdown();
}
private static class SearchServiceImpl extends SearchServiceGrpc.SearchServiceImplBase {
@Override
public void search(SearchRequest request, StreamObserver<SearchResponse> responseObserver) {
String query = request.getQuery();
System.out.println("Received search query: " + query);
// Perform search logic based on the query and generate results
List<String> results = new ArrayList<>();
results.add("Result 1");
results.add("Result 2");
results.add("Result 3");
SearchResponse response = SearchResponse.newBuilder()
.addAllResults(results)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
}*/
\ No newline at end of file
syntax = "proto3";
option java_multiple_files = true;
option java_package = "GRPCConnection";
option java_outer_classname = "SearchServiceProto";
package search_service;
service SearchService
{
rpc Search(SearchRequest) returns (SearchResponse) {}
}
message SearchRequest
{
string query = 1;
}
message SearchResponse
{
repeated string results = 1;
}
\ No newline at end of file
package ObjectExchangeInCluster;
import java.io.Serializable;
public class Request implements Serializable
{
private String query;
private int numberOfFilesToScan;
private int filesOffset;
public Request(String query , int numberOfFilesToScan , int filesOffset)
{
this.numberOfFilesToScan = numberOfFilesToScan;
this.filesOffset = filesOffset;
this.query = query;
}
public String[] getQueryWords()
{
return query.split(" ");
}
public int getNumberOfFilesToScan()
{
return numberOfFilesToScan;
}
public int getFilesOffset()
{
return filesOffset;
}
}
package ObjectExchangeInCluster;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class Response implements Serializable {
private class FileWordPair {
public String fileName;
public long freq;
}
private TreeMap<String, List<FileWordPair>> wordFrequencies;
public Response() {
wordFrequencies = new TreeMap<>();
}
public void addFileWordPair(String fileName, String word, long freq) {
FileWordPair fileWordPair = new FileWordPair();
fileWordPair.fileName = fileName;
fileWordPair.freq = freq;
List<FileWordPair> temp = wordFrequencies.getOrDefault(word, new ArrayList<>());
temp.add(fileWordPair);
wordFrequencies.put(word, temp);
}
public TreeMap<String, List<FileWordPair>> getWordFrequencies()
{
return wordFrequencies;
}
}
package SearchWebApp.WebClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Aggregator {
private WebClient webClient;
static final Logger logger = LoggerFactory.getLogger(Aggregator.class);
public Aggregator() {
this.webClient = new WebClient();
}
/*send task to list of workers*/
public List<String> sendTasksToWorkers(List<String> workersAddresses, List<String> tasks) throws ExecutionException, InterruptedException {
List<String> responses = new ArrayList<>();
List<CompletableFuture<String>> temp = new ArrayList<>();
for (String workerAddr : workersAddresses)
{
for (String task : tasks)
{
try
{
temp.add(webClient.sendTask(workerAddr, task.getBytes()));
}
catch (Exception e)
{
logger.error("Cannot Connect To Server " + workerAddr);
break;
}
}
}
responses = joinFutures(temp);
return responses;
}
/*send task to list of workers*/
public List<String> sendTasksToWorkers(List<String> workersAddresses, List<String> tasks, String headers) throws ExecutionException, InterruptedException {
List<String> responses = new ArrayList<>();
List<CompletableFuture<String>> temp = new ArrayList<>();
for (String workerAddr : workersAddresses)
{
for (String task : tasks)
{
try
{
temp.add(webClient.sendTask(workerAddr , task.getBytes() , headers));
}
catch (Exception e)
{
logger.error("Cannot Connect To Server " + workerAddr);
break;
}
}
}
responses = joinFutures(temp);
return responses;
}
private List<String> joinFutures(List<CompletableFuture<String>> futures)
{
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try
{
allFutures.get();
}
catch (InterruptedException | ExecutionException e)
{
logger.error("Responses could not be got");
e.printStackTrace();
}
List<String> results = new ArrayList<>();
for (CompletableFuture<String> future : futures)
{
try
{
String result = future.get();
results.add(result);
}
catch (InterruptedException | ExecutionException e)
{
logger.error("Responses could not be got");
e.printStackTrace();
}
}
return results;
}
}
package SearchWebApp.WebClient;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class Application
{
private static final String WORKER_ADDRESS_1 = "http://localhost:8080/task";
private static final String WORKER_ADDRESS_2 = "http://localhost:8081/task";
public static void main(String[] args) throws ExecutionException, InterruptedException {
Aggregator aggregator = new Aggregator();
String task1 = "10,200";
String task2 = "123456789,100000000000000,700000002342343";
String headers = "X-Debug: true";
List<String> results = aggregator.sendTasksToWorkers(Arrays.asList(WORKER_ADDRESS_1, WORKER_ADDRESS_2),
Arrays.asList(task1, task2));
for (String result : results) {
System.out.println(result);
}
List<String> resultsWithHeaders = aggregator.sendTasksToWorkers(Arrays.asList(WORKER_ADDRESS_1/*, WORKER_ADDRESS_2*/),
Arrays.asList(task1, task2), headers);
for (String result : resultsWithHeaders) {
System.out.println(result);
}
}
}
package SearchWebApp.WebClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
public class WebClient {
private HttpClient client;
private String DEBUG_RESPONSE_KEY = "X-Debug-Info";
static final Logger logger = LoggerFactory.getLogger(WebClient.class);
/* instantiate web client */
/* Read more about Builder pattern https://en.wikipedia.org/wiki/Builder_pattern*/
public WebClient()
{
this.client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();
}
/* send task (post http request) asynchronously */
public CompletableFuture<String> sendTask(String url, byte[] requestPayload)
{
CompletableFuture<String> response = new CompletableFuture<>();
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create(url))
.POST(HttpRequest.BodyPublishers.ofByteArray(requestPayload))
.build();
response = client.sendAsync
(httpRequest ,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)).
thenApply(HttpResponse::body);
return response;
}
/* send task (post http request) asynchronously with custom headers*/
public CompletableFuture<String> sendTask(String url, byte[] requestPayload, String headers)
{
CompletableFuture<String> reply = new CompletableFuture<>();
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create(url))
.POST(HttpRequest.BodyPublishers.ofByteArray(requestPayload));
if (headers != null && !headers.isEmpty())
{
String[] headerLines = headers.split("\n");
for (String headerLine : headerLines)
{
String[] headerParts = headerLine.split(":");
String headerName = headerParts[0].trim();
String headerValue = headerParts[1].trim();
requestBuilder.header(headerName, headerValue);
}
}
HttpRequest request = requestBuilder.build();
reply = client.sendAsync
(request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
.thenApply(response ->
response.headers().map().get(DEBUG_RESPONSE_KEY).get(0) + response.body());
return reply;
}
}
package SearchWebApp.WebServer;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.InetSocketAddress;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executors;
public class WebServer implements Watcher
{
static final Logger logger = LoggerFactory.getLogger(WebServer.class);
private static final String TASK_ENDPOINT = "/search-query";
private static final String COORDINATOR_ZNODE_PATH = "/coordinator_node";
private final String zooKeeperServerAddress = "192.168.184.10";
private static final int SESSION_TIMEOUT = 3000;
private final int port;
private HttpServer server;
private ZooKeeper zooKeeper;
private String CoordinatorAddress;
private String Coordinator_Full_Name;
public WebServer(int port) throws IOException, InterruptedException, KeeperException
{
this.port = port;
}
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
int serverPort = 8080;
if (args.length == 1)
{
serverPort = Integer.parseInt(args[0]);
}
WebServer webServer = new WebServer(serverPort);
webServer.connectToZookeeper();
webServer.startServer();
System.out.println("Server is listening on port " + serverPort);
logger.info("Server is listening on port " + serverPort);
webServer.run();
webServer.close();
}
public void connectToZookeeper() throws IOException, InterruptedException, KeeperException
{
this.zooKeeper = new ZooKeeper(zooKeeperServerAddress, SESSION_TIMEOUT, this);
setCoordinatorAddress();
}
public void run() throws InterruptedException {
synchronized (zooKeeper) {
zooKeeper.wait();
}
}
private void close() throws InterruptedException {
this.zooKeeper.close();
}
private synchronized void setCoordinatorAddress() throws InterruptedException, KeeperException {
String cord = zooKeeper.getChildren(COORDINATOR_ZNODE_PATH , this).get(0);
Coordinator_Full_Name = COORDINATOR_ZNODE_PATH + "/" + cord;
Stat stat = zooKeeper.exists(Coordinator_Full_Name , false);
if (stat == null)
{
logger.error("Coordinator Not Found");
throw new RuntimeException();
}
this.CoordinatorAddress = new String(zooKeeper.getData(Coordinator_Full_Name , false , stat)).split("@")[1];
}
public void startServer() {
try
{
this.server = HttpServer.create(new InetSocketAddress(port), 0);
logger.info("Server Started at : " + System.nanoTime());
}
catch (IOException e) {
logger.error("Server failed to Start at : " + System.nanoTime());
throw new RuntimeException(e);
}
HttpContext taskContext = server.createContext(TASK_ENDPOINT);
taskContext.setHandler(this::handleTaskRequest);
server.setExecutor(Executors.newFixedThreadPool(8));
server.start();
}
private void handleTaskRequest(HttpExchange exchange) throws IOException
{
logger.info("Query Request at " + System.nanoTime());
if (!exchange.getRequestMethod().equalsIgnoreCase("post"))
{
exchange.close();
return;
}
Headers headers = exchange.getRequestHeaders();
long startTime = System.nanoTime();
byte[] requestBytes = exchange.getRequestBody().readAllBytes();
byte[] responseBytes = prepareRsponse(requestBytes);
long finishTime = System.nanoTime();
String debugMessage = String.format("Operation took %d ns", finishTime - startTime);
exchange.getResponseHeaders().put("X-Debug-Info", Arrays.asList(debugMessage));
sendResponse(responseBytes, exchange);
}
private byte[] prepareRsponse(byte[] requestBytes)
{
String bodyString = new String(requestBytes);
String[] stringTerms = bodyString.split(" ");
/**
*
* must add code to send the stringTerms to the coordinator
* using grpc and wait for response !!
* */
return String.format("Result of the multiplication is \n").getBytes();
}
private void sendResponse(byte[] responseBytes, HttpExchange exchange) throws IOException {
exchange.sendResponseHeaders(200, responseBytes.length);
OutputStream outputStream = exchange.getResponseBody();
outputStream.write(responseBytes);
outputStream.flush();
outputStream.close();
exchange.close();
}
@Override
public void process(WatchedEvent watchedEvent)
{
switch (watchedEvent.getType())
{
case NodeChildrenChanged:
{
try
{
logger.warn("Coordinator Changed !!");
setCoordinatorAddress();
}
catch (InterruptedException | KeeperException e)
{
logger.error("Could NOT Handle Node Children Changed Event!");
throw new RuntimeException(e);
}
}
}
}
}
package generalTesting;
import java.io.*;
import java.net.Socket;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
public class test
{
public static void listFilesForFolder(String filesLocation)
{
List<String> fileNames = new ArrayList<>();
try (DirectoryStream<Path> stream =
Files.newDirectoryStream(Paths.get(filesLocation)))
{
for (Path file : stream) {
if (Files.isRegularFile(file)) {
fileNames.add(file.getFileName().toString());
}
}
} catch (IOException e)
{
e.printStackTrace();
}
for (String file : fileNames) System.out.println(file);
}
public static void main(String[] args)
{
///listFilesForFolder(System.getProperty("user.dir") + "/SearchFiles");
}
}
package testTransmitting;
import java.io.Serializable;
public class MyClass implements Serializable
{
public String sth;
}
package testTransmitting;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Receiver {
public static void main(String[] args) {
int serverPort = 12345;
try {
// Create a ServerSocket and bind it to the specified port
ServerSocket serverSocket = new ServerSocket(serverPort);
System.out.println("Waiting for incoming connections...");
// Accept a client connection
Socket socket = serverSocket.accept();
System.out.println("Connection established with a client.");
// Get the InputStream from the socket
InputStream inputStream = socket.getInputStream();
// Create an ObjectInputStream to deserialize the object
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
// Read the serialized object and cast it back to the original object type
MyClass receivedObj = (MyClass) objectInputStream.readObject();
// Close the input stream, object input stream, and socket
objectInputStream.close();
inputStream.close();
socket.close();
System.out.println("Object received successfully : " + receivedObj.sth);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package testTransmitting;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Sender {
public static void main(String[] args) {
String serverHost = "localhost";
int serverPort = 12345;
try {
// Establish a TCP connection to the server
Socket socket = new Socket(serverHost, serverPort);
// Get the OutputStream from the socket
OutputStream outputStream = socket.getOutputStream();
// Create an ObjectOutputStream to serialize the object
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
// Create and serialize the object
MyClass obj = new MyClass(); // The object you want to serialize
obj.sth = "hello Mr.Salameh";
objectOutputStream.writeObject(obj);
// Flush and close the output stream and socket
objectOutputStream.flush();
objectOutputStream.close();
socket.close();
System.out.println("Object sent successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
Manifest-Version: 1.0
Main-Class: AutoHealerAndClusterSearch.Application
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="HOME_LOG" value="logs/app.log"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${HOME_LOG}</file>
<append>true</append>
<immediateFlush>true</immediateFlush>
<encoder>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</encoder>
</appender>
<!-- Log Level: ERROR, WARN, INFO, DEBUG, TRACE-->
<logger name="AutoHealerAndClusterSearch" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<root level="error">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
Manifest-Version: 1.0
Main-Class: AutoHealerAndLoadBalancing.Application
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="HOME_LOG" value="logs/app.log"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${HOME_LOG}</file>
<append>true</append>
<immediateFlush>true</immediateFlush>
<encoder>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</encoder>
</appender>
<!-- Log Level: ERROR, WARN, INFO, DEBUG, TRACE-->
<logger name="AutoHealerAndLoadBalancing" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<root level="error">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment