DirtyShareSupport.java
/*
** Module : DirtyShareSupport.java
** Abstract : Enables or disables certain dirty share features, including dirty share impact logging
**
** Copyright (c) 2020-2024, Golden Code Development Corporation.
**
** -#- -I- --Date-- ---------------------------------------Description---------------------------------------
** 001 ECF 20200701 Created initial version. Enables/disables dirty share features globally.
** 002 GBB 20230512 Logging methods replaced by CentralLogger/ConversionStatus.
** 003 SVL 20230516 Support for more granular configuration of dirty sharing functionality.
** 004 DDF 20230620 Replaced static initialization of values from the directory configuration with
** a method called at server bootstrap.
** DDF 20230627 Made members private and accessible through static methods and used a standard
** handling for directory binding.
** 005 TJD 20240408 Renamed isEnabledCrossSection to isEnabledCrossSession
** 006 AL2 20241105 Disable cross-session dirty-share by default.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
** Under Section 7 of the GNU Affero GPL version 3, the following additional
** terms apply to the works covered under the License. These additional terms
** are non-permissive additional terms allowed under Section 7 of the GNU
** Affero GPL version 3 and may not be removed by you.
**
** 0. Attribution Requirement.
**
** You must preserve all legal notices or author attributions in the covered
** work or Appropriate Legal Notices displayed by works containing the covered
** work. You may not remove from the covered work any author or developer
** credit already included within the covered work.
**
** 1. No License To Use Trademarks.
**
** This license does not grant any license or rights to use the trademarks
** Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
** of Golden Code Development Corporation. You are not authorized to use the
** name Golden Code, FWD, or the names of any author or contributor, for
** publicity purposes without written authorization.
**
** 2. No Misrepresentation of Affiliation.
**
** You may not represent yourself as Golden Code Development Corporation or FWD.
**
** You may not represent yourself for publicity purposes as associated with
** Golden Code Development Corporation, FWD, or any author or contributor to
** the covered work, without written authorization.
**
** 3. No Misrepresentation of Source or Origin.
**
** You may not represent the covered work as solely your work. All modified
** versions of the covered work must be marked in a reasonable way to make it
** clear that the modified work is not originating from Golden Code Development
** Corporation or FWD. All modified versions must contain the notices of
** attribution required in this license.
*/
package com.goldencode.p2j.persist.dirty;
import com.goldencode.p2j.directory.*;
import com.goldencode.p2j.util.*;
import com.goldencode.p2j.util.logging.*;
/**
* This class globally enables/disables the dirty share feature and optionally collects information about
* dirty share use in an application. The information collected can include table/DMO and index encountered
* for which a record search's results have been changed by dirty share information from the current or
* another session. It may optionally include the location (file and line number) in an application where
* such use was found. The more detailed the information collected, the higher the impact on the runtime
* performance of an application.
* <p>
* The logging level determines whether and how much information to collect:
* <ul>
* <li>INFO and higher: no information is collected;</li>
* <li>FINE: the table/DMO and index for which a record search was affected by a dirty read is reported;</li>
* <li>FINEST: additionally, the file and line number of application source code which led to the dirty
* read is reported</li>
* </ul>
* <p>
* The INFO level (or higher) is intended for production use. FINE may have an impact on performance and
* will have an impact on memory use. FINEST will likely have a noticeable impact on performance and will
* use more memory.
* <p>
* The collected information is aggregated and reported in the server log at server shutdown.
*/
public final class DirtyShareSupport
{
/** Logger */
private static final CentralLogger log = CentralLogger.get(DirtyShareSupport.class.getName());
/**
* {@code true} if cross-session dirty sharing is enabled.
*/
private static boolean enabledCrossSession = false;
/**
* {@code true} if dirty sharing within the same session is enabled.
*/
private static boolean enabledIntraSession = true;
/**
* Flag which overrides the absence of DMO dirty-read annotations to force dirty sharing across sessions.
*/
private static boolean forceCrossSession = false;
/**
* Flag which overrides the absence of DMO dirty-intra-read annotations to force dirty sharing within the
* same session.
*/
private static boolean forceIntraSession = true;
/**
* {@code true} if global notifications are enabled for cross-session dirty sharing.
*/
private static boolean globalNotifications = false;
/**
* Method called at server bootstrap that initializes values from the directory
* configuration. Until this method is called, default values are used.
*/
public static void bootstrap()
{
DirectoryService ds = DirectoryService.getInstance();
if (ds != null)
{
if (!ds.bind())
{
throw new RuntimeException("Directory bind failed");
}
try
{
// configure dirty sharing from the directory
enabledCrossSession = Utils.getDirectoryNodeBoolean(ds,
"persistence/dirty-cross-share", false, false);
enabledIntraSession = Utils.getDirectoryNodeBoolean(ds,
"persistence/dirty-intra-share", true, false);
forceCrossSession = Utils.getDirectoryNodeBoolean(ds,
"persistence/force-dirty-cross-share", false, false);
forceIntraSession = Utils.getDirectoryNodeBoolean(ds,
"persistence/force-dirty-intra-share", true, false);
globalNotifications = Utils.getDirectoryNodeBoolean(ds,
"persistence/dirty-share-global-notifications", false, false);
}
finally
{
ds.unbind();
}
}
}
/**
* Returns the value of the flag that indicates if cross-session dirty sharing is enabled.
*
* @return {@code true} if cross-session dirty sharing is enabled,
* {@code false} otherwise.
*/
public static boolean isEnabledCrossSession()
{
return enabledCrossSession;
}
/**
* Returns the value of the flag that indicates if dirty sharing within the same session is enabled.
*
* @return {@code true} if dirty sharing within the same session is enabled,
* {@code false} otherwise.
*/
public static boolean isEnabledIntraSession()
{
return enabledIntraSession;
}
/**
* Returns the value of the flag that indicates if dirty sharing is forced across sessions.
*
* @return {@code true} if dirty sharing is forced across sessions,
* {@code false} otherwise.
*/
public static boolean isForceCrossSession()
{
return forceCrossSession;
}
/**
* Returns the value of the flag that indicates if dirty sharing is forced within the same session.
*
* @return {@code true} if dirty sharing is forced within the same session,
* {@code false} otherwise.
*/
public static boolean isForceIntraSession()
{
return forceIntraSession;
}
/**
* Returns the value of the flag that indicates if global notifications are enabled for
* cross-session dirty sharing.
*
* @return {@code true} if global notifications are enabled for cross-session dirty sharing,
* {@code false} otherwise.
*/
public static boolean isGlobalNotificationEnabled()
{
return globalNotifications;
}
}